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 = ...@@ -329,7 +329,7 @@ const af_simple_descriptor_t sampleTestDesc =
zcl_basicAttr_t g_zcl_basicAttrs = zcl_basicAttr_t g_zcl_basicAttrs =
{ {
.zclVersion = 0x03, .zclVersion = 0x03,
.appVersion = 0x28, .appVersion = 0x29,
.stackVersion = 0x02, .stackVersion = 0x02,
.hwVersion = 0x20, .hwVersion = 0x20,
.manuName = ZCL_BASIC_MFG_NAME, .manuName = ZCL_BASIC_MFG_NAME,
......
...@@ -2,20 +2,61 @@ ...@@ -2,20 +2,61 @@
#define __IKONKE_ENDPOINT_CONFIG_H___ #define __IKONKE_ENDPOINT_CONFIG_H___
#include "types.h" #include "types.h"
/** /**
* @brief Defined for basic cluster attributes * @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_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 #define Support_Endpoint_Num 4
// Array of profile ids // Array of profile ids
#define FIXED_PROFILE_IDS { 260, 260, 260, 260 } #define FIXED_PROFILE_IDS { 260, 260, 260, 260 }
// Array of device ids // 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 } #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{ typedef struct{
u8 zclVersion; u8 zclVersion;
......
...@@ -101,7 +101,7 @@ extern "C" { ...@@ -101,7 +101,7 @@ extern "C" {
#endif #endif
#define ZCL_GROUP_SUPPORT 1 #define ZCL_GROUP_SUPPORT 1
#define ZCL_SCENE_SUPPORT 1 #define ZCL_SCENE_SUPPORT 1
#define ZCL_OTA_SUPPORT 1 #define ZCL_OTA_SUPPORT 0
#define ZCL_PRIVATE_CLUSTER_FCC0_SUPPORT 1 #define ZCL_PRIVATE_CLUSTER_FCC0_SUPPORT 1
#if TOUCHLINK_SUPPORT #if TOUCHLINK_SUPPORT
#define ZCL_ZLL_COMMISSIONING_SUPPORT 1 #define ZCL_ZLL_COMMISSIONING_SUPPORT 1
......
...@@ -2,12 +2,133 @@ ...@@ -2,12 +2,133 @@
#define __IKONKE_CONFIG_H___ #define __IKONKE_CONFIG_H___
#include "types.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 */ /*Dsp: product model id */
#define PRODUCT_MODEL "KK-PA-M10X" #define PRODUCT_MODEL "KK-LP-D84X"
/*Dsp: APP Version */ /*Dsp: APP Version */
#define FIRMWARE_VER 0x20 #define FIRMWARE_VER 0x29
/*Dsp: Stack Version */ /*Dsp: Stack Version */
#define STACK_VER 0x11 #define STACK_VER 0x11
...@@ -22,10 +143,10 @@ ...@@ -22,10 +143,10 @@
#define MODEL_ID 0x00068624 #define MODEL_ID 0x00068624
/*Dsp: OTA_IMAGE_TYPE */ /*Dsp: OTA_IMAGE_TYPE */
#define OTA_IMAGE_TYPE 65000 #define OTA_IMAGE_TYPE 65004
/*Dsp: OTA_FIRMVERSION */ /*Dsp: OTA_FIRMVERSION */
#define OTA_FIRMVERSION 0x20 #define OTA_FIRMVERSION 0x29
/*Dsp: MANUFATURE_CODE */ /*Dsp: MANUFATURE_CODE */
#define MANUFATURE_CODE 0x1268 #define MANUFATURE_CODE 0x1268
...@@ -36,9 +157,10 @@ ...@@ -36,9 +157,10 @@
#define MANUFACTURER_CODE_TELINK 0x1268 #define MANUFACTURER_CODE_TELINK 0x1268
#define IMAGE_TYPE 65000 #define IMAGE_TYPE 65004
#define FILE_VERSION 0x10 #define FILE_VERSION 0x10
#endif
#include "../common/comm_cfg.h" #include "../common/comm_cfg.h"
......
...@@ -9,11 +9,33 @@ ...@@ -9,11 +9,33 @@
#include "ikk-uart.h" #include "ikk-uart.h"
#include "ikk-relay.h" #include "ikk-relay.h"
#include "ikk-led.h" #include "ikk-led.h"
#include "ikk-ota.h" #include "ikk-network.h"
#include "ikk-command.h" #include "ikk-command.h"
#include "ikk-common-utils.h" #include "ikk-common-utils.h"
#include "ikk-interpan.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 ZERO_PIN GPIO_PA0
#define RELAY1_PIN GPIO_PC0 #define RELAY1_PIN GPIO_PC0
...@@ -43,8 +65,8 @@ ...@@ -43,8 +65,8 @@
#define HEART_RAND_MIN_NUM (240 * 1000) #define HEART_RAND_MIN_NUM (240 * 1000)
#define HEART_RAND_MAX_NUM (300 * 1000) #define HEART_RAND_MAX_NUM (300 * 1000)
#define LED_SLOW_BLINK_ON_TIME_MS 500 #define LED_SLOW_BLINK_ON_TIME_MS 800
#define LED_SLOW_BLINK_OFF_TIME_MS 500 #define LED_SLOW_BLINK_OFF_TIME_MS 800
#define LED_FAST_BLINK_ON_TIME_MS 200 #define LED_FAST_BLINK_ON_TIME_MS 200
#define LED_FAST_BLINK_OFF_TIME_MS 200 #define LED_FAST_BLINK_OFF_TIME_MS 200
...@@ -53,11 +75,8 @@ ...@@ -53,11 +75,8 @@
#define MIN_JOINED_NWK_DELAY_TIME_MS (7 * 1000) //重新上电后最短时间,用于判断是否随机延时10~40S上报心跳和CMEI和ISN #define MIN_JOINED_NWK_DELAY_TIME_MS (7 * 1000) //重新上电后最短时间,用于判断是否随机延时10~40S上报心跳和CMEI和ISN
#define RAND_MIN_NUM (3 * 1000) //最小随机数,单位MS #define REPORT_ATTR_MAX_RAND_NUM (5 * 1000) //场景下发控制后随机最大延时上报状态,状态改变后SDK会主动上报
#define RAND_MAX_NUM (6 * 1000) //最大随机数 #define REPORT_ATTR_MIN_RAND_NUM (2 * 1000) //场景下发控制后随机最小延时上报状态
#define REPORT_ATTR_MAX_RAND_NUM (7 * 1000) //场景下发控制后随机最大延时上报状态,状态改变后SDK会主动上报
#define REPORT_ATTR_MIN_RAND_NUM (2.5 * 1000) //场景下发控制后随机最小延时上报状态
#define CHECKED_ZERO_DELAY_ON_TIME_MS (6000)//因继电器会有延时,检测到零点后,按键开关或命令下发开关延时去开的时间, #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 ...@@ -86,28 +105,81 @@ typedef enum {RELAY_CHANNEL1_ID=1, RELAY_CHANNEL2_ID, RELAY_CHANNEL3_ID, RELAY_C
// BUTTONs CONFIG // BUTTONs CONFIG
BtnConfSt g_btnConfList[] = { BtnConfSt g_btnConfList[] = {
{KEY_SYS_ID, KEY_SYS_PIN, EBP_HIGH, false, true, SYS_BUTTON_LONG_PRESS_TIME_MS}, // Key1 {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 {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 {KEY2_ID, KEY2_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
{KEY3_ID, KEY3_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 {KEY4_ID, KEY4_PIN, EBP_HIGH, false, false, 0xffffffff}, // Key2
#endif
}; };
// LEDs CONFIG // LEDs CONFIG
LedConfSt g_ledConfList[] = { LedConfSt g_ledConfList[] = {
{(uint8_t)LED_RADAR_ID, 1, {LED_RADAR_PIN, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID, PIN_UNKNOW, PWM_UNKNOW_ID}, ELP_HIGH }, {(uint8_t)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)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)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)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)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 }, {(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[] = { 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}}, // {PWM1_ID, {LED1_PIN, KK_PWM_CC0}}, //
{PWM2_ID, {LED2_PIN, KK_PWM_CC1}}, // {PWM2_ID, {LED2_PIN, KK_PWM_CC1}}, //
{PWM3_ID, {LED3_PIN, KK_PWM_CC2}}, // {PWM3_ID, {LED3_PIN, KK_PWM_CC2}}, //
{PWM4_ID, {LED4_PIN, KK_PWM_CC3}}, // {PWM4_ID, {LED4_PIN, KK_PWM_CC3}}, //
#endif
}; };
// ZERO-ACCESS CONFIG // ZERO-ACCESS CONFIG
RelayChannelConfSt g_relayConfList[] = { 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 {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[] = { ...@@ -123,13 +195,31 @@ FactoryTestConfSt g_factoryTestConfList[] = {
{KEY1_ID, LONG_PRESS_1_TIMES, MECHANICAL_KEY_LONG_PRESS_TIME_MS}, {KEY1_ID, LONG_PRESS_1_TIMES, MECHANICAL_KEY_LONG_PRESS_TIME_MS},
}; };
BindObjSt cluster_obj_list[] = { 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, 1},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 2}, {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, 3},
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, 4}, {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); void pOnOffAttributeChangeCallback(uint8_t endpoint,uint16_t cluster,uint16_t attribute,uint8_t *data,uint8_t data_type);
AttributeChangeConfSt attribte_change_list[] = { AttributeChangeConfSt attribte_change_list[] = {
...@@ -138,6 +228,7 @@ AttributeChangeConfSt attribte_change_list[] = { ...@@ -138,6 +228,7 @@ AttributeChangeConfSt attribte_change_list[] = {
uint32_t u32PeroidIntervalMS = 2*1000; uint32_t u32PeroidIntervalMS = 2*1000;
bool Human_body_induction_flag = false; bool Human_body_induction_flag = false;
static bool power_on_sync[4] = {false,false,false,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_u8NoDisturbModeMinLevel = 0x01;
static uint8_t g_u8NoDisturbModeMaxLevel = 0x64; static uint8_t g_u8NoDisturbModeMaxLevel = 0x64;
...@@ -148,7 +239,7 @@ static uint8_t g_ucRelayIdBuff[] = {RELAY_CHANNEL1_ID, RELAY_CHANNEL2_ID, RELAY_ ...@@ -148,7 +239,7 @@ static uint8_t g_ucRelayIdBuff[] = {RELAY_CHANNEL1_ID, RELAY_CHANNEL2_ID, RELAY_
void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt ); void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt );
void kUserNetworkStatusNotify(NwkStatusEnum nwkst ); void kUserNetworkStatusNotify(NwkStatusEnum nwkst );
void kUserNetworkExitCompleteCallback(void); 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 ); 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 ); void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action );
...@@ -162,18 +253,17 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status); ...@@ -162,18 +253,17 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status);
void kOTAMoudleUserCallback(OTAStatusEnum status); void kOTAMoudleUserCallback(OTAStatusEnum status);
#endif #endif
#define UART_ENABLE false #define UART_ENABLE true
void kUserRelayLedCallback(RelayStatusSt status); void kUserRelayLedCallback(RelayStatusSt status);
void kRadarDetectInit(void); void kRadarDetectInit(void);
void kRadarLedTragger(void); void kRadarLedTragger(void);
static void kSetLedStatus(LED_ID_ENUM id); void kSetLedStatus(LED_ID_ENUM id);
#if UART_ENABLE #if UART_ENABLE
void UartMsgProcessHandle(UMsgNodeSt *pMsgNode); void UartMsgProcessHandle(UMsgNodeSt *pMsgNode);
bool MsgCRC16(uint8_t *pdat, int length ); bool MsgCRC16(uint8_t *pdat, int length );
uint16_t check_sum( uint8_t* msg, uint8_t len); uint16_t check_sum( uint8_t* msg, uint8_t len);
uint8_t uart_send(void); uint8_t uart_send(void);
#endif #endif
void Test(void );
static ev_timer_event_t *kkSystemSetUpEvent = NULL; static ev_timer_event_t *kkSystemSetUpEvent = NULL;
s32 kkSystemSetUpEventHandler(void *arg ); s32 kkSystemSetUpEventHandler(void *arg );
...@@ -184,17 +274,13 @@ AttributeChangeConfSt g_ClusterAttributeConfList[] = { ...@@ -184,17 +274,13 @@ AttributeChangeConfSt g_ClusterAttributeConfList[] = {
{ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF, pOnOffClusterAttributeChangeCallback}, {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 kLEDOnAction(LED_ID_ENUM led_id);
static void kLEDOffAction(LED_ID_ENUM led_id); static void kLEDOffAction(LED_ID_ENUM led_id);
void App_Init(void) void App_Init(void)
{ {
iKonkeAfSelfPrint("\r\n************************************************\r\n"); iKonkeAfSelfPrint("\r\n************************************************\r\n");
iKonkeAfSelfPrint("\r\n****************APP Init***********************\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"); iKonkeAfSelfPrint("\r\n************************************************\r\n");
#if 1 #if 1
kk_err_t err = kBtnModuleInit(g_btnConfList, sizeof(g_btnConfList) / sizeof(BtnConfSt), kUserButtonAcitonCallback); kk_err_t err = kBtnModuleInit(g_btnConfList, sizeof(g_btnConfList) / sizeof(BtnConfSt), kUserButtonAcitonCallback);
...@@ -215,7 +301,7 @@ void App_Init(void) ...@@ -215,7 +301,7 @@ void App_Init(void)
err = kRelayModuleInit(ZERO_PIN, CHECKED_ZERO_DELAY_ON_TIME_MS, CHECKED_ZERO_DELAY_OFF_TIME_MS \ 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); , EZAP_LOW, g_relayConfList, sizeof(g_relayConfList)/sizeof(RelayChannelConfSt), kUserRelayLedCallback);
if( err != KET_OK ) { 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 #if UART_ENABLE
uint8_t recv_header[] = {0xAA,0X55}; uint8_t recv_header[] = {0xAA,0X55};
...@@ -223,12 +309,14 @@ void App_Init(void) ...@@ -223,12 +309,14 @@ void App_Init(void)
#endif #endif
kNwkModuleInit(cluster_obj_list,sizeof(cluster_obj_list) / sizeof(cluster_obj_list[0]), kUserNetworkStatusNotify, kUserNetworkExitCompleteCallback); 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 #if Z30_DEVICE_OTA_ENABLE
kOTAMoudleInit(kOTAMoudleUserCallback, LED_ALL_ID); kOTAMoudleInit(kOTAMoudleUserCallback, LED_ALL_ID);
#endif #endif
#if Z30_DEVICE_AGING_ENABLE #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 #endif
// init the private cluster protocol module. // init the private cluster protocol module.
err = kOptTunnelModuleInit(kUserOODMessageIncoming); err = kOptTunnelModuleInit(kUserOODMessageIncoming);
...@@ -245,17 +333,27 @@ void App_Init(void) ...@@ -245,17 +333,27 @@ void App_Init(void)
kRadarDetectInit(); kRadarDetectInit();
kZclClusterPermitReportTableInit(cluster_obj_list, sizeof(cluster_obj_list) / sizeof(BindObjSt)); kZclClusterPermitReportTableInit(cluster_obj_list, sizeof(cluster_obj_list) / sizeof(BindObjSt));
kOptTunnelTrytoWriteInstallCode();
} }
void Test(void )
{
}
void kUserNetworkExitCompleteCallback() 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) static bool kClustePeriodReportCheckIsSet(uint8_t endpoint)
{ {
...@@ -278,12 +376,12 @@ void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt ) ...@@ -278,12 +376,12 @@ void JoinCompleteCallback(NwkJoinCompltEnum nwkcomplt )
switch(nwkcomplt) { switch(nwkcomplt) {
case (EJC_JOIN_FAILED ): case (EJC_JOIN_FAILED ):
{ {
LED_OPT_OFF(LED_ALL_ID); kSetLedStatus(LED_ALL_ID);
kUserNetworkExitCompleteCallback();
break; break;
} }
case (EJC_JOIN_SUCCEED): case (EJC_JOIN_SUCCEED):
{ {
break; break;
} }
default: break; default: break;
...@@ -304,17 +402,35 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst ) ...@@ -304,17 +402,35 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
if ( currentTimeMS < MIN_JOINED_NWK_DELAY_TIME_MS){ if ( currentTimeMS < MIN_JOINED_NWK_DELAY_TIME_MS){
randTimeMS = kGetRandNum(RAND_MIN_NUM, RAND_MAX_NUM); randTimeMS = kGetRandNum(RAND_MIN_NUM, RAND_MAX_NUM);
}else { }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(PWM4_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM3_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(PWM2_ID, PWM_TIMER_MAX_DUTY_CYCLE_NUM, 0, 5*1000);
kPwmOptTrigger(PWM1_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){ if (kIsKonkeRemoteGateway() != true){
g_bIsNotKonkeGatewayFirstReportedFlg = false; g_bIsNotKonkeGatewayFirstReportedFlg = false;
kNwkScheduleTaskRegister(randTimeMS);
} }
kNwkScheduleTaskRegister(randTimeMS);
iKonkeAfSelfPrint("Joined Network RandTime(%dms) CurrentTime(%d)\r\n", randTimeMS, currentTimeMS); iKonkeAfSelfPrint("Joined Network RandTime(%dms) CurrentTime(%d)\r\n", randTimeMS, currentTimeMS);
break; break;
} }
...@@ -328,7 +444,7 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst ) ...@@ -328,7 +444,7 @@ void kUserNetworkStatusNotify(NwkStatusEnum nwkst )
{ {
iKonkeAfSelfPrint("#####Enter Leave\r\n"); iKonkeAfSelfPrint("#####Enter Leave\r\n");
kLedOptTrigger((uint8_t)LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS \ 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); kSetIndicatorNotDisturbModeFlg(false);
...@@ -386,9 +502,10 @@ uint8_t Key_Press_Test_Flag[5] = {0}; ...@@ -386,9 +502,10 @@ uint8_t Key_Press_Test_Flag[5] = {0};
void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{ {
iKonkeAfSelfPrint("kUserButton: ButtonId(%d), Action(%d),%d\r\n", button_id, action,kGetFactoryTestStatus()); iKonkeAfSelfPrint("kUserButton: ButtonId(%d), Action(%d),%d\r\n", button_id, action,kGetFactoryTestStatus());
kOptTunneCheckNodeIdIsChangedReport();
if ( kGetFactoryTestStatus() == FTS_AGING_4HOU || kGetFactoryTestStatus() == FTS_AGING_DONE \ if ( kGetFactoryTestStatus() == FTS_AGING_4HOU || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS \ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS \
|| kNwkIsExiting() == true){ || kNwkIsExiting() == true){
//未老化完成,单击按键不操作继电器 //未老化完成,单击按键不操作继电器
return; return;
...@@ -401,17 +518,29 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -401,17 +518,29 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{ {
case EBA_CLICK: 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; 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) 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); 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) else if(kNwkGetCurrentStatus() == ENS_LEAVED)
{ {
kNwkFactoryReset(false); if(kGetFactoryTestStatus() == FTS_SINGLE_BOARD_TEST){
kNwkJoiningStart(NWK_STEERING_TIMEOUT_MS,JoinCompleteCallback); //开启组网 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; break;
...@@ -419,6 +548,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -419,6 +548,10 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
{ {
if(kNwkGetCurrentStatus() == ENS_ONLINE) if(kNwkGetCurrentStatus() == ENS_ONLINE)
{ {
if(kGetInterpanEnableFlg() == true){
iKonkeAfSelfPrint("Close Interpan...........\r\n");
kInterpanDisable();
}
kNwkFactoryReset(true); kNwkFactoryReset(true);
iKonkeAfSelfPrint("Start Leave...........\r\n"); iKonkeAfSelfPrint("Start Leave...........\r\n");
} }
...@@ -436,7 +569,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -436,7 +569,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
iKonkeAfSelfPrint("KEY 1 PRESS!!!\r\n"); iKonkeAfSelfPrint("KEY 1 PRESS!!!\r\n");
Key_Press_Test_Flag[1] = 1; Key_Press_Test_Flag[1] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(1)? EOOC_OFF : EOOC_ON; 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(); //afTest_dataSendDemo();
kZclOnOffClusterServerOnOffControl(1, state); kZclOnOffClusterServerOnOffControl(1, state);
}else if (action == EBA_LONGPRESS){ }else if (action == EBA_LONGPRESS){
...@@ -445,6 +578,15 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -445,6 +578,15 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
return; 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; static bool firstLongPressFlg = false;
if (kNwkGetCurrentStatus() == ENS_ONLINE){ if (kNwkGetCurrentStatus() == ENS_ONLINE){
static uint32_t lastTimeMS = 0; static uint32_t lastTimeMS = 0;
...@@ -453,9 +595,9 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -453,9 +595,9 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
|| (currentTimeMS - lastTimeMS >= MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS)){ || (currentTimeMS - lastTimeMS >= MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS)){
firstLongPressFlg = true; firstLongPressFlg = true;
lastTimeMS = currentTimeMS; 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); kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_OFF);
} /*}*/
}else { }else {
//second times long press //second times long press
if (currentTimeMS - lastTimeMS < MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS){ if (currentTimeMS - lastTimeMS < MAX_FIRST_USER_KEY_LEAVE_NWK_INTERVAL_TIME_MS){
...@@ -485,7 +627,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -485,7 +627,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
iKonkeAfSelfPrint("KEY 2 PRESS!!!\r\n"); iKonkeAfSelfPrint("KEY 2 PRESS!!!\r\n");
Key_Press_Test_Flag[2] = 1; Key_Press_Test_Flag[2] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(2)? EOOC_OFF : EOOC_ON; 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); kZclOnOffClusterServerOnOffControl(2, state);
} }
break; break;
...@@ -497,7 +639,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -497,7 +639,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
iKonkeAfSelfPrint("KEY 3 PRESS!!!\r\n"); iKonkeAfSelfPrint("KEY 3 PRESS!!!\r\n");
Key_Press_Test_Flag[3] = 1; Key_Press_Test_Flag[3] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(3)? EOOC_OFF : EOOC_ON; 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); kZclOnOffClusterServerOnOffControl(3, state);
} }
break; break;
...@@ -509,7 +651,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action ) ...@@ -509,7 +651,7 @@ void kUserButtonAcitonCallback(unsigned char button_id, BtnActionEnum action )
iKonkeAfSelfPrint("KEY 4 PRESS!!!\r\n"); iKonkeAfSelfPrint("KEY 4 PRESS!!!\r\n");
Key_Press_Test_Flag[4] = 1; Key_Press_Test_Flag[4] = 1;
OnOffCtrlEnum state = kZclOnOffClusterServerOnOffGet(4)? EOOC_OFF : EOOC_ON; 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); kZclOnOffClusterServerOnOffControl(4, state);
} }
break; break;
...@@ -523,9 +665,14 @@ void kUserRelayLedCallback(RelayStatusSt status) ...@@ -523,9 +665,14 @@ void kUserRelayLedCallback(RelayStatusSt status)
{ {
iKonkeAfSelfPrint("#########kUserZaLedCallback channel(%d) opt(%d)\r\n", status.u8RelayChannelId, status.opt); 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) || 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; return;
} }
...@@ -535,8 +682,8 @@ void kUserRelayLedCallback(RelayStatusSt status) ...@@ -535,8 +682,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[0] == true \ if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[0] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \ || kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[0] = false; power_on_sync[0] = false;
if (status.opt == EZAO_OFF){ if (status.opt == EZAO_OFF){
kLEDOffAction(LED1_ID); kLEDOffAction(LED1_ID);
...@@ -557,8 +704,8 @@ void kUserRelayLedCallback(RelayStatusSt status) ...@@ -557,8 +704,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[1] == true \ if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[1] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \ || kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[1] = false; power_on_sync[1] = false;
if (status.opt == EZAO_OFF){ if (status.opt == EZAO_OFF){
kLEDOffAction(LED2_ID); kLEDOffAction(LED2_ID);
...@@ -579,8 +726,8 @@ void kUserRelayLedCallback(RelayStatusSt status) ...@@ -579,8 +726,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[2] == true \ if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[2] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \ || kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[2] = false; power_on_sync[2] = false;
if (status.opt == EZAO_OFF){ if (status.opt == EZAO_OFF){
kLEDOffAction(LED3_ID); kLEDOffAction(LED3_ID);
...@@ -601,8 +748,8 @@ void kUserRelayLedCallback(RelayStatusSt status) ...@@ -601,8 +748,8 @@ void kUserRelayLedCallback(RelayStatusSt status)
if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[3] == true \ if (kNwkGetCurrentStatus() == ENS_ONLINE || power_on_sync[3] == true \
|| kGetFactoryTestStatus() == FTS_AGING_4HOU \ || kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
power_on_sync[3] = false; power_on_sync[3] = false;
if (status.opt == EZAO_OFF){ if (status.opt == EZAO_OFF){
kLEDOffAction(LED4_ID); kLEDOffAction(LED4_ID);
...@@ -648,7 +795,7 @@ void kUserPwmActionDoneCallback(unsigned char id, PwmGradientDirectionEnum opt) ...@@ -648,7 +795,7 @@ void kUserPwmActionDoneCallback(unsigned char id, PwmGradientDirectionEnum opt)
} }
//ota升级失败或入网成功和失败后LED闪烁完成后处理,需要根据不同产品来修改 //ota升级失败或入网成功和失败后LED闪烁完成后处理,需要根据不同产品来修改
static void kSetLedStatus(LED_ID_ENUM id) void kSetLedStatus(LED_ID_ENUM id)
{ {
if (id != LED_ALL_ID){ if (id != LED_ALL_ID){
kPwmClearGradientCounterById(id - 1); kPwmClearGradientCounterById(id - 1);
...@@ -661,6 +808,7 @@ static void kSetLedStatus(LED_ID_ENUM id) ...@@ -661,6 +808,7 @@ static void kSetLedStatus(LED_ID_ENUM id)
//恢复继电器的LED状态 //恢复继电器的LED状态
if (id == LED_ALL_ID) if (id == LED_ALL_ID)
{ {
iKonkeAfSelfPrint("##########kSetLedStatus LED_ALL_ID111111111111111111\r\n");
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE); kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE);
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){ for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
if (kLedIsBlinking(GET_LED_ID_BY_ENDPOINT(i, Support_Endpoint_Num)) == false){ if (kLedIsBlinking(GET_LED_ID_BY_ENDPOINT(i, Support_Endpoint_Num)) == false){
...@@ -692,13 +840,11 @@ s32 kUserScheduleTaskHandler(void *arg) ...@@ -692,13 +840,11 @@ s32 kUserScheduleTaskHandler(void *arg)
}else { }else {
if (cluster_obj_list[0].cluster != CLUSTER_UNKNOW){ if (cluster_obj_list[0].cluster != CLUSTER_UNKNOW){
if (cluster_obj_list[0].cluster == ZCL_CLUSTER_GEN_POWER_CFG){ if (cluster_obj_list[0].cluster == ZCL_CLUSTER_GEN_POWER_CFG){
//kBatteryMonitorReadADC(true);
}else { }else {
//add by maozj 20200512 report on off status
if ((g_bIsNotKonkeGatewayFirstReportedFlg )&& kClustePeriodReportCheckIsSet(g_u8CurrentHeartEndpoint)== true){ if ((g_bIsNotKonkeGatewayFirstReportedFlg )&& kClustePeriodReportCheckIsSet(g_u8CurrentHeartEndpoint)== true){
//网关设置过report interval,使用SDK的report //网关设置过report interval,使用SDK的report
//kNwkScheduleTaskStop(SCHEDULE_ALLOPT_ID);
}else { }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); kOptTunnelReportingPlagiarizeOriginal(g_u8CurrentHeartEndpoint, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
} }
} }
...@@ -719,23 +865,23 @@ s32 kUserScheduleTaskHandler(void *arg) ...@@ -719,23 +865,23 @@ s32 kUserScheduleTaskHandler(void *arg)
//LED闪烁完成,可以用来恢复继电器的LED状态 //LED闪烁完成,可以用来恢复继电器的LED状态
void kUserLedActionDoneCallback(unsigned char id) 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); kSetLedStatus(id);
} }
//网关场景控制下发后的属性延时上报处理,可以根据不同场景cluster修改 //网关场景控制下发后的属性延时上报处理,可以根据不同场景cluster修改
/* DESP: recall scene rand delay report Attribute set /* DESP: recall scene rand delay report Attribute set
* Auth: maozj.20191224. * 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"); 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)) 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 *kEndpoint1DelayReport = NULL;
static ev_timer_event_t *kEndpoint2DelayReport = NULL; static ev_timer_event_t *kEndpoint2DelayReport = NULL;
static ev_timer_event_t *kEndpoint3DelayReport = NULL; static ev_timer_event_t *kEndpoint3DelayReport = NULL;
...@@ -743,28 +889,28 @@ static ev_timer_event_t *kEndpoint4DelayReport = NULL; ...@@ -743,28 +889,28 @@ static ev_timer_event_t *kEndpoint4DelayReport = NULL;
static s32 kEndpoint1DelayReportAttrEventHandler(void *arg) static s32 kEndpoint1DelayReportAttrEventHandler(void *arg)
{ {
iKonkeAfSelfPrint("######kEndpoint1DelayReportAttrEventHandler\r\n" ); 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); kOptTunnelReportingPlagiarizeOriginal(1, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1; return -1;
} }
static s32 kEndpoint2DelayReportAttrEventHandler(void *arg) static s32 kEndpoint2DelayReportAttrEventHandler(void *arg)
{ {
iKonkeAfSelfPrint("######kEndpoint2DelayReportAttrEventHandler\r\n" ); 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); kOptTunnelReportingPlagiarizeOriginal(2, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1; return -1;
} }
static s32 kEndpoint3DelayReportAttrEventHandler(void *arg) static s32 kEndpoint3DelayReportAttrEventHandler(void *arg)
{ {
iKonkeAfSelfPrint("######kEndpoint3DelayReportAttrEventHandler\r\n" ); 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); kOptTunnelReportingPlagiarizeOriginal(3, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1; return -1;
} }
static s32 kEndpoint4DelayReportAttrEventHandler(void *arg) static s32 kEndpoint4DelayReportAttrEventHandler(void *arg)
{ {
iKonkeAfSelfPrint("######kEndpoint4DelayReportAttrEventHandler\r\n" ); 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); kOptTunnelReportingPlagiarizeOriginal(4, ZCL_CLUSTER_GEN_ON_OFF, ZCL_ATTRID_ONOFF);
return -1; return -1;
} }
...@@ -776,8 +922,9 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1 ...@@ -776,8 +922,9 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
{ {
ZclReportTableSt zclReportInfo; ZclReportTableSt zclReportInfo;
bool status = kZclClusterGetPermitReportInfo(endpoint,clusterId,&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 ); status, endpoint, zclReportInfo.reportEnable, zclReportInfo.sceneRecallFlg );
//不直接上报,随机延时上报
if (status == true){ if (status == true){
if (zclReportInfo.reportEnable != true && zclReportInfo.sceneRecallFlg == true){ if (zclReportInfo.reportEnable != true && zclReportInfo.sceneRecallFlg == true){
uint32_t randDelayTimeMS = kGetRandNum(REPORT_ATTR_MIN_RAND_NUM, REPORT_ATTR_MAX_RAND_NUM); 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 ...@@ -796,17 +943,9 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
} }
else if (endpoint == 4){ else if (endpoint == 4){
if(!ev_timer_exist(kEndpoint4DelayReport)) { 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; return false;
} }
else if(!zclReportInfo.reportEnable) else if(!zclReportInfo.reportEnable)
...@@ -814,10 +953,11 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1 ...@@ -814,10 +953,11 @@ bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint1
return false; return false;
} }
} }
iKonkeAfSelfPrint("reporting disable11111111111111111111111111111111\r\n");
return true; 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 ) 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 ) { 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 ...@@ -831,59 +971,224 @@ kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_i
iKonkeAfSelfPrint("--------------------------------------\r\n"); iKonkeAfSelfPrint("--------------------------------------\r\n");
switch(opcode) { 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[0] = 0x00;
args_in_out[1] = kZclOnOffClusterServerOnOffGet(1); args_in_out[1] = channelValue1;
args_in_out[2] = kZclOnOffClusterServerOnOffGet(2); args_in_out[2] = channelValue2;
args_in_out[3] = kZclOnOffClusterServerOnOffGet(3); args_in_out[3] = channelValue3;
args_in_out[4] = kZclOnOffClusterServerOnOffGet(4); #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(); 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; *length_in_out = 6;
break; #endif
} }else if (command == 0x01){
case (0xFE): args_in_out[0] = ERR_NO_NONE;
{ #ifndef FOUR_LIGHT_PANEL
//set disturb mode OnOffCtrlEnum onoffctrl[3] = {0};
uint8_t mode = args_in_out[0]; onoffctrl[0] = args_in_out[1];
if (mode != 0x00 && mode != 0x01){ 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; 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//// ////State Sync////
if (kLedIsBlinking(LED_ALL_ID) != true) { if (kLedIsBlinking(LED_ALL_ID) != true) {
kSetLedStatus(LED_ALL_ID); 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; 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); }else {
args_in_out[1] = mode; args_in_out[0] = ERR_NO_COMMAND_FORMAT;
*length_in_out = 2;
break;
} }
case (0xFF):
{ args_in_out[1] = onOffStatus;//下发命令
uint8_t permitJoinTimeS = args_in_out[0]; //unit:s *length_in_out = 2;
iKonkeAfSelfPrint("###Opcode is channel(%d) JoinPermitTime(0x%X)!!\r\n",channel, permitJoinTimeS); //iKonkeAfSelfPrintln("2.retStatus[%d], channel[%d], onoff[%d]",retStatus, channelID, onOffStatus);
//路由协同组网,黄灯闪烁(OTA升级)时不协同组网闪灯 break;
if (kLedIsBlinking(LED_ALL_ID) != true }
&& permitJoinTimeS != 0 case (0xE4):
&& kNwkGetCurrentStatus() != ENS_JOINING){ {
iKonkeAfSelfPrint("####LED Blink\r\n"); uint8_t u8NetworkSteering_ch = args_in_out[0];
kLedOptTrigger(LED_ALL_ID, LED_SLOW_BLINK_ON_TIME_MS, LED_SLOW_BLINK_OFF_TIME_MS, uint16_t u16NetworkSteering_panid = ((uint16_t)args_in_out[1] << 8) | ((uint16_t)args_in_out[2]);
permitJoinTimeS * 1000/(LED_SLOW_BLINK_ON_TIME_MS+LED_SLOW_BLINK_OFF_TIME_MS), LED_ON, LED_OFF);
}else if (kLedIsBlinking(LED2_ID) == true kSetNetworkSteeringInfo(u8NetworkSteering_ch, u16NetworkSteering_panid);
&& permitJoinTimeS == 0 args_in_out[1] = u8NetworkSteering_ch;
&& kNwkGetCurrentStatus() != ENS_JOINING){ args_in_out[2] = (uint8_t)(u16NetworkSteering_panid >> 8);
kLedOptTrigger(LED_ALL_ID, 0, 0, 0, LED_OFF, LED_IGNORE); args_in_out[3] = (uint8_t)(u16NetworkSteering_panid);
// kLEDOffAction(LED_ALL_ID);
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); 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: { default: {
iKonkeAfSelfPrint("Err: opcode is not exist(%d:%X)!!\r\n", channel, opcode); iKonkeAfSelfPrint("Err: opcode is not exist(%d:%X)!!\r\n", channel, opcode);
args_in_out[0] = ERR_NO_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 ...@@ -895,13 +1200,30 @@ kk_err_t kUserOODMessageIncoming(uint8_t channel, uint8_t opcode, uint8_t args_i
return KET_OK; 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) static void kLEDOffAction(LED_ID_ENUM led_id)
{ {
iKonkeAfSelfPrint("LED_Off_Action LED_ID (%d).\r\n", led_id); iKonkeAfSelfPrint("LED_Off_Action LED_ID (%d).\r\n", led_id);
kLedOptTrigger(led_id, 0, 0, 0, LED_OFF, LED_IGNORE); kLedOptTrigger(led_id, 0, 0, 0, LED_OFF, LED_IGNORE);
if (kGetIndicatorNotDisturbModeFlg() == false){ if (kGetIndicatorNotDisturbModeFlg() == false){
iKonkeAfSelfPrint("is not NotDisturbMode.\r\n"); //iKonkeAfSelfPrint("is not NotDisturbMode.\r\n");
switch (led_id) switch (led_id)
{ {
case LED1_ID: case LED1_ID:
...@@ -926,10 +1248,27 @@ static void kLEDOffAction(LED_ID_ENUM led_id) ...@@ -926,10 +1248,27 @@ static void kLEDOffAction(LED_ID_ENUM led_id)
} }
case LED_ALL_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(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(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(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)); kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMinLevel * 65535) / 100));
#endif
break; break;
} }
default: default:
...@@ -968,10 +1307,27 @@ static void kLEDOnAction(LED_ID_ENUM led_id) ...@@ -968,10 +1307,27 @@ static void kLEDOnAction(LED_ID_ENUM led_id)
} }
case LED_ALL_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(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(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(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) ); kPwmDriverhandler(kPwmGetIndexByID(PWM4_ID), ELP_ANY, (uint16_t)(((uint32_t)g_u8NoDisturbModeMaxLevel * 65535) / 100) );
#endif
break; break;
} }
default: default:
...@@ -991,13 +1347,13 @@ s32 kkSystemSetUpEventHandler(void *arg ) ...@@ -991,13 +1347,13 @@ s32 kkSystemSetUpEventHandler(void *arg )
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){ for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
if(st == NV_SUCC) if(st == NV_SUCC)
{ {
relayStatusBuffer[i-1] = g_zcl_onOffAttrs[i-1].onOff; relayStatusBuffer[i-1] = false;
} }
power_on_sync[i - 1] = true; power_on_sync[i - 1] = true;
iKonkeAfSelfPrint("###########EP(%d), status(%d)\r\n", i, relayStatusBuffer[i-1]); 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]); 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)) \ 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); ,relayStatusBuffer[i-1] == false? EZAO_OFF : EZAO_ON);
...@@ -1008,6 +1364,14 @@ s32 kkSystemSetUpEventHandler(void *arg ) ...@@ -1008,6 +1364,14 @@ s32 kkSystemSetUpEventHandler(void *arg )
#if UART_ENABLE #if UART_ENABLE
kInterPanMoudleInit(kUserInterPanMsgInComingPaser); kInterPanMoudleInit(kUserInterPanMsgInComingPaser);
#endif #endif
addrExt_t addr1;
zb_getLocalExtAddr(addr1);
SWAP_EUI64((uint8_t *)addr1);//取反
iKonkeAfSelfPrint("mac1 :\r\n");
iKonkeAfSelfPrintBuffer(addr1,8);
return -1; return -1;
} }
...@@ -1015,14 +1379,13 @@ s32 kkSystemSetUpEventHandler(void *arg ) ...@@ -1015,14 +1379,13 @@ s32 kkSystemSetUpEventHandler(void *arg )
//老化的轮询回调函数,一般用于实现老化期间的LED闪烁或继电器翻转,也可以只LED闪烁 //老化的轮询回调函数,一般用于实现老化期间的LED闪烁或继电器翻转,也可以只LED闪烁
void kUserFactorTestPollCallback(FactoryTestStatusEnum status) void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
{ {
iKonkeAfSelfPrint("##############kUserFactorTestPollCallback status(%d)##################\r\n", status); //iKonkeAfSelfPrint("##############kUserFactorTestPollCallback status(%d)##################\r\n", status);
static RelayOptEnum eRelayStatus = EZAO_OFF; static RelayOptEnum eRelayStatus = EZAO_OFF;
switch(status) switch(status)
{ {
case FTS_NORMAL: case FTS_NORMAL:
break; break;
case FTS_START: case FTS_START:
//没有老化完需先都清除网络
break; break;
case FTS_AGING_15MIN: case FTS_AGING_15MIN:
break; break;
...@@ -1030,6 +1393,10 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status) ...@@ -1030,6 +1393,10 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//关闭所有的蓝色LED,有可能之前蓝灯闪烁了 //关闭所有的蓝色LED,有可能之前蓝灯闪烁了
LED_OPT_OFF(LED_ALL_ID); LED_OPT_OFF(LED_ALL_ID);
LED_OPT_OFF(LED_RADAR_ID); LED_OPT_OFF(LED_RADAR_ID);
if(zb_isDeviceJoinedNwk())
zb_factoryReset();
else if(kInterPanGetEnableStatus())
kInterpanDisable();
//同步所有的LED和继电器 //同步所有的LED和继电器
for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){ for (uint8_t i = 1; i <= Support_Endpoint_Num; i++){
kRelayChannelOpt(g_ucRelayIdBuff[i-1], EZAO_OFF); kRelayChannelOpt(g_ucRelayIdBuff[i-1], EZAO_OFF);
...@@ -1058,22 +1425,22 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status) ...@@ -1058,22 +1425,22 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//如果有单独系统LED也需要都点亮 //如果有单独系统LED也需要都点亮
// LED_OPT_ON(LED_SYS_ID); // LED_OPT_ON(LED_SYS_ID);
break; break;
case FTS_AGING_FORCE_EXIT: case FTS_FORCE_EXIT:
iKonkeAfSelfPrint("############## FactoryTestSatus is FTS_AGING_FORCE_EXIT\r\n"); 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); kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, BLINK_DEAD, LED_ON, LED_IGNORE);
break; break;
case FTS_AGING_WAITING: case FTS_WAITING_RELEASED:
break; 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); kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_OFF_TIME_MS, 1, LED_ON, LED_IGNORE);
break; break;
case FTS_AGING_FORCE_REBOOT: case FTS_FORCE_REBOOT:
SYSTEM_RESET(); SYSTEM_RESET();
break; break;
default: default:
iKonkeAfSelfPrint("##############Erro: FactoryTestSatus is not exist\r\n"); //iKonkeAfSelfPrint("##############Erro: FactoryTestSatus is not exist\r\n");
break; break;
} }
} }
...@@ -1083,7 +1450,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status) ...@@ -1083,7 +1450,7 @@ void kUserFactorTestPollCallback(FactoryTestStatusEnum status)
//如果初始化OTA增加callback这里处理,否则使用ota模块的默认callback,就不在这里 //如果初始化OTA增加callback这里处理,否则使用ota模块的默认callback,就不在这里
void kOTAMoudleUserCallback(OTAStatusEnum status) void kOTAMoudleUserCallback(OTAStatusEnum status)
{ {
#if 0 #if 1
static bool flg = false; //防止网关断电后,ota失败后会间隔快闪 static bool flg = false; //防止网关断电后,ota失败后会间隔快闪
iKonkeAfSelfPrint("##############kOTAMoudleUserCallback status(%d)##################\r\n", status); iKonkeAfSelfPrint("##############kOTAMoudleUserCallback status(%d)##################\r\n", status);
switch(status) switch(status)
...@@ -1091,8 +1458,6 @@ void kOTAMoudleUserCallback(OTAStatusEnum status) ...@@ -1091,8 +1458,6 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
case OTA_NORMAL: case OTA_NORMAL:
break; break;
case OTA_START: 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,\ 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); 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); kSetOTAStatus(OTA_START);
...@@ -1100,19 +1465,12 @@ void kOTAMoudleUserCallback(OTAStatusEnum status) ...@@ -1100,19 +1465,12 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
break; break;
case OTA_DOWNLOAD_DONE: 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); kSetOTAStatus(OTA_DOWNLOAD_DONE);
break; break;
} }
case OTA_VERITY_SUCCEED: case OTA_VERITY_SUCCEED:
{ {
//校验成功,记录继电器状态,需要复位后恢复继电器状态 //校验成功,记录继电器状态,需要复位后恢复继电器状态
//saveRelayStatusWhenOtaSucceed(relayTotalNum);
//uint8_t relayStatus = 1;
//halCommonSetToken(TOKEN_OTA_RELAY_STATUS, &relayStatus);
//常亮5S //常亮5S
kLedOptTrigger(LED_ALL_ID, 25 * LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_ON_TIME_MS, 1, LED_ON, LED_ON); 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); kSetOTAStatus(OTA_NORMAL);
...@@ -1121,14 +1479,9 @@ void kOTAMoudleUserCallback(OTAStatusEnum status) ...@@ -1121,14 +1479,9 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
case OTA_FAILED: case OTA_FAILED:
{ {
if (flg != true){ if (flg != true){
halInternalWatchDogEnabled(); //使能看门狗
emberAfOtaStorageClearTempDataCallback();
kLedOptTrigger(LED_ALL_ID, LED_FAST_BLINK_ON_TIME_MS, LED_FAST_BLINK_ON_TIME_MS,\ 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); 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); kSetOTAStatus(OTA_NORMAL);
//uint8_t status = 0;
//halCommonSetToken(TOKEN_OTA_RELAY_STATUS, &status);
//emAfOtaClientStop(); //刚加上, 未测试,防止网关断电后,一直request 5分钟
} }
flg = true; flg = true;
break; break;
...@@ -1137,20 +1490,19 @@ void kOTAMoudleUserCallback(OTAStatusEnum status) ...@@ -1137,20 +1490,19 @@ void kOTAMoudleUserCallback(OTAStatusEnum status)
iKonkeAfSelfPrint("##############Err: OTA status is not exist\r\n"); iKonkeAfSelfPrint("##############Err: OTA status is not exist\r\n");
break; break;
} }
#endif #endif
} }
#endif #endif
static ev_timer_event_t *kRadarCheckEventControl = NULL; static ev_timer_event_t *kRadarCheckEventControl = NULL;
static ev_timer_event_t *kRadarControlLedEvent = NULL; static ev_timer_event_t *kRadarControlLedEvent = NULL;
s32 kRadarCheckEventHandler(void *arg) s32 kRadarCheckEventHandler(void *arg)
{ {
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \ if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
return 0; return 0;
} }
...@@ -1174,13 +1526,28 @@ s32 kRadarLedEventHandler(void *arg) ...@@ -1174,13 +1526,28 @@ s32 kRadarLedEventHandler(void *arg)
{ {
if (kGetFactoryTestStatus() == FTS_AGING_4HOU \ if (kGetFactoryTestStatus() == FTS_AGING_4HOU \
|| kGetFactoryTestStatus() == FTS_AGING_DONE \ || kGetFactoryTestStatus() == FTS_AGING_DONE \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING \ || kGetFactoryTestStatus() == FTS_WAITING_RELEASED \
|| kGetFactoryTestStatus() == FTS_AGING_WAITING_SECOND_PRESS){ || kGetFactoryTestStatus() == FTS_WAITING_SECOND_PRESS){
return 0; return 0;
} }
bool OnOffFlag = false; 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; OnOffFlag |= kZclOnOffClusterServerOnOffGet(1) == EOOS_ON?true:false;
//iKonkeAfSelfPrint("OnOffFlag by endpoint1 : (%d).\r\n",OnOffFlag); //iKonkeAfSelfPrint("OnOffFlag by endpoint1 : (%d).\r\n",OnOffFlag);
OnOffFlag |= kZclOnOffClusterServerOnOffGet(2) == EOOS_ON?true:false; OnOffFlag |= kZclOnOffClusterServerOnOffGet(2) == EOOS_ON?true:false;
...@@ -1189,6 +1556,7 @@ s32 kRadarLedEventHandler(void *arg) ...@@ -1189,6 +1556,7 @@ s32 kRadarLedEventHandler(void *arg)
//iKonkeAfSelfPrint("OnOffFlag by endpoint3 : (%d).\r\n",OnOffFlag); //iKonkeAfSelfPrint("OnOffFlag by endpoint3 : (%d).\r\n",OnOffFlag);
OnOffFlag |= kZclOnOffClusterServerOnOffGet(4) == EOOS_ON?true:false; OnOffFlag |= kZclOnOffClusterServerOnOffGet(4) == EOOS_ON?true:false;
//iKonkeAfSelfPrint("OnOffFlag by endpoint4 : (%d).\r\n",OnOffFlag); //iKonkeAfSelfPrint("OnOffFlag by endpoint4 : (%d).\r\n",OnOffFlag);
#endif
if (OnOffFlag == true){ if (OnOffFlag == true){
kLedOptTrigger(LED_RADAR_ID, 0, 0, 0, LED_ON, LED_IGNORE); kLedOptTrigger(LED_RADAR_ID, 0, 0, 0, LED_ON, LED_IGNORE);
...@@ -1312,7 +1680,6 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode ) ...@@ -1312,7 +1680,6 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
case UART_MSG_READ_AGING_TIME_OPCODE: case UART_MSG_READ_AGING_TIME_OPCODE:
case UART_MSG_WRITE_INTERPAN_PARA_OPCODE: case UART_MSG_WRITE_INTERPAN_PARA_OPCODE:
case UART_MSG_READ_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); kCmdGeneralMsgPaser(pMsgNode, ECOM_PORT_UART, &send_buf);
break; break;
case UART_MSG_QUERY_INFO_OPCODE: case UART_MSG_QUERY_INFO_OPCODE:
...@@ -1324,6 +1691,8 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode ) ...@@ -1324,6 +1691,8 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
case UART_MSG_QUERY_FACTORY_INFO_OPCODE: case UART_MSG_QUERY_FACTORY_INFO_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE: case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_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); kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_UART, &send_buf);
break; break;
...@@ -1333,6 +1702,7 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode ) ...@@ -1333,6 +1702,7 @@ void UartMsgProcessHandle(UMsgNodeSt *pMsgNode )
reply_control_field = Z_TO_H_NO_ACK; reply_control_field = Z_TO_H_NO_ACK;
break; break;
} }
reply_control_field = Z_TO_H_NO_ACK;
kCmdMsgDataSentByPort(reply_control_field, send_buf, false, ECOM_PORT_UART); kCmdMsgDataSentByPort(reply_control_field, send_buf, false, ECOM_PORT_UART);
} }
/* DESP: rtt command message incoming and process interface. /* DESP: rtt command message incoming and process interface.
...@@ -1422,6 +1792,8 @@ void kUserInterPanMsgInComingPaser(UMsgNodeSt *pMsgNode) ...@@ -1422,6 +1792,8 @@ void kUserInterPanMsgInComingPaser(UMsgNodeSt *pMsgNode)
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE: case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE:
case UART_MSG_ENTER_FACTORY_TEST_OPCODE: case UART_MSG_ENTER_FACTORY_TEST_OPCODE:
case UART_MSG_ONOFF_SWITCH_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); kkFactoryMsgInComingPaser(pMsgNode, ECOM_PORT_INTERPAN, &send_buf);
break; break;
......
...@@ -7,7 +7,9 @@ ...@@ -7,7 +7,9 @@
#include "ikk-led.h" #include "ikk-led.h"
#include "ikk-network.h" #include "ikk-network.h"
#define ZCL_ATTRID_NoDisturbMode 0x100C
void App_Init(void); 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 #endif
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "bdb.h" #include "bdb.h"
#include "ota.h" #include "ota.h"
#include PROJECT_H #include PROJECT_H
#include "ikk-ota.h"
#include "ikk-debug.h" #include "ikk-debug.h"
#include "ikk-network.h" #include "ikk-network.h"
/********************************************************************** /**********************************************************************
...@@ -258,31 +259,34 @@ void zbdemo_bdbIdentifyCb(u8 endpoint, u16 srcAddr, u16 identifyTime){ ...@@ -258,31 +259,34 @@ void zbdemo_bdbIdentifyCb(u8 endpoint, u16 srcAddr, u16 identifyTime){
#endif #endif
} }
#ifdef ZCL_OTA #ifdef ZCL_OTA
void sampleLight_otaProcessMsgHandler(u8 evt, u8 status) 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(evt == OTA_EVT_START){
if(status == ZCL_STA_SUCCESS){ if(status == ZCL_STA_SUCCESS){
kOTAMoudleCallback(OTA_START);
}else{ }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){ }else if(evt == OTA_EVT_COMPLETE){
if(status == ZCL_STA_SUCCESS){ if(status == ZCL_STA_SUCCESS){
ota_mcuReboot(); ota_mcuReboot();
kOTAMoudleCallback(OTA_VERITY_SUCCEED);
}else{ }else{
ota_queryStart(30); ota_queryStart(30);
kOTAMoudleCallback(OTA_FAILED);
} }
} }
} }
#endif #endif
/********************************************************************* /*********************************************************************
* @fn sampleLight_leaveIndHandler * @fn sampleLight_leaveIndHandler
* *
......
...@@ -53,6 +53,9 @@ ...@@ -53,6 +53,9 @@
#include "zcl_include.h" #include "zcl_include.h"
#include PROJECT_H #include PROJECT_H
#include "zcl.h" #include "zcl.h"
#include "ikk-debug.h"
#include "ikk-sequence.h"
#include "ikk-cluster.h"
/********************************************************************** /**********************************************************************
* LOCAL CONSTANTS * LOCAL CONSTANTS
*/ */
...@@ -259,35 +262,117 @@ static void sampleLight_onoff_onWithRecallGlobalSceneProcess(void) ...@@ -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); static ev_timer_event_t *kSrcEp1Multieport = NULL;
void zclReportCmdHandler(uint8_t ep,uint16_t cluster,zclReportCmd_t *reportInfo) 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) switch(cluster)
{ {
//当report的是子设备时进行过滤
case ZCL_CLUSTER_GEN_ON_OFF: case ZCL_CLUSTER_GEN_ON_OFF:
{ {
for(uint8_t i = 0;i<(reportInfo->numAttr);i++) uint16_t sender = pInHdlrMsg->msg->indInfo.src_short_addr;
{ for(uint8_t i = 0;i<(reportInfo->numAttr);i++){
if(reportInfo->attrList[i].attrID == ZCL_ATTRID_ONOFF) 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]; 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; break;
} }
default: default:
break; break;
} }
} }
status_t sampleLight_onOffCb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload) status_t sampleLight_onOffCb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload)
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "ota.h" #include "ota.h"
#include PROJECT_H #include PROJECT_H
#include "ikk-debug.h" #include "ikk-debug.h"
#include "ikk-ota.h"
#include "ikk-opt-tunnel.h" #include "ikk-opt-tunnel.h"
/********************************************************************** /**********************************************************************
* LOCAL CONSTANTS * LOCAL CONSTANTS
...@@ -110,7 +111,7 @@ static ev_timer_event_t *identifyTimerEvt = NULL; ...@@ -110,7 +111,7 @@ static ev_timer_event_t *identifyTimerEvt = NULL;
* @return None * @return None
*/ */
extern kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd); 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) void sampleLight_zclProcessIncomingMsg(zclIncoming_t *pInHdlrMsg)
{ {
iKonkeAfSelfPrint("######sampleLight_zclProcessIncomingMsg,cmd = %d,len=%d,\n",pInHdlrMsg->hdr.cmd,pInHdlrMsg->dataLen); iKonkeAfSelfPrint("######sampleLight_zclProcessIncomingMsg,cmd = %d,len=%d,\n",pInHdlrMsg->hdr.cmd,pInHdlrMsg->dataLen);
...@@ -147,7 +148,7 @@ void sampleLight_zclProcessIncomingMsg(zclIncoming_t *pInHdlrMsg) ...@@ -147,7 +148,7 @@ void sampleLight_zclProcessIncomingMsg(zclIncoming_t *pInHdlrMsg)
sampleLight_zclCfgReportRspCmd(pInHdlrMsg->attrCmd); sampleLight_zclCfgReportRspCmd(pInHdlrMsg->attrCmd);
break; break;
case ZCL_CMD_REPORT: case ZCL_CMD_REPORT:
zclReportCmdHandler(ep,cluster,pInHdlrMsg->attrCmd); zclReportCmdHandler(ep,cluster,pInHdlrMsg->attrCmd,pInHdlrMsg);
break; break;
#endif #endif
case ZCL_CMD_DEFAULT_RSP: case ZCL_CMD_DEFAULT_RSP:
...@@ -325,19 +326,25 @@ void sampleLight_zclIdentifyTimerStop(void) ...@@ -325,19 +326,25 @@ void sampleLight_zclIdentifyTimerStop(void)
* *
* @return None * @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) void sampleLight_zclIdentifyCmdHandler(u8 endpoint, u16 srcAddr, u16 identifyTime)
{ {
// g_zcl_identifyAttrs.identifyTime = identifyTime; g_zcl_identifyAttrs->identifyTime = identifyTime;
// /*if(kGetOTAStatus() == OTA_NORMAL){*/
// if(identifyTime == 0){ if(identifyTime == 0){
// sampleLight_zclIdentifyTimerStop(); kSetLedStatus(LED_ALL_ID);
// //light_blink_stop(); }else{
// }else{ kLedOptTrigger(LED_ALL_ID, LED_SLOW_BLINK_ON_TIME_MS, LED_SLOW_BLINK_OFF_TIME_MS,
// if(!identifyTimerEvt){ identifyTime * 1000/(LED_SLOW_BLINK_ON_TIME_MS + LED_SLOW_BLINK_OFF_TIME_MS), LED_ON, LED_OFF);
// //light_blink_start(identifyTime, 500, 500); }
// identifyTimerEvt = TL_ZB_TIMER_SCHEDULE(sampleLight_zclIdentifyTimerCb, NULL, 1000); /* }*/
// }
// }
} }
/********************************************************************* /*********************************************************************
......
...@@ -146,6 +146,7 @@ static void sampleLight_sceneStoreReqHandler(uint8_t ep ,zcl_sceneEntry_t *pScen ...@@ -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++] = HI_UINT16(ZCL_CLUSTER_GEN_ON_OFF);
pScene->extField[extLen++] = 1; pScene->extField[extLen++] = 1;
pScene->extField[extLen++] = pOnOff->onOff; 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); kZclClusterRecallSceneCallback(ep,ZCL_CLUSTER_GEN_ON_OFF,ZCL_CMD_SCENE_STORE_SCENE,true,false);
#endif #endif
...@@ -189,6 +190,7 @@ static void sampleLight_sceneStoreReqHandler(uint8_t ep ,zcl_sceneEntry_t *pScen ...@@ -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) status_t sampleLight_sceneCb(zclIncomingAddrInfo_t *pAddrInfo, u8 cmdId, void *cmdPayload)
{ {
uint8_t ep = pAddrInfo->dstEp ; 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){ if(pAddrInfo->dirCluster == ZCL_FRAME_CLIENT_SERVER_DIR){
switch(cmdId){ switch(cmdId){
case ZCL_CMD_SCENE_STORE_SCENE: 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 ...@@ -298,14 +298,18 @@ void kLedOptTrigger(uint8_t id, uint32_t duration_on_ms, uint32_t duration_off_m
return ; return ;
} }
// iKonkeAfSelfPrint("LED_TRIGGER[%d]: id(%d), d_on(%d), d_off(%d), times(%d), start(%d), end(%d)\r\n", if(id != 1)
// led_index, id, duration_on_ms, duration_off_ms, times, start, end); 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].onDuration = duration_on_ms / TICK_LOOP_NMS;
g_stLedCtrller[led_index].offDuration = duration_off_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].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 ) { if( g_stLedCtrller[led_index].start == LED_ON ) {
kLedDriverhandler(led_index, 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 ...@@ -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]){ if (g_pLedBlinkDoneCallback[led_index] && !bFlg[led_index]){
bFlg[led_index] = true; bFlg[led_index] = true;
g_pLedBlinkDoneCallback[led_index](id); g_pLedBlinkDoneCallback[led_index](id);
} }
}else { }else {
bFlg[led_index] = false; bFlg[led_index] = false;
......
...@@ -24,7 +24,7 @@ static uint8_t g_u8PwmChannelNum = 0; ...@@ -24,7 +24,7 @@ static uint8_t g_u8PwmChannelNum = 0;
pPwmActionDoneCallback g_pPwmActionDoneCallback = NULL; 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; static ev_timer_event_t *Tick_Pwm_TimerEvt = NULL;
...@@ -80,7 +80,7 @@ uint8_t kPwmGetIndexByID(uint8_t pwm_id ) ...@@ -80,7 +80,7 @@ uint8_t kPwmGetIndexByID(uint8_t pwm_id )
*/ */
void kPwmDriverhandler(uint8_t pwm_index, PwmGradientDirectionEnum st, uint16_t value) 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){ if (pwm_index >= g_u8PwmChannelNum){
iKonkeAfSelfPrint("####kPwmDriverhandler index is too large\r\n"); 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 ...@@ -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); 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); pwmSetDuty(g_stPwmConfList[pwm_index].gpioInfo.pwmChannel,start_value);
if(!Pwm_Tick_Detect_Running_Flag) { if(!Pwm_Tick_Detect_Running_Flag[pwm_index]) {
Pwm_Tick_Detect_Running_Flag = true; Pwm_Tick_Detect_Running_Flag[pwm_index] = true;
} }
} }
/* DESP: single LED instance register interface. /* DESP: single LED instance register interface.
...@@ -253,15 +253,18 @@ kk_err_t kPwmModuleInit(PwmConfSt pwmlist[], unsigned char pwm_number, pPwmActio ...@@ -253,15 +253,18 @@ kk_err_t kPwmModuleInit(PwmConfSt pwmlist[], unsigned char pwm_number, pPwmActio
} }
static s32 kPwmGradientChangeEventHandler(void *data) static s32 kPwmGradientChangeEventHandler(void *data)
{ {
if(!Pwm_Tick_Detect_Running_Flag)
return 0;
for (uint8_t i = 0; i < g_u8PwmChannelNum; i++){ 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].actionCounter > 0){
if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){ if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){
g_stPwmCtrller[i].actionCounter--; g_stPwmCtrller[i].actionCounter--;
g_stPwmCtrller[i].startDutyCycleValue -= g_stPwmCtrller[i].intervalDutyCycle; g_stPwmCtrller[i].startDutyCycleValue -= g_stPwmCtrller[i].intervalDutyCycle;
pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].startDutyCycleValue); 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){ } else if (g_stPwmCtrller[i].startDutyCycle < g_stPwmCtrller[i].endDutyCycle){
g_stPwmCtrller[i].actionCounter--; g_stPwmCtrller[i].actionCounter--;
g_stPwmCtrller[i].startDutyCycleValue += g_stPwmCtrller[i].intervalDutyCycle; g_stPwmCtrller[i].startDutyCycleValue += g_stPwmCtrller[i].intervalDutyCycle;
...@@ -272,7 +275,6 @@ static s32 kPwmGradientChangeEventHandler(void *data) ...@@ -272,7 +275,6 @@ static s32 kPwmGradientChangeEventHandler(void *data)
if (g_stPwmCtrller[i].actionCounter == 0){ if (g_stPwmCtrller[i].actionCounter == 0){
//may be end duty cycle not equal, restore end duty cycle //may be end duty cycle not equal, restore end duty cycle
pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].endDutyCycle); pwmSetDuty(g_stPwmCtrller[i].gpioInfo.pwmChannel,g_stPwmCtrller[i].endDutyCycle);
if (g_pPwmActionDoneCallback){ if (g_pPwmActionDoneCallback){
PwmGradientDirectionEnum opt = ELP_OPT_DEFAULT; PwmGradientDirectionEnum opt = ELP_OPT_DEFAULT;
if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){ if (g_stPwmCtrller[i].startDutyCycle > g_stPwmCtrller[i].endDutyCycle){
......
...@@ -23,7 +23,6 @@ static pClusterAttributeChangeCallback pOnOffClusterCallback = NULL; ...@@ -23,7 +23,6 @@ static pClusterAttributeChangeCallback pOnOffClusterCallback = NULL;
//static pClusterAttributeChangeCallback pLevelClusterCallback = NULL; //static pClusterAttributeChangeCallback pLevelClusterCallback = NULL;
//static pClusterAttributeChangeCallback pColorClusterCallback = NULL; //static pClusterAttributeChangeCallback pColorClusterCallback = NULL;
static status_t WriteServerAttribute(u8 endpoint, u16 clusterId,uint8_t attributeID,uint8_t* dataPtr, uint8_t data_type); static status_t WriteServerAttribute(u8 endpoint, u16 clusterId,uint8_t attributeID,uint8_t* dataPtr, uint8_t data_type);
typedef struct { typedef struct {
ZclReportTableSt g_stZclReportPermitList[ENDPOINT_MAXN * CLUSTER_MAXN]; ZclReportTableSt g_stZclReportPermitList[ENDPOINT_MAXN * CLUSTER_MAXN];
...@@ -202,11 +201,6 @@ void Update_Local_Attribute_Info(void) ...@@ -202,11 +201,6 @@ void Update_Local_Attribute_Info(void)
Rewrite_ManufactureName(); Rewrite_ManufactureName();
} }
typedef struct{ typedef struct{
zcl_basicAttr_t basicAttrs_temp; zcl_basicAttr_t basicAttrs_temp;
zcl_identifyAttr_t identifyAttrs_temp; zcl_identifyAttr_t identifyAttrs_temp;
...@@ -295,6 +289,8 @@ void kZclClusterPermitReportTableInit(BindObjSt clusterBindList[], uint8_t size) ...@@ -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].cluster = clusterBindList[i].cluster;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].reportEnable = false; g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].reportEnable = false;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[i].sceneRecallFlg = 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; g_stZclClusterReportPermitTable.size = size;
} }
...@@ -326,13 +322,15 @@ bool kZclClusterGetPermitReportInfo(uint8_t endpoint, uint16_t cluster, ZclRepor ...@@ -326,13 +322,15 @@ bool kZclClusterGetPermitReportInfo(uint8_t endpoint, uint16_t cluster, ZclRepor
zclReportPermit->cluster = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].cluster; zclReportPermit->cluster = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].cluster;
zclReportPermit->reportEnable = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable; zclReportPermit->reportEnable = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable;
zclReportPermit->sceneRecallFlg = g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg; 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 true;
} }
return false; return false;
} }
//permit info set //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; bool ret = false;
...@@ -347,6 +345,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep ...@@ -347,6 +345,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep
if (index != 0xFF){ if (index != 0xFF){
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable; g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg = sceneRecallFlg; 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; ret = true;
} }
}else { //㲥 }else { //㲥
...@@ -356,6 +362,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep ...@@ -356,6 +362,14 @@ bool kZclClusterSetPermitReportInfo(uint8_t endpoint, uint16_t cluster, bool rep
if (index != 0xFF){ if (index != 0xFF){
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable; g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].reportEnable = reportEnable;
g_stZclClusterReportPermitTable.g_stZclReportPermitList[index].sceneRecallFlg = sceneRecallFlg; 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; ret = true;
} }
} }
...@@ -377,9 +391,10 @@ kk_err_t kZclOnOffClusterServerInit(pOnOffClusterOnOffStatusCallback pOnOffStatu ...@@ -377,9 +391,10 @@ kk_err_t kZclOnOffClusterServerInit(pOnOffClusterOnOffStatusCallback pOnOffStatu
void ON_OFF_Cmd_Handler(uint8_t endpoint,bool onoff) void ON_OFF_Cmd_Handler(uint8_t endpoint,bool onoff)
{ {
OnOffStatusEnum on_off_ctr = (OnOffStatusEnum)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); kZclOnOffClusterServerOnOffControl(endpoint, on_off_ctr);
} }
/* DESP: Modified attribute reporting interface, reference from SDK callback[emberAfReportingAttributeChangeCallback]. /* DESP: Modified attribute reporting interface, reference from SDK callback[emberAfReportingAttributeChangeCallback].
* Auth: dingmz_frc.20190701. * Auth: dingmz_frc.20190701.
* */ * */
...@@ -388,6 +403,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId, ...@@ -388,6 +403,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
if(!zb_bindingTblSearched(clusterId,endpoint)){ if(!zb_bindingTblSearched(clusterId,endpoint)){
return; return;
} }
iKonkeAfSelfPrint("######kOptTunnelReportingPlagiarizeOriginal111111\r\n");
for(u8 i = 0; i < ZCL_REPORTING_TABLE_NUM; i++){ for(u8 i = 0; i < ZCL_REPORTING_TABLE_NUM; i++){
reportCfgInfo_t *pEntry = &reportingTab.reportCfgInfo[i]; reportCfgInfo_t *pEntry = &reportingTab.reportCfgInfo[i];
if( pEntry->endPoint == endpoint if( pEntry->endPoint == endpoint
...@@ -404,6 +420,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId, ...@@ -404,6 +420,7 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
ZB_EXCEPTION_POST(SYS_EXCEPTTION_ZB_ZCL_ENTRY); ZB_EXCEPTION_POST(SYS_EXCEPTTION_ZB_ZCL_ENTRY);
return; return;
} }
u16 len = zcl_getAttrSize(pAttrEntry->type, pAttrEntry->data); u16 len = zcl_getAttrSize(pAttrEntry->type, pAttrEntry->data);
len = (len>8) ? (8):(len); len = (len>8) ? (8):(len);
...@@ -415,5 +432,43 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId, ...@@ -415,5 +432,43 @@ void kOptTunnelReportingPlagiarizeOriginal(uint8_t endpoint, uint16_t clusterId,
pEntry->clusterID, pAttrEntry->id, pAttrEntry->type, pAttrEntry->data); 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 @@ ...@@ -9,9 +9,20 @@
#include "zcl.h" #include "zcl.h"
#include "ikk-network.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{ EOOS_OFF = 0, EOOS_ON, EOOS_UNKNOW }OnOffStatusEnum;
typedef enum{ EOOC_OFF = 0, EOOC_ON, EOOC_TOGGLE, EOOC_UNKNOW }OnOffCtrlEnum; 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_OFF 0x00
#define ZCL_CMD_ONOFF_ON 0x01 #define ZCL_CMD_ONOFF_ON 0x01
#define ZCL_CMD_ONOFF_TOGGLE 0x02 #define ZCL_CMD_ONOFF_TOGGLE 0x02
...@@ -19,12 +30,15 @@ typedef enum{ EOOC_OFF = 0, EOOC_ON, EOOC_TOGGLE, EOOC_UNKNOW }OnOffCtrlEnum; ...@@ -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_OFF 0x00
#define ZCL_ONOFF_STATUS_ON 0x01 #define ZCL_ONOFF_STATUS_ON 0x01
typedef struct tag_zcl_report_table{ typedef struct tag_zcl_report_table{
uint8_t endpoint; uint8_t endpoint;
uint16_t cluster; uint16_t cluster;
bool reportEnable; bool reportEnable;
bool sceneRecallFlg; bool sceneRecallFlg;
bool reportGatewayEnable;
bool reportChildDeviceEnable;
addrExt_t maskEui64Addr;
uint8_t dest_endpoint;
}ZclReportTableSt; }ZclReportTableSt;
#define MAX_ATTR_CHANGE_SUPPORT_NUMS 8 #define MAX_ATTR_CHANGE_SUPPORT_NUMS 8
...@@ -61,7 +75,9 @@ kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrl ...@@ -61,7 +75,9 @@ kk_err_t kZclOnOffClusterServerOnOffControl(uint8_t endpoint, OnOffCtrlEnum ctrl
bool Get_Model_ID(uint8_t *ModeID); 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 ); 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 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); void kZclClusterPermitReportTableInit(BindObjSt clusterBindList[], uint8_t size);
bool kZclClusterGetPermitReportInfo(uint8_t endpoint, uint16_t cluster, ZclReportTableSt *zclReportPermit); 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_ */ #endif /* _SAMPLE_LIGHT_H_ */
...@@ -56,7 +56,7 @@ uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len) ...@@ -56,7 +56,7 @@ uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len)
/* DESP: remap opcode, arg direction 0: FCC0->AA55 1:AA55->FCC0 /* DESP: remap opcode, arg direction 0: FCC0->AA55 1:AA55->FCC0
* Auth: * 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++ ) { for (uint8_t i = 0; i < (sizeof(opcodeReampTable)/(2*sizeof(uint16_t))); i++ ) {
if (opcodeReampTable[i][0] == Opcode) { if (opcodeReampTable[i][0] == Opcode) {
...@@ -66,7 +66,6 @@ uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction) ...@@ -66,7 +66,6 @@ uint16_t kCmdOpcodeRemap(uint16_t Opcode, uint8_t direction)
return 0xFFFF; return 0xFFFF;
} }
kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut) kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{ {
//UMsgNodeSt uMsgNode = {0}; //UMsgNodeSt uMsgNode = {0};
...@@ -144,7 +143,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st ...@@ -144,7 +143,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
//check install code length 20200725 //check install code length 20200725
uint8_t length = data.u8ARG[0]; uint8_t length = data.u8ARG[0];
if (length != 16) { if (length != 16) {//如果不是16位的数据就不做任何改变,只回复
send_buf.u8ARG[0] = ERR_FORMAT; send_buf.u8ARG[0] = ERR_FORMAT;
send_buf.u8ARG[1] = data.u8ARG[0]; send_buf.u8ARG[1] = data.u8ARG[0];
memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], length); memcpy(&send_buf.u8ARG[2], &data.u8ARG[1], length);
...@@ -247,9 +246,9 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st ...@@ -247,9 +246,9 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
memset(buffer, 0, 33); memset(buffer, 0, 33);
uint8_t *data = ISN_TOKEN_GET(); uint8_t *data = ISN_TOKEN_GET();
iKonkeAfSelfPrint("len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
length = data[0]; length = data[0];
iKonkeAfSelfPrint("read ISN len %x\r\n",data[0]);
iKonkeAfSelfPrintBuffer(data+1,32);
memcpy(buffer,data,length +1); memcpy(buffer,data,length +1);
if(length > 32) { if(length > 32) {
...@@ -268,7 +267,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st ...@@ -268,7 +267,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
{ {
uint8_t mac_length = 0x00; uint8_t mac_length = 0x00;
addrExt_t addr,local_addr; addrExt_t addr,local_addr;
flash_read(CFG_MAC_ADDRESS,8,(uint8_t*)local_addr); zb_getLocalExtAddr(local_addr);
mac_length = data.u8ARG[0]; mac_length = data.u8ARG[0];
if (mac_length != 8) { if (mac_length != 8) {
...@@ -293,8 +292,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st ...@@ -293,8 +292,7 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
case (UART_MSG_READ_MAC_CODE_OPCODE)://ok case (UART_MSG_READ_MAC_CODE_OPCODE)://ok
{ {
addrExt_t addr; 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[0] = 0x00;
send_buf.u8ARG[1] = 0x08; send_buf.u8ARG[1] = 0x08;
...@@ -403,82 +401,48 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st ...@@ -403,82 +401,48 @@ kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st
} }
case (UART_MSG_WRITE_INTERPAN_PARA_OPCODE): case (UART_MSG_WRITE_INTERPAN_PARA_OPCODE):
{ {
extern void GetInterpanPara(uint8_t *enable, uint8_t *channel, uint16_t *panId);
uint8_t enable = 0; uint8_t enable = 0;
uint16_t panId = 0;
uint8_t channel = 0; uint8_t channel = 0;
int8_t radioTxPower = 0; uint16_t panId = 0;
enable = data.u8ARG[0]; enable = data.u8ARG[0];
channel = data.u8ARG[1]; channel = data.u8ARG[1];
panId = UINT16_HL(data.u8ARG[2], data.u8ARG[3]); panId = UINT16_HL(data.u8ARG[2], data.u8ARG[3]);
radioTxPower = data.u8ARG[4];
if (enable == 1) SetInterpanPara(channel,panId);
zb_factoryReset(); GetInterpanPara(&enable, &channel, &panId);
SetInterpanPara(channel,panId,enable);
send_buf.u8ARG[0] = ERR_OK; 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; reply_control_field = Z_TO_H_NO_ACK;
break; 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 //nwk operation request
case (UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE)://ok case (UART_MSG_QUERY_NWK_STATUS_REQUEST_OPCODE)://ok
{ {
......
...@@ -34,7 +34,6 @@ typedef struct{ ...@@ -34,7 +34,6 @@ typedef struct{
}MsgFrameworkFormat_st; }MsgFrameworkFormat_st;
kk_err_t kCmdGeneralMsgPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut); 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); uint16_t kCmdGetMsgCrc16Value( uint8_t* msg, uint8_t len);
uint8_t kCmdMsgDataSentByPort(uint8_t u8Control_Field, DataField_st data, bool isGetResult, ComPortEm port); uint8_t kCmdMsgDataSentByPort(uint8_t u8Control_Field, DataField_st data, bool isGetResult, ComPortEm port);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define __IKONKE_MODULE_DEBUG_H______________________________ #define __IKONKE_MODULE_DEBUG_H______________________________
#define IKONKE_DEBUG_LOG_ENABLE (0) // ENABLE #define IKONKE_DEBUG_LOG_ENABLE (1) // ENABLE
#define PROMPT_DSR "" #define PROMPT_DSR ""
......
...@@ -3,16 +3,30 @@ ...@@ -3,16 +3,30 @@
#include "ikk-token.h" #include "ikk-token.h"
#include "ikk-common-utils.h" #include "ikk-common-utils.h"
#include "../driver/ikk-button.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_15MIN_VALUE 0xA1
#define AGING_TEST_4HOU_VALUE 0xA2 #define AGING_TEST_4HOU_VALUE 0xA2
#define AGINE_TEST_DONE_VALUE 0xFA #define AGINE_TEST_DONE_VALUE 0xFA
//已经置老化标志 //已经置老化标志
#define SINGLE_BOARD_TEST_DONE_VALUE 0xF1 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 #define SINGLE_BOARD_TEST_DONE_VALUE 0xF1
#define FULL_DEVICE_TEST_DONE_VALUE 0xF2 //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟? #define FULL_DEVICE_TEST_DONE_VALUE 0xF2
#define FORCE_FACTORY_TEST_VALUE 0xF8 //锟斤拷锟斤拷锟斤拷锟斤拷锟角匡拷锟斤拷顺锟? #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; static ev_timer_event_t *kFactoryTestEvt = NULL;
s32 kFactoryTestEventHandler(void *arg); s32 kFactoryTestEventHandler(void *arg);
...@@ -28,17 +42,20 @@ typedef struct{ ...@@ -28,17 +42,20 @@ typedef struct{
uint32_t u32FirstBtnLongPressedCountDown; uint32_t u32FirstBtnLongPressedCountDown;
}FactoryTestControllerSt; }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] \ 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}}; = {{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 FactoryTestStatusEnum g_eLastFactoryTestStatus = FTS_NORMAL;
static uint32_t g_u32AgingTotalTimeMS = 0; static uint32_t g_u32AgingTotalTimeMS = 0;
static uint32_t g_u32AgingMaxTimeMS = 0;
static pFactoryTestPollCallback g_pFactoryTestPollCallback = NULL; static pFactoryTestPollCallback g_pFactoryTestPollCallback = NULL;
static uint8_t g_u8LongPressedKeyIndex = 0; static uint8_t g_u8LongPressedKeyIndex = 0;
static uint32_t g_u32Count = 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. /* DESP: get the test index by id.
* Auth: mazj.20200227. * Auth: mazj.20200227.
* */ * */
...@@ -102,6 +119,10 @@ uint8_t kGetFactoryTestValueStatus(void) ...@@ -102,6 +119,10 @@ uint8_t kGetFactoryTestValueStatus(void)
status = status | FT_FORCE_EXIT; status = status | FT_FORCE_EXIT;
}else if (kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) { }else if (kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) {
status = status | FT_SINGLE_BOARD_TEST; status = status | FT_SINGLE_BOARD_TEST;
}else {
#if !Z30_DEVICE_FULL_DEVICE_ENBALE
status = status | FT_NORMAL_DONE;
#endif
} }
#endif #endif
...@@ -109,12 +130,17 @@ uint8_t kGetFactoryTestValueStatus(void) ...@@ -109,12 +130,17 @@ uint8_t kGetFactoryTestValueStatus(void)
if (kGetFullDeviceValue() == FORCE_FACTORY_TEST_VALUE) { if (kGetFullDeviceValue() == FORCE_FACTORY_TEST_VALUE) {
status = status | FT_FORCE_EXIT; status = status | FT_FORCE_EXIT;
}else if (kGetFullDeviceValue() != FULL_DEVICE_TEST_DONE_VALUE){ }else if (kGetFullDeviceValue() != FULL_DEVICE_TEST_DONE_VALUE){
status = status | FT_FULL_DEVICE_TEST; status = status | FT_FULL_DEVICE_TEST;//没过整机时该标志位是1,单板整机都过的时候第三位bit为1,最后两个bit位为0
}else if(kGetSingleBoardValue() == SINGLE_BOARD_TEST_DONE_VALUE){ }else {
status = status | FT_NORMAL_DONE; status = status | FT_NORMAL_DONE;
} }
#endif #endif
#if Z30_DEVICE_AGING_ENABLE
if (kGetAgingTestValue() != AGINE_TEST_DONE_VALUE) {
status = status | FT_AGING_DONE;
}
#endif
return status; return status;
} }
nv_sts_t General_Set_Factory_Test(nv_item_t items,uint8_t value) 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 ...@@ -157,15 +183,34 @@ void kFactoryTestBtnActionCallback(unsigned char button_id, BtnActionEnum actio
g_stFactoryTestControllerList[u8FactoryTestIndex].eCurrentBtnAction = action; g_stFactoryTestControllerList[u8FactoryTestIndex].eCurrentBtnAction = action;
//松手复位,触摸按键长时间按着也会自动松手 //松手复位,触摸按键长时间按着也会自动松手
if (g_eFactoryTestStatus == FTS_AGING_WAITING && g_stFactoryTestControllerList[g_u8LongPressedKeyIndex].eCurrentBtnAction == EBA_RELEASED){ if ((g_eFactoryTestStatus == FTS_WAITING_RELEASED || g_eFactoryTestStatus == FTS_FORCE_EXIT) && g_stFactoryTestControllerList[g_u8LongPressedKeyIndex].eCurrentBtnAction == EBA_RELEASED){
g_eFactoryTestStatus = FTS_AGING_FORCE_REBOOT; g_eFactoryTestStatus = FTS_FORCE_REBOOT;
g_u32Count = FACTORY_TEST_POLL_TIMES; //快点执行自定义函数 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) kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut)
{ {
//UMsgNodeSt uMsgNode = {0}; //UMsgNodeSt uMsgNode = {0};
...@@ -239,13 +284,23 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie ...@@ -239,13 +284,23 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
case (UART_MSG_QUERY_DEVICE_VERSION_OPCODE): case (UART_MSG_QUERY_DEVICE_VERSION_OPCODE):
{ {
send_buf.u8ARG[0] = ERR_OK; 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] = hardversion;
send_buf.u8ARG[1] = 0x20; send_buf.u8ARG[2] = softversion;
send_buf.u8ARG[2] = 0x20;
send_buf.u8ARG[3] = 0XFF; send_buf.u8ARG[3] = 0XFF;
send_buf.u8ARG[4] = 0XFF; send_buf.u8ARG[4] = 0XFF;
send_buf.u8ARG[0] = ERR_OK;; send_buf.u8ARG[0] = ERR_OK;
send_buf.u8ArgLen = 5; send_buf.u8ArgLen = 5;
reply_control_field = Z_TO_H_NO_ACK; reply_control_field = Z_TO_H_NO_ACK;
break; break;
...@@ -272,26 +327,27 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie ...@@ -272,26 +327,27 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
} }
case (UART_MSG_EXIT_FACTORY_TEST_OPCODE): case (UART_MSG_EXIT_FACTORY_TEST_OPCODE):
{ {
uint8_t token_data = 0;
if(data.u8ARG[0]&0x01) if(data.u8ARG[0]&0x01)
{ {
kSetSingleBoardValue(SINGLE_BOARD_TEST_DONE_VALUE); kSetSingleBoardValue(SINGLE_BOARD_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetSingleBoardValue(%x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK; 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) if(data.u8ARG[0]&0x02)
{ {
kSetFullDeviceValue(FULL_DEVICE_TEST_DONE_VALUE); kSetFullDeviceValue(FULL_DEVICE_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetFullBoardValue(%02x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK; 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); kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
iKonkeAfSelfPrint("######kGetAgingTestValue(%02x)\r\n", token_data);
send_buf.u8ARG[0] = ERR_OK; 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.u8ARG[1] = data.u8ARG[0];
send_buf.u8ArgLen = 2; send_buf.u8ArgLen = 2;
...@@ -307,7 +363,7 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie ...@@ -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); iKonkeAfSelfPrint("######UART_MSG_QUERY_FACTORY_INFO_OPCODE(%d)\r\n", send_buf.u8ArgLen);
break; break;
} }
case UART_MSG_QUERY_SWITCH_ONOFF_OPCODE: case (UART_MSG_QUERY_SWITCH_ONOFF_OPCODE):
{ {
extern uint8_t Key_Press_Test_Flag[5]; extern uint8_t Key_Press_Test_Flag[5];
for (uint8_t i = 0; i < 6; i++){ for (uint8_t i = 0; i < 6; i++){
...@@ -342,25 +398,116 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie ...@@ -342,25 +398,116 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie
send_buf.u8ARG[1] = kGetFactoryTestValueStatus(); send_buf.u8ARG[1] = kGetFactoryTestValueStatus();
break; break;
} }
case UART_MSG_ONOFF_SWITCH_OPCODE: case UART_MSG_ONOFF_SWITCH_OPCODE: {
{ uint8_t err = 0;
uint8_t command = data.u8ARG[0]; if (data.u8ARG[0] == 0x01) {
if(command == 1){ //控制命令 for (uint8_t i = 1; i < 9; i++) {
for (uint8_t i = 0; i < 9; i++){ if (data.u8ARG[i] == 0x00) { // on
if(i < 4){ kZclOnOffClusterServerOnOffControl(i, EOOC_OFF);
if(data.u8ARG[i+1] == 1) } else if (data.u8ARG[i] == 0x01) {
kZclOnOffClusterServerOnOffControl(i+1, 1); kZclOnOffClusterServerOnOffControl(i, EOOC_ON);
else if(data.u8ARG[i+1] == 0)
kZclOnOffClusterServerOnOffControl(i+1, 0);
}
else{
data.u8ARG[i+1] = 0xff;
} }
} }
} }
//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; send_buf.u8ARG[0] = ERR_OK;
memcpy(&send_buf.u8ARG[1], &data.u8ARG[1], 8); send_buf.u8ArgLen = 9;
send_buf.u8ArgLen = 10; 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; break;
} }
default: default:
...@@ -381,9 +528,11 @@ kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataFie ...@@ -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 #if FACTORY_TEST_ENABLE
iKonkeAfSelfPrint("######kFactoryTestInit11111111111111111111111111111111111111\r\n");
if(NULL == callback || NULL == conf_list || btn_num > AGING_EXIT_MAX_BTN_NUM) { if(NULL == callback || NULL == conf_list || btn_num > AGING_EXIT_MAX_BTN_NUM) {
return; return;
} }
...@@ -397,25 +546,73 @@ void kFactoryTestInit(pFactoryTestPollCallback callback, FactoryTestConfSt conf_ ...@@ -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[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); 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); kSetAgingTestValue(AGING_TEST_15MIN_VALUE);
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback);
g_eFactoryTestStatus = FTS_START; g_eFactoryTestStatus = FTS_START;
//启动老化事件 g_pFactoryTestPollCallback = callback;
g_u8FactoryTestLedId = led_id;
g_u32AgingTotalTimeMS = 0;
//load aging time
g_u32AgingMaxTimeMS = kGetAgingMaxTime();
if(kFactoryTestEvt){ if(kFactoryTestEvt){
TL_ZB_TIMER_CANCEL(&kFactoryTestEvt); TL_ZB_TIMER_CANCEL(&kFactoryTestEvt);
} }
kFactoryTestEvt = TL_ZB_TIMER_SCHEDULE(kFactoryTestEventHandler, NULL, 1000); kFactoryTestEvt = TL_ZB_TIMER_SCHEDULE(kFactoryTestEventHandler, NULL, 1000);
g_eFactoryTestStatus = FTS_START;
}else {
g_eFactoryTestStatus = FTS_NORMAL;
} }
kBtnaIRQCallbackRegister(kFactoryTestBtnActionCallback); #endif
g_pFactoryTestPollCallback = callback;
g_u32AgingTotalTimeMS = 0; #if Z30_DEVICE_FULL_DEVICE_ENBALE
// g_u8AgingForceExitBtnId = btn_id; 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 #else
uint8_t value = TEST_INIT_VALUE; uint8_t value = TEST_INIT_VALUE;
kSetAgingTestValue(value); kSetAgingTestValue(value);
kSetSingleBoardValue(value);
kSetFullDeviceValue(value);
g_eFactoryTestStatus = FTS_NORMAL; g_eFactoryTestStatus = FTS_NORMAL;
#endif #endif
} }
...@@ -427,7 +624,7 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -427,7 +624,7 @@ s32 kFactoryTestEventHandler(void *arg)
g_u32AgingTotalTimeMS += FACTORY_TEST_POLL_TTME_1S; 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) switch (g_eFactoryTestStatus)
{ {
case (FTS_START): case (FTS_START):
...@@ -449,8 +646,8 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -449,8 +646,8 @@ s32 kFactoryTestEventHandler(void *arg)
g_eFactoryTestStatus = FTS_AGING_4HOU; g_eFactoryTestStatus = FTS_AGING_4HOU;
break; break;
case (FTS_AGING_4HOU): case (FTS_AGING_4HOU):
//上电后12小时老化时间到,12小时内不可以短按按键和长按,不能组网 //上电后4小时老化时间到,4小时内不可以短按按键和长按,不能组网
if (g_u32AgingTotalTimeMS >= FACTORY_TEST_4HOU_MS){ if (g_u32AgingTotalTimeMS >= g_u32AgingMaxTimeMS){
kSetAgingTestValue(AGINE_TEST_DONE_VALUE); kSetAgingTestValue(AGINE_TEST_DONE_VALUE);
g_eFactoryTestStatus = FTS_AGING_DONE; g_eFactoryTestStatus = FTS_AGING_DONE;
} }
...@@ -460,16 +657,20 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -460,16 +657,20 @@ s32 kFactoryTestEventHandler(void *arg)
//return; //return;
g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数 g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数
break; break;
case (FTS_AGING_FORCE_EXIT): case (FTS_FORCE_EXIT):
g_eFactoryTestStatus = FTS_AGING_WAITING; g_eFactoryTestStatus = FTS_WAITING_RELEASED;
break; break;
case (FTS_AGING_WAITING): case (FTS_WAITING_RELEASED):
break; break;
case (FTS_AGING_FIRST_LONG_PRESSED): case (FTS_FIRST_LONG_PRESSED):
g_eFactoryTestStatus = FTS_AGING_WAITING_SECOND_PRESS; g_eFactoryTestStatus = FTS_WAITING_SECOND_PRESS;
break; break;
case (FTS_AGING_WAITING_SECOND_PRESS): case (FTS_WAITING_SECOND_PRESS):
break; break;
//Auth: han_frc.20220105.
case (FTS_NORMAL):
iKonkeAfSelfPrint("######FTS_NORMAL STOP EVENT!!!!!!!!!!!\r\n");
return -1;
default: default:
break; break;
} }
...@@ -508,8 +709,8 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -508,8 +709,8 @@ s32 kFactoryTestEventHandler(void *arg)
if ( g_stFactoryTestControllerList[index].u8BtnLongPressTimes == LONG_PRESS_1_TIMES \ if ( g_stFactoryTestControllerList[index].u8BtnLongPressTimes == LONG_PRESS_1_TIMES \
|| g_stFactoryTestControllerList[index].bIsFirstBtnLongPressed == true){ || g_stFactoryTestControllerList[index].bIsFirstBtnLongPressed == true){
//successfully exit aging test //successfully exit aging test
g_eFactoryTestStatus = FTS_AGING_FORCE_EXIT; g_eFactoryTestStatus = FTS_FORCE_EXIT;
kSetAgingTestValue(AGINE_TEST_DONE_VALUE); kSetAgingTestValue(FORCE_FACTORY_TEST_VALUE);
#if Z30_DEVICE_SINGLE_BOARD_ENABLE #if Z30_DEVICE_SINGLE_BOARD_ENABLE
if(kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE) if(kGetSingleBoardValue() != SINGLE_BOARD_TEST_DONE_VALUE)
kSetSingleBoardValue(FORCE_FACTORY_TEST_VALUE); kSetSingleBoardValue(FORCE_FACTORY_TEST_VALUE);
...@@ -532,7 +733,7 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -532,7 +733,7 @@ s32 kFactoryTestEventHandler(void *arg)
g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数 g_u32Count = FACTORY_TEST_POLL_TIMES;//快点处理自定义函数
//记录当前的老化状态 //记录当前的老化状态
g_eLastFactoryTestStatus = g_eFactoryTestStatus; g_eLastFactoryTestStatus = g_eFactoryTestStatus;
g_eFactoryTestStatus = FTS_AGING_FIRST_LONG_PRESSED; g_eFactoryTestStatus = FTS_FIRST_LONG_PRESSED;
iKonkeAfSelfPrint("######2222222222222222222222 == 0\r\n"); iKonkeAfSelfPrint("######2222222222222222222222 == 0\r\n");
} }
...@@ -570,5 +771,20 @@ s32 kFactoryTestEventHandler(void *arg) ...@@ -570,5 +771,20 @@ s32 kFactoryTestEventHandler(void *arg)
return 0; 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 @@ ...@@ -19,14 +19,14 @@
#define TOUCH_KEY_LONG_PRESS_TIME_MS (5 * 1000) #define TOUCH_KEY_LONG_PRESS_TIME_MS (5 * 1000)
#define MECHANICAL_KEY_LONG_PRESS_TIME_MS (20 * 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_1S (1 * 1000)
#define FACTORY_TEST_POLL_TTME_10S (10 * 1000) #define FACTORY_TEST_POLL_TTME_10S (10 * 1000)
#define FACTORY_TEST_POLL_TIMES (FACTORY_TEST_POLL_TTME_10S / FACTORY_TEST_POLL_TTME_1S) #define FACTORY_TEST_POLL_TIMES (FACTORY_TEST_POLL_TTME_10S / FACTORY_TEST_POLL_TTME_1S)
#if AGING_DEBUG #if AGING_DEBUG
#define FACTORY_TEST_15MIN_MS (2 * 60 * 1000) #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 #else
#define FACTORY_TEST_15MIN_MS (15 * 60 * 1000) #define FACTORY_TEST_15MIN_MS (15 * 60 * 1000)
#define FACTORY_TEST_4HOU_MS (4 * 60 * 60 * 1000) #define FACTORY_TEST_4HOU_MS (4 * 60 * 60 * 1000)
...@@ -42,11 +42,15 @@ typedef enum{ ...@@ -42,11 +42,15 @@ typedef enum{
FTS_AGING_4HOU_START, FTS_AGING_4HOU_START,
FTS_AGING_4HOU, FTS_AGING_4HOU,
FTS_AGING_DONE, FTS_AGING_DONE,
FTS_AGING_FORCE_EXIT, FTS_FORCE_EXIT,
FTS_AGING_WAITING, FTS_WAITING_RELEASED,//waiting key released
FTS_AGING_FORCE_REBOOT, FTS_FORCE_REBOOT,
FTS_AGING_FIRST_LONG_PRESSED, FTS_FIRST_LONG_PRESSED,
FTS_AGING_WAITING_SECOND_PRESS FTS_WAITING_SECOND_PRESS,
FTS_SINGLE_BOARD_TEST,
FTS_FULL_DEVICE_TEST,
FTS_SINGLE_BOARD_TEST_DONE,
FTS_FULL_DEVICE_TEST_DONE,
}FactoryTestStatusEnum; }FactoryTestStatusEnum;
typedef struct{ typedef struct{
...@@ -74,7 +78,12 @@ void kSetAgingMaxTime(uint16_t value); ...@@ -74,7 +78,12 @@ void kSetAgingMaxTime(uint16_t value);
//获取当前产测状态 //获取当前产测状态
FactoryTestStatusEnum kGetFactoryTestStatus(void); FactoryTestStatusEnum kGetFactoryTestStatus(void);
//void kGetFactoryTestBtnAction(uint8_t btn_id, BtnActionEnum action); //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); kk_err_t kkFactoryMsgInComingPaser(UMsgNodeSt *pMsgNode, ComPortEm port, DataField_st *pDataOut);
#endif #endif
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "ikk-debug.h" #include "ikk-debug.h"
#include "ikk-token.h" #include "ikk-token.h"
#include "ikk-network.h" #include "ikk-network.h"
#include "ikk-factory-test.h"
static bool gInterPanEnabled; // 1:enable static bool gInterPanEnabled; // 1:enable
static uint16_t gInterPanID = 0x1111; // 1:enable static uint16_t gInterPanID = 0x1111; // 1:enable
...@@ -16,12 +16,10 @@ static uint8_t g_interpanChannel = 20; ...@@ -16,12 +16,10 @@ static uint8_t g_interpanChannel = 20;
pInterPanMsgIncomingCallback gInterPanMsgIncomingCallback; pInterPanMsgIncomingCallback gInterPanMsgIncomingCallback;
static ev_timer_event_t *Interpan_timerEvt = NULL;
static ev_timer_event_t *Interpan_DelaySendEvt = NULL; static ev_timer_event_t *Interpan_DelaySendEvt = NULL;
static INCOM_MESSAGE_INFO sIncomingMessageInfo = {0}; static INCOM_MESSAGE_INFO sIncomingMessageInfo = {0};
static s32 kInterPanEventHandler(void);
static s32 kInterPanDelaySendTestDataEventHandler(void ); static s32 kInterPanDelaySendTestDataEventHandler(void );
/** /**
* @brief Definition for Incoming cluster / Sever Cluster * @brief Definition for Incoming cluster / Sever Cluster
...@@ -99,18 +97,16 @@ void afInterpan_dataSendConfirm(void *arg) ...@@ -99,18 +97,16 @@ void afInterpan_dataSendConfirm(void *arg)
} }
bool interpanleaveflg = false;
void kInterPanEnable(uint8_t channel) void kInterPanEnable(uint8_t channel)
{ {
rf_setChannel(channel); rf_setChannel(channel);
printf("kInterPanEnable enable,Regesiter Interpan Func,network = %d\r\n!!\r\n",kNwkGetCurrentStatus()); printf("kInterPanEnable enable,Regesiter Interpan Func,network = %d\r\n!!\r\n",kNwkGetCurrentStatus());
if (kNwkGetCurrentStatus() == ENS_LEAVED) { if (zb_isDeviceJoinedNwk()){
zb_factoryReset();
af_endpointRegister(INTERPAN_ENDPOINT, (af_simple_descriptor_t *)&kInterpanSimpleDesc, afInterpan_rx_handler, afInterpan_dataSendConfirm); interpanleaveflg = true;
}
else{
kNwkFactoryReset(false);
} }
af_endpointRegister(INTERPAN_ENDPOINT, (af_simple_descriptor_t *)&kInterpanSimpleDesc, afInterpan_rx_handler, afInterpan_dataSendConfirm);
} }
void kInterpanDisable(void) void kInterpanDisable(void)
...@@ -128,19 +124,17 @@ void kInterpanDisable(void) ...@@ -128,19 +124,17 @@ void kInterpanDisable(void)
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming) void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming)
{ {
if (kGetFactoryTestStatus() == FTS_NORMAL) {
bool interPanEnabledFlg = kGetInterpanEnableFlg(); gInterPanEnabled = false;
if (interPanEnabledFlg) { af_endpointUnregister(INTERPAN_ENDPOINT);
gInterPanEnabled = true; printf("kInterPanEnable disable\r\n!!\r\n");
} }
if (gInterPanEnabled == true) { else{
gInterPanEnabled = true;
printf("kInterPanEnable enable\r\n!!\r\n");
kInterPanEnable(INTERPAN_CHANNEL); kInterPanEnable(INTERPAN_CHANNEL);
if(Interpan_timerEvt){ if (!zb_isDeviceJoinedNwk()) {
TL_ZB_TIMER_CANCEL(&Interpan_timerEvt);
}
Interpan_timerEvt = TL_ZB_TIMER_SCHEDULE(kInterPanEventHandler, NULL, INTERPAN_AUTO_OFF_TIME);
if (kNwkGetCurrentStatus() == ENS_LEAVED) {
if(Interpan_DelaySendEvt) if(Interpan_DelaySendEvt)
TL_ZB_TIMER_CANCEL(&Interpan_DelaySendEvt); TL_ZB_TIMER_CANCEL(&Interpan_DelaySendEvt);
...@@ -184,21 +178,21 @@ bool kInterPanSetEnableStatus(uint8_t enable) ...@@ -184,21 +178,21 @@ bool kInterPanSetEnableStatus(uint8_t enable)
kSetInterpanEnableFlg(!gInterPanEnabled); 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) if(panid != 0xffff)
gInterPanID = panid; 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 uint8_t sSend_Count = 0;
static s32 kInterPanDelaySendTestDataEventHandler(void ) static s32 kInterPanDelaySendTestDataEventHandler(void )
{ {
...@@ -211,17 +205,6 @@ static s32 kInterPanDelaySendTestDataEventHandler(void ) ...@@ -211,17 +205,6 @@ static s32 kInterPanDelaySendTestDataEventHandler(void )
sSend_Count = 0; sSend_Count = 0;
return -1; 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) kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode)
{ {
......
...@@ -12,7 +12,6 @@ extern const af_simple_descriptor_t kInterpanSimpleDesc; ...@@ -12,7 +12,6 @@ extern const af_simple_descriptor_t kInterpanSimpleDesc;
#define INTERPAN_EVENT_INIT 0x00 // interPan Event #define INTERPAN_EVENT_INIT 0x00 // interPan Event
#define INTERPAN_EVENT_OFF 0x01 // #define INTERPAN_EVENT_OFF 0x01 //
#define INTERPAN_AUTO_OFF_TIME (10 * 60 * 1000)
#define INTERPAN_DELAY_SEND_INTERVAL (3 * 1000) #define INTERPAN_DELAY_SEND_INTERVAL (3 * 1000)
#define INTERPAN_DELAY_SEND_TIMES (2) #define INTERPAN_DELAY_SEND_TIMES (2)
#define INTERPAN_CHANNEL 20 #define INTERPAN_CHANNEL 20
...@@ -30,7 +29,8 @@ typedef struct{ ...@@ -30,7 +29,8 @@ typedef struct{
uint8_t reserved[8]; uint8_t reserved[8];
}INCOM_MESSAGE_INFO; }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_dataSendConfirm(void *arg);
void afInterpan_rx_handler(void *arg); void afInterpan_rx_handler(void *arg);
void kInterpanDisable(void); void kInterpanDisable(void);
...@@ -38,5 +38,7 @@ kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode); ...@@ -38,5 +38,7 @@ kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode);
void kInterpan_Init(void); void kInterpan_Init(void);
bool kInterPanSetEnableStatus(uint8_t enable); bool kInterPanSetEnableStatus(uint8_t enable);
bool kInterPanGetEnableStatus(void);
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming); void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming);
#endif /* _SAMPLE_LIGHT_H_ */ #endif /* _SAMPLE_LIGHT_H_ */
...@@ -86,6 +86,8 @@ ...@@ -86,6 +86,8 @@
#define UART_MSG_QUERY_SWITCH_ONOFF_OPCODE 0xED06 #define UART_MSG_QUERY_SWITCH_ONOFF_OPCODE 0xED06
#define UART_MSG_ENTER_FACTORY_TEST_OPCODE 0xED14 #define UART_MSG_ENTER_FACTORY_TEST_OPCODE 0xED14
#define UART_MSG_ONOFF_SWITCH_OPCODE 0xED15 #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_GPIO_TEST_OPCODE 0xED10
#define UART_MSG_READ_RSSI_REQUEST_OPCODE 0xED12 #define UART_MSG_READ_RSSI_REQUEST_OPCODE 0xED12
...@@ -172,6 +174,7 @@ typedef enum { ...@@ -172,6 +174,7 @@ typedef enum {
ERR_WRITE_FAILED=0x04, ERR_WRITE_FAILED=0x04,
ERR_READ_WRITE_TIMEOUT=0x05, ERR_READ_WRITE_TIMEOUT=0x05,
ERR_NOT_EXIST=0x06, ERR_NOT_EXIST=0x06,
ERR_EXEC_FAILED=0xe0,
ERR_UNKNOW=0xFF, ERR_UNKNOW=0xFF,
}ERR_RET_E; }ERR_RET_E;
typedef enum { Z3D_COORDINATOR = 0, Z3D_ROUTER, Z3D_ENDDEVICE }Z3DevTypeEm; typedef enum { Z3D_COORDINATOR = 0, Z3D_ROUTER, Z3D_ENDDEVICE }Z3DevTypeEm;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "ikk-cluster.h" #include "ikk-cluster.h"
#include "ikk-interpan.h" #include "ikk-interpan.h"
#include "ikk-factory-test.h" #include "ikk-factory-test.h"
#include "ikk-ota.h"
#include "../../../../zigbee/aps/aps_api.h" #include "../../../../zigbee/aps/aps_api.h"
#include "../../../../zigbee/common/includes/zb_common.h" #include "../../../../zigbee/common/includes/zb_common.h"
/********************************************************************** /**********************************************************************
...@@ -24,6 +25,18 @@ addrExt_t g_Eui64GatewayAddr = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; ...@@ -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} }; 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 value
static bool g_bIsNwkJoiningFlg = false; static bool g_bIsNwkJoiningFlg = false;
...@@ -75,7 +88,11 @@ bool IsSteeringNwkTimeout(void) ...@@ -75,7 +88,11 @@ bool IsSteeringNwkTimeout(void)
void Set_Nwk_Steering_Status(NwkSteeringStatusEnum Status) void Set_Nwk_Steering_Status(NwkSteeringStatusEnum Status)
{ {
NetworkSteeringState = 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]. /* DESP: 高精度随机值接口,取值[minNum, maxNum].
Auth: dingmz_frc.20190701. Auth: dingmz_frc.20190701.
...@@ -225,8 +242,17 @@ void kNwkGetGateWayEui64(addrExt_t eui64) ...@@ -225,8 +242,17 @@ void kNwkGetGateWayEui64(addrExt_t eui64)
* */ * */
void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst ) void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst )
{ {
extern bool interpanleaveflg;
if(interpanleaveflg)
{
interpanleaveflg = false;
return;
}
g_eCurrentNetworkStatus = nwkst; g_eCurrentNetworkStatus = nwkst;
iKonkeAfSelfPrint("!!!g_eCurrentNetworkStatus = %d, g_eLastNetworkStatus = %d\r\n",g_eCurrentNetworkStatus, g_eLastNetworkStatus);
if( g_eCurrentNetworkStatus != g_eLastNetworkStatus ) { if( g_eCurrentNetworkStatus != g_eLastNetworkStatus ) {
g_eLastNetworkStatus = g_eCurrentNetworkStatus; g_eLastNetworkStatus = g_eCurrentNetworkStatus;
...@@ -241,6 +267,14 @@ void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst ) ...@@ -241,6 +267,14 @@ void kNwkNetworkStatusNotifyCall(NwkStatusEnum nwkst )
Gateway_IEEE_Addr_Save(addr); Gateway_IEEE_Addr_Save(addr);
iKonkeAfSelfPrint("#####kNwkNetworkStatusNotifyCall,Join Network addr=%x%x%x%x-%x%x%x%x!\r\n", 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]); 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. /* DESP: Network module tick loop handler interface.
...@@ -250,7 +284,7 @@ void kNwkModuleActionDetectCallback(void ) ...@@ -250,7 +284,7 @@ void kNwkModuleActionDetectCallback(void )
{ {
//static EmberNetworkStatus s_old_network_st = EMBER_NO_NETWORK; //static EmberNetworkStatus s_old_network_st = EMBER_NO_NETWORK;
static uint16_t ucRestoreSteeringCount = 0; static uint16_t ucRestoreSteeringCount = 0;
//iKonkeAfSelfPrint("g_u32NwkJoiningCountdownCounter = %d,zb_isDeviceJoinedNwk = %d 111111111111\r\n",g_u32NwkJoiningCountdownCounter,zb_isDeviceJoinedNwk());
// joining procedure // joining procedure
if( g_u32NwkJoiningCountdownCounter > 0 ) { if( g_u32NwkJoiningCountdownCounter > 0 ) {
--g_u32NwkJoiningCountdownCounter; --g_u32NwkJoiningCountdownCounter;
...@@ -380,17 +414,18 @@ bool kNwkIsExiting(void) ...@@ -380,17 +414,18 @@ bool kNwkIsExiting(void)
* */ * */
void kNwkFactoryReset(bool is_nwk_indicator) void kNwkFactoryReset(bool is_nwk_indicator)
{ {
iKonkeAfSelfPrint("######kNwkFactoryReset is_nwk_indicator1111111111111111111111111(%d)\r\n", is_nwk_indicator);
kNwkJoiningStart(0, NULL); kNwkJoiningStart(0, NULL);
memset(g_Eui64GatewayAddr, 0xFF, sizeof(g_Eui64GatewayAddr)); memset(g_Eui64GatewayAddr, 0xFF, sizeof(g_Eui64GatewayAddr));
Gateway_IEEE_Addr_Save(g_Eui64GatewayAddr); Gateway_IEEE_Addr_Save(g_Eui64GatewayAddr);
// //add by maozj 20200320 // //add by maozj 20200320
//#if Z30_DEVICE_OTA_ENABLE #if Z30_DEVICE_OTA_ENABLE
// kSetOTAStatus(OTA_NORMAL); kSetOTAStatus(OTA_NORMAL);
//#endif #endif
// EmberNodeId node = 0xFFFF; uint16_t node = 0xFFFF;
// kNwksaveNodeIdToFlash(node); kNwksaveNodeIdToFlash(node);
g_u32NwkJoiningCountdownCounter = 0; g_u32NwkJoiningCountdownCounter = 0;
// g_u32EnrollResultCheckCounter = 0; // g_u32EnrollResultCheckCounter = 0;
...@@ -400,7 +435,8 @@ void kNwkFactoryReset(bool is_nwk_indicator) ...@@ -400,7 +435,8 @@ void kNwkFactoryReset(bool is_nwk_indicator)
//led can blink when network leaved //led can blink when network leaved
if (is_nwk_indicator == true){ if (is_nwk_indicator == true){
zb_factoryReset(); if(zb_isDeviceJoinedNwk())//true status
zb_factoryReset();
g_KeyPressCauasLeave = true; g_KeyPressCauasLeave = true;
//add by maozj 20200407 for reset count down after network leaved //add by maozj 20200407 for reset count down after network leaved
g_u32NwkExitCountDownCounter = MS2COUNT(LED_FAST_BLINK_CONTINUE_TIME_MS); g_u32NwkExitCountDownCounter = MS2COUNT(LED_FAST_BLINK_CONTINUE_TIME_MS);
...@@ -444,7 +480,7 @@ void NetworkLeaveHandler(nlme_leave_cnf_t *pLeaveCnf) ...@@ -444,7 +480,7 @@ void NetworkLeaveHandler(nlme_leave_cnf_t *pLeaveCnf)
NwkStatusEnum kNwkGetCurrentStatus(void ) NwkStatusEnum kNwkGetCurrentStatus(void )
{ {
NwkStatusEnum status; NwkStatusEnum status;
if(zb_isDeviceJoinedNwk()){ if(zb_isDeviceJoinedNwk() ||(kInterPanGetEnableStatus())){
status = ENS_ONLINE; status = ENS_ONLINE;
g_bIsNwkJoiningFlg = false; g_bIsNwkJoiningFlg = false;
} }
...@@ -486,15 +522,16 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac ...@@ -486,15 +522,16 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac
if( u32JoiningDuration > 0 ) if( u32JoiningDuration > 0 )
{ {
#if Z30_DEVICE_AGING_ENABLE #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; return;
} }
#endif #endif
if(!zb_isDeviceJoinedNwk()) if(!zb_isDeviceJoinedNwk())
{ {
//disable interpan //disable interpan
kInterpanDisable(); if(kInterPanGetEnableStatus())
kInterpanDisable();
iKonkeAfSelfPrint("#####Set Steering Counter\r\n"); iKonkeAfSelfPrint("#####Set Steering Counter\r\n");
g_u32NwkJoiningCountdownCounter= MS2COUNT(u32JoiningDuration); g_u32NwkJoiningCountdownCounter= MS2COUNT(u32JoiningDuration);
g_pJoinCompleteCallback = callback; g_pJoinCompleteCallback = callback;
...@@ -502,6 +539,10 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac ...@@ -502,6 +539,10 @@ void kNwkJoiningStart(uint32_t u32JoiningDuration, pJoinCompleteCallback callbac
//add by maozj 20191206 //add by maozj 20191206
g_bNwkSteeringCompleteFlg = true; g_bNwkSteeringCompleteFlg = true;
g_eLastNetworkStatus = ENS_UNKNOW;
//add by Han. 20220210
g_bJoiningReportFlg = true;
} }
} }
else else
...@@ -518,6 +559,7 @@ status_t General_Report(uint8_t src_ep,uint8_t des_ep,uint16_t cluster,uint16_t ...@@ -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; static ReportAttrData_ST reportInfo;
uint8_t paload_len = 0; uint8_t paload_len = 0;
TL_SETSTRUCTCONTENT(dstEpInfo, 0); TL_SETSTRUCTCONTENT(dstEpInfo, 0);
iKonkeAfSelfPrint("General_Report111111\r\n");
dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP; dstEpInfo.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
dstEpInfo.dstEp = des_ep; 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 ...@@ -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); 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_ #ifndef _IKK_NETWORK_H_
#define _IKK_NETWORK_H_ #define _IKK_NETWORK_H_
#include "ikk-module-def.h" #include "ikk-module-def.h"
#include "ikk-opt-tunnel.h"
#include "ikk-debug.h" #include "ikk-debug.h"
#include "tl_common.h" #include "tl_common.h"
#include "zb_api.h" #include "zb_api.h"
...@@ -12,6 +13,9 @@ ...@@ -12,6 +13,9 @@
#define BINDING_CLUSTER_MAXN 8 #define BINDING_CLUSTER_MAXN 8
#define BINDING_EP_DEF 1 // default endpoint for binding #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 #define MAX_PALOAD_LEN 128
typedef struct tag_bind_objector_st { typedef struct tag_bind_objector_st {
......
...@@ -6,6 +6,11 @@ ...@@ -6,6 +6,11 @@
#include "ikk-config.h" #include "ikk-config.h"
#include "ikk-token.h" #include "ikk-token.h"
#include "../../../../zigbee/zcl/zcl_include.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 // FCC0-0000
#pragma pack(1) #pragma pack(1)
typedef struct tag_private_clsFCC0_attr0000_frame_st { typedef struct tag_private_clsFCC0_attr0000_frame_st {
...@@ -27,55 +32,27 @@ pFUNC_OPTDATA_MESSAGE_CALLBACK g_pOptDataIncomingMessageCallback = NULL; ...@@ -27,55 +32,27 @@ pFUNC_OPTDATA_MESSAGE_CALLBACK g_pOptDataIncomingMessageCallback = NULL;
extern bool Get_Model_ID(uint8_t *ModeID); extern bool Get_Model_ID(uint8_t *ModeID);
extern _CODE_ZCL_ zclReadCmd_t *zcl_parseInReadCmd(zclIncoming_t *pCmd); 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); 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);
// void kOptTunneCheckNodeIdIsChangedReport(void)
// {
// uint16_t currentNodeId= 0x1234;
// uint16_t savedNodeId;
//_CODE_ZCL_ status_t zcl_private_fcc0_register(u8 endpoint, u16 manuCode, u8 attrNum, const zclAttrInfo_t attrTbl[], cluster_forAppCb_t cb) if (zb_isDeviceJoinedNwk()){
//{ savedNodeId = kNwkgetNodeIdFromFlash();
// return zcl_registerCluster(endpoint, ZCL_CLUSTER_PRIVATE_FCC0, manuCode, attrNum, attrTbl, zcl_Private_cmdHandler, cb); currentNodeId = zb_getLocalShortAddr();
//} //iKonkeAfSelfPrint("!!!checkNodeIdIsChanged savedNodeId = %d, currentNodeId = %d\r\n", savedNodeId, currentNodeId);
// if (savedNodeId != currentNodeId){
//_CODE_ZCL_ static status_t zcl_private_clientCmdHandler(zclIncoming_t *pInMsg) //report AssociateAnnounce attr of private cluster
//{ iKonkeAfSelfPrint("!!!checkNodeIdIsChanged savedNodeId = %d, currentNodeId = %d\r\n", savedNodeId, currentNodeId);
// u8 status = ZCL_STA_SUCCESS; if (savedNodeId != 0xFFFF){
// apsdeDataInd_t *pApsdeInd = (apsdeDataInd_t*)pInMsg->msg; kOptTunnelCommonReport(ECA_ASSOCIATED_AOUNCE);
// iKonkeAfSelfPrint("#############zcl_private_clientCmdHandler ,command id =%x!!!!!!!\r\n",pInMsg->hdr.cmd); }
//// switch(pInMsg->hdr.cmd) //save changed nodeId to flash
//// { kNwksaveNodeIdToFlash(currentNodeId);
//// 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;
// }
//}
//
uint8_t kOptTunnelChunkRead(uint8_t endpoint, uint8_t kOptTunnelChunkRead(uint8_t endpoint,
uint16_t clusterId, uint16_t clusterId,
uint16_t attributeId, uint16_t attributeId,
...@@ -83,7 +60,7 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint, ...@@ -83,7 +60,7 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint,
uint8_t *buffer, uint8_t *buffer,
uint8_t *length_out) 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; uint8_t length = 0;
if (buffer == NULL){ if (buffer == NULL){
iKonkeAfSelfPrint("Err: Buffer is null(%d)!!\r\n"); iKonkeAfSelfPrint("Err: Buffer is null(%d)!!\r\n");
...@@ -113,6 +90,10 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint, ...@@ -113,6 +90,10 @@ uint8_t kOptTunnelChunkRead(uint8_t endpoint,
memcpy(&buffer[1], INSTALL_CODE_TOKEN_GET(), length); memcpy(&buffer[1], INSTALL_CODE_TOKEN_GET(), length);
break; break;
} }
case (ZCL_CHUNK_N1_ATTRIBUTE_ID):
{
break;
}
default: default:
return 0xfe; return 0xfe;
} }
...@@ -153,32 +134,32 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData) ...@@ -153,32 +134,32 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData)
u16 clusterId = pInHdlrMsg->msg->indInfo.cluster_id; u16 clusterId = pInHdlrMsg->msg->indInfo.cluster_id;
u8 endpoint = pInHdlrMsg->msg->indInfo.dst_ep; u8 endpoint = pInHdlrMsg->msg->indInfo.dst_ep;
/* Parse In Read Command */ /* Parse In Read Command */
zclReadCmd_t *pReadCmd = zcl_parseInReadCmd(pInHdlrMsg); u8 *pBuf = pInHdlrMsg->pData;
if(pReadCmd == NULL){ zclReadCmd_t pReadCmd ={0};
return ZCL_STA_INSUFFICIENT_SPACE; pReadCmd.numAttr = pInHdlrMsg->dataLen / 2; //attr ID
}else{ for(u8 i = 0; i < pReadCmd.numAttr; i++){
pInHdlrMsg->attrCmd = (void *)pReadCmd; 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){ if(!pInHdlrMsg->msg->indInfo.security_status){
return ZCL_STA_FAILURE; status = ZCL_STA_FAILURE;
} }
/* Build Read Response Command */ /* 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); zclReadRspCmd_t *pReadRspCmd = (zclReadRspCmd_t *)ev_buf_allocate(len);
if(!pReadRspCmd){ if(!pReadRspCmd){
return ZCL_STA_INSUFFICIENT_SPACE; 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].dataType = ZCL_DATA_TYPE_CHAR_STR;
pReadRspCmd->attrList[0].data = pData; pReadRspCmd->attrList[0].data = pData;
pReadRspCmd->attrList[0].attrID = pReadCmd->attrID[0];
pReadRspCmd->attrList[0].status = ZCL_STA_SUCCESS;
epInfo_t dstEp; epInfo_t dstEp;
TL_SETSTRUCTCONTENT(dstEp, 0); TL_SETSTRUCTCONTENT(dstEp, 0);
...@@ -191,8 +172,11 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData) ...@@ -191,8 +172,11 @@ status_t kOptTunnelMessageReadResponse(zclIncoming_t *pInHdlrMsg,uint8_t *pData)
if(pInHdlrMsg->msg->indInfo.security_status & SECURITY_IN_APSLAYER){ if(pInHdlrMsg->msg->indInfo.security_status & SECURITY_IN_APSLAYER){
dstEp.txOptions |= APS_TX_OPT_SECURITY_ENABLED; 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); 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; return status;
} }
status_t kOptTunnelMessageWriteResponse(zclIncoming_t *pCmd,uint8_t *pData) status_t kOptTunnelMessageWriteResponse(zclIncoming_t *pCmd,uint8_t *pData)
...@@ -204,7 +188,6 @@ 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 i =0;
uint8_t payload_len = pData[0]; uint8_t payload_len = pData[0];
// 8 0 51 86 10 0 0 0 0 // 8 0 51 86 10 0 0 0 0
if(pCmd->hdr.cmd == ZCL_CMD_WRITE){ if(pCmd->hdr.cmd == ZCL_CMD_WRITE){
tmp_buffer[i++] = 0x00; tmp_buffer[i++] = 0x00;
...@@ -242,16 +225,21 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd) ...@@ -242,16 +225,21 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
kk_err_t status = KET_OK; 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} // 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 //out 6 0 51 86 10 0 0 0
iKonkeAfSelfPrint("\r\n-------------------------\r\n");
// device id // device id
uint32_t modeid = (uint32_t)MODEL_ID; uint32_t modeid = (uint32_t)MODEL_ID;
uint16_t attribute_id = 0xffff;
uint8_t tmp_buffer[6]; uint8_t tmp_buffer[6];
tmp_buffer[0] = 5; tmp_buffer[0] = 5;
tmp_buffer[1] = modeid>>24; tmp_buffer[1] = modeid>>24;
tmp_buffer[2] = modeid>>16; tmp_buffer[2] = modeid>>16;
tmp_buffer[3] = modeid>>8; tmp_buffer[3] = modeid>>8;
tmp_buffer[4] = modeid; 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) { switch(method) {
case (EOM_WRITE): case (EOM_WRITE):
{ {
...@@ -260,10 +248,13 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd) ...@@ -260,10 +248,13 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
memcpy(g_tmp_buffer, pCmd->pData+4, length); memcpy(g_tmp_buffer, pCmd->pData+4, length);
g_tmp_length = length; g_tmp_length = length;
} }
iKonkeAfSelfPrint("#######kOptTunnelMessageIncoming length(0x%d)\r\n", length); iKonkeAfSelfPrint("#######kOptTunnelMessageIncoming length(0x%d)\r\n", length);
iKonkeAfSelfPrintBuffer(g_tmp_buffer,length); iKonkeAfSelfPrintBuffer(g_tmp_buffer,length);
//copy device id //copy device id
memcpy(&g_tmp_buffer[1],&tmp_buffer[1],4); memcpy(&g_tmp_buffer[1],&tmp_buffer[1],4);
// switch(attribute_id) // switch(attribute_id)
// { // {
...@@ -271,7 +262,29 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd) ...@@ -271,7 +262,29 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
// { // {
if( length >= 7 ) { if( length >= 7 ) {
iKonkeAfSelfPrint("\r\n########################OPTDATA WRITE,g_tmp_length = %d\r\n",g_tmp_length); 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; 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)){ 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; return KET_NO_RESPONSE;
...@@ -293,10 +306,10 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd) ...@@ -293,10 +306,10 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
} }
case (EOM_READ ): case (EOM_READ ):
{ {
// switch(attribute_id){ switch(attribute_id){
// // OptData read command is same to write opcode 0x00, read the device snap. // OptData read command is same to write opcode 0x00, read the device snap.
// case (ECA_OPTDATA): case (ECA_OPTDATA):
// { {
iKonkeAfSelfPrint("\r\n########################OPTDATA READ\r\n"); iKonkeAfSelfPrint("\r\n########################OPTDATA READ\r\n");
if( g_pOptDataIncomingMessageCallback ) { if( g_pOptDataIncomingMessageCallback ) {
memcpy(&g_tmp_buffer[2],&tmp_buffer[1],4); memcpy(&g_tmp_buffer[2],&tmp_buffer[1],4);
...@@ -311,9 +324,63 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd) ...@@ -311,9 +324,63 @@ kk_err_t kOptTunnelMessageIncoming(OptMethodEm method,zclIncoming_t *pCmd)
g_tmp_buffer[1] = g_tmp_length - 1; //string length g_tmp_buffer[1] = g_tmp_length - 1; //string length
kOptTunnelMessageReadResponse(pCmd, g_tmp_buffer); 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; break;
} }
default: break; default: break;
...@@ -339,7 +406,7 @@ static status_t kOptTunnelCommonReportSend(uint16_t attribute_id, uint8_t *arg, ...@@ -339,7 +406,7 @@ static status_t kOptTunnelCommonReportSend(uint16_t attribute_id, uint8_t *arg,
/* DESP: Private protocol common report interface. /* DESP: Private protocol common report interface.
* Auth: dingmz_frc.20191113. * 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 ) { if( attribute_id == OPTTUNNEL_UNKNOW ) {
return KET_ERR_NON_EXIST; return KET_ERR_NON_EXIST;
...@@ -347,7 +414,6 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id ) ...@@ -347,7 +414,6 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
kk_err_t err = KET_OK; kk_err_t err = KET_OK;
uint8_t bufCount = 0; uint8_t bufCount = 0;
switch(attribute_id) { switch(attribute_id) {
case (ECA_OPTDATA): case (ECA_OPTDATA):
{ {
...@@ -390,7 +456,7 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id ) ...@@ -390,7 +456,7 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
break; break;
} }
case (ECA_CMEI): case (ECA_CMEI):
case (ECA_ISN ): case (ECA_ISN):
{ {
g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN; g_tmp_length = OPTTUNNEL_CHUNK_MAXLEN;
kOptTunnelAttrChunkLocalRead(attribute_id, g_tmp_buffer, &g_tmp_length); kOptTunnelAttrChunkLocalRead(attribute_id, g_tmp_buffer, &g_tmp_length);
...@@ -414,6 +480,10 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id ) ...@@ -414,6 +480,10 @@ kk_err_t kOptTunnelCommonReport(uint16_t attribute_id )
err = KET_FAILED; err = KET_FAILED;
} }
g_tmp_length = 0;
g_tmp_buffer[0] = 0;
memset(g_tmp_buffer,0,32);
return err; return err;
} }
/* DESP: Private protocol message(command) reporting interface /* DESP: Private protocol message(command) reporting interface
...@@ -450,4 +520,40 @@ kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCal ...@@ -450,4 +520,40 @@ kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCal
return KET_OK; 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); ...@@ -71,8 +71,10 @@ void Set2NwkJoiningCountdownCounter(u32 time_ms);
* */ * */
kk_err_t kOptTunnelModuleInit(pFUNC_OPTDATA_MESSAGE_CALLBACK pOptdataIncomingCallback ); 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 ); 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.h"
//#include "app/framework/plugin/network-steering/network-steering-internal.h" //#include "app/framework/plugin/network-steering/network-steering-internal.h"
#include "ikk-ota.h" #include "ikk-ota.h"
...@@ -21,11 +22,6 @@ pOTACallback g_pOTACallback = NULL; ...@@ -21,11 +22,6 @@ pOTACallback g_pOTACallback = NULL;
static void kOTAMoudleOptCallback(OTAStatusEnum status); static void kOTAMoudleOptCallback(OTAStatusEnum status);
//__no_init OTAGpioStatusST g_stOTAGpioStatus @ 0x2000FFF0;
static OTAGpioStatusST g_stOTAGpioStatus;
OTAStatusEnum kGetOTAStatus(void) OTAStatusEnum kGetOTAStatus(void)
{ {
return g_eOTAStatus; return g_eOTAStatus;
...@@ -76,7 +72,6 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status) ...@@ -76,7 +72,6 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status)
break; break;
case OTA_DOWNLOAD_DONE: case OTA_DOWNLOAD_DONE:
{ {
g_eOTAStatus = OTA_DOWNLOAD_DONE; g_eOTAStatus = OTA_DOWNLOAD_DONE;
break; break;
} }
...@@ -99,3 +94,4 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status) ...@@ -99,3 +94,4 @@ static void kOTAMoudleOptCallback(OTAStatusEnum status)
break; break;
} }
} }
*/
/*
#ifndef __IKONKE_MODULE_OTA_H_______________________ #ifndef __IKONKE_MODULE_OTA_H_______________________
#define __IKONKE_MODULE_OTA_H_______________________ #define __IKONKE_MODULE_OTA_H_______________________
#include "tl_common.h" #include "tl_common.h"
...@@ -9,7 +10,6 @@ ...@@ -9,7 +10,6 @@
typedef enum{OTA_NORMAL=0, OTA_START,OTA_DOWNLOAD_DONE, OTA_VERITY_SUCCEED, OTA_FAILED}OTAStatusEnum; 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字节对齐 #pragma pack(1) //按1字节对齐
typedef struct { typedef struct {
...@@ -40,3 +40,4 @@ void kOTAMoudleCallback(OTAStatusEnum status); ...@@ -40,3 +40,4 @@ void kOTAMoudleCallback(OTAStatusEnum status);
#endif #endif
*/
...@@ -111,12 +111,13 @@ bool kGetIndicatorNotDisturbModeFlg(void) ...@@ -111,12 +111,13 @@ bool kGetIndicatorNotDisturbModeFlg(void)
st = nv_flashReadNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(temp), (u8*)&temp); st = nv_flashReadNew(1, NV_MODULE_APP, NV_NO_DISTURB_MODE, sizeof(temp), (u8*)&temp);
if(st != NV_SUCC){ if(st != NV_SUCC){
temp = 0; temp = 0;
iKonkeAfSelfPrint("kGetIndicatorNotDisturbModeFlg failed!!\r\n"); //iKonkeAfSelfPrint("kGetIndicatorNotDisturbModeFlg failed!!\r\n");
} }
iKonkeAfSelfPrint("Read st =%d,data=%d\r\n",st,temp); //iKonkeAfSelfPrint("Read st =%d,data=%d\r\n",st,temp);
return (temp == 1) ;
return (temp == 1) ;
} }
nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value) nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
{ {
nv_sts_t st = NV_SUCC; nv_sts_t st = NV_SUCC;
...@@ -132,6 +133,7 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value) ...@@ -132,6 +133,7 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value)
{ {
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n"); iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n");
} }
return st; return st;
} }
...@@ -144,9 +146,10 @@ bool kGetInterpanEnableFlg(void) ...@@ -144,9 +146,10 @@ bool kGetInterpanEnableFlg(void)
temp = 1; temp = 1;
iKonkeAfSelfPrint("kGetInterpanEnableFlg failed!!\r\n"); iKonkeAfSelfPrint("kGetInterpanEnableFlg failed!!\r\n");
} }
return (temp == 1) ;
return (temp == 1) ;
} }
nv_sts_t kSetInterpanEnableFlg(uint8_t value) nv_sts_t kSetInterpanEnableFlg(uint8_t value)
{ {
nv_sts_t st = NV_SUCC; nv_sts_t st = NV_SUCC;
...@@ -156,6 +159,35 @@ nv_sts_t kSetInterpanEnableFlg(uint8_t value) ...@@ -156,6 +159,35 @@ nv_sts_t kSetInterpanEnableFlg(uint8_t value)
{ {
iKonkeAfSelfPrint("kSetIndicatorNotDisturbModeFlg failed!!\r\n"); 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; return st;
} }
...@@ -288,7 +320,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len) ...@@ -288,7 +320,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len)
//same data ,not need rewrite! //same data ,not need rewrite!
return 0; return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.modeid,0xff,32)){ }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; return 0;
}else{ }else{
sOptunnel_Token_temp.modeid.modeid_len = len; 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) ...@@ -309,7 +345,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len)
//same data ,not need rewrite! //same data ,not need rewrite!
return 0; return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.cmei,0xff,32)){ }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; return 0;
}else{ }else{
sOptunnel_Token_temp.cmei.cmei_len = len; 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) ...@@ -330,7 +370,11 @@ uint8_t General_Custom_Token_Save(uint8_t item,uint8_t *buff,uint8_t len)
//same data ,not need rewrite! //same data ,not need rewrite!
return 0; return 0;
}else if(All_Same_Data((uint8_t*)&sOptunnel_Token_temp.isn,0xff,32)){ }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; return 0;
}else{ }else{
sOptunnel_Token_temp.isn.isn_len = len; sOptunnel_Token_temp.isn.isn_len = len;
......
...@@ -82,6 +82,10 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value); ...@@ -82,6 +82,10 @@ nv_sts_t kSetIndicatorNotDisturbModeFlg(uint8_t value);
nv_sts_t kSetInterpanEnableFlg(uint8_t value); nv_sts_t kSetInterpanEnableFlg(uint8_t value);
bool kGetInterpanEnableFlg(void); bool kGetInterpanEnableFlg(void);
uint16_t kNwkgetNodeIdFromFlash(void);
nv_sts_t kNwksaveNodeIdToFlash(uint16_t node_id);
#if 1 #if 1
void falsh_test(uint8_t count); void falsh_test(uint8_t count);
#endif #endif
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -216,5 +216,15 @@ ...@@ -216,5 +216,15 @@
<type>1</type> <type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/platform/services/b85m/irq_handler.c</locationURI> <locationURI>PARENT-2-PROJECT_LOC/platform/services/b85m/irq_handler.c</locationURI>
</link> </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> </linkedResources>
</projectDescription> </projectDescription>
...@@ -360,6 +360,7 @@ typedef enum{ ...@@ -360,6 +360,7 @@ typedef enum{
NV_NO_DISTURB_MODE, //lmm add NV_NO_DISTURB_MODE, //lmm add
NV_AGING_TEST_TIME, //lmm add NV_AGING_TEST_TIME, //lmm add
NV_INTERPAN_ENABLE_FLG, //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_ID_MAX = 0xFF,/* Item id 0xFF should not be used. */
}nv_item_t; }nv_item_t;
......
...@@ -228,6 +228,7 @@ buf_sts_t ev_buf_free(u8 *pBuf) ...@@ -228,6 +228,7 @@ buf_sts_t ev_buf_free(u8 *pBuf)
#endif #endif
ZB_EXCEPTION_POST(SYS_EXCEPTTION_EV_BUFFER_EXCEPTION_FREE_OVERFLON); ZB_EXCEPTION_POST(SYS_EXCEPTTION_EV_BUFFER_EXCEPTION_FREE_OVERFLON);
} }
ev_bufItem_t *pDelBuf = ev_buf_getHead(pBuf); ev_bufItem_t *pDelBuf = ev_buf_getHead(pBuf);
...@@ -247,7 +248,9 @@ buf_sts_t ev_buf_free(u8 *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)); 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 #if EV_BUFFER_DEBUG
pDelBuf->line = line; pDelBuf->line = line;
......
...@@ -47,8 +47,7 @@ ...@@ -47,8 +47,7 @@
* INCLUDES * INCLUDES
*/ */
#include "zcl_include.h" #include "zcl_include.h"
#include "../common/00ikonke_app/general/ikk-cluster.h"
/********************************************************************** /**********************************************************************
* LOCAL CONSTANTS * LOCAL CONSTANTS
*/ */
...@@ -643,6 +642,7 @@ _CODE_ZCL_ static u8 zcl_buildHdr(u8 *buf, u8 clusterSpec, u8 dir, u8 disDefRsp, ...@@ -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, _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) 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); u8 *asdu = (u8 *)ev_buf_allocate(sizeof(zclHdr_t) + cmdPldLen);
if(!asdu){ if(!asdu){
return ZCL_STA_INSUFFICIENT_SPACE; return ZCL_STA_INSUFFICIENT_SPACE;
...@@ -1063,8 +1063,8 @@ _CODE_ZCL_ status_t zcl_readRspHandler(zclIncoming_t *pCmd) ...@@ -1063,8 +1063,8 @@ _CODE_ZCL_ status_t zcl_readRspHandler(zclIncoming_t *pCmd)
_CODE_ZCL_ zclReadCmd_t *zcl_parseInReadCmd(zclIncoming_t *pCmd) _CODE_ZCL_ zclReadCmd_t *zcl_parseInReadCmd(zclIncoming_t *pCmd)
{ {
u8 *pBuf = pCmd->pData; u8 *pBuf = pCmd->pData;
zclReadCmd_t *p = (zclReadCmd_t *)ev_buf_allocate(sizeof(zclReadCmd_t) + pCmd->dataLen); zclReadCmd_t *p = (zclReadCmd_t *)ev_buf_allocate(sizeof(zclReadCmd_t) + pCmd->dataLen);
if(p != NULL){ if(p != NULL){
p->numAttr = pCmd->dataLen / 2; //attr ID p->numAttr = pCmd->dataLen / 2; //attr ID
for(u8 i = 0; i < p->numAttr; i++){ 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 ...@@ -1656,7 +1656,42 @@ _CODE_ZCL_ status_t zcl_report(u8 srcEp, epInfo_t *pDstEpInfo, u8 disableDefault
*pBuf++ = dataType; *pBuf++ = dataType;
memcpy(pBuf, pData, attrSize); 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); 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); ev_buf_free(buf);
......
...@@ -562,7 +562,7 @@ typedef struct { ...@@ -562,7 +562,7 @@ typedef struct {
* @brief Definition for ZCL layer sequence number. * @brief Definition for ZCL layer sequence number.
*/ */
extern u8 zcl_seqNum; 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; extern const u16 zcl_attr_global_clusterRevision;
......
...@@ -465,6 +465,10 @@ _CODE_ZCL_ void reportNoMinLimit(void) ...@@ -465,6 +465,10 @@ _CODE_ZCL_ void reportNoMinLimit(void)
|| ((zcl_analogDataType(pAttrEntry->type) || ((zcl_analogDataType(pAttrEntry->type)
&& reportableChangeValueChk(pAttrEntry->type, pAttrEntry->data, pEntry->prevData, pEntry->reportableChange))) && 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 //lmm add for report control
extern bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId); extern bool kZclClusterReportChangeCallback(uint8_t endpoint, uint16_t clusterId, uint16_t attributeId);
if (!kZclClusterReportChangeCallback(pEntry->endPoint, pEntry->clusterID, pEntry->attrID)){ 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