Commit 4f207db8 authored by limm's avatar limm

add unincluded files

parent 682c75ca
#include <string.h>
#include "ikk-common-utils.h"
#include "ikk-debug.h"
#include "ikk-module-def.h"
#define NODE_MAX_NUM 64
#define NODE_ID_DEFAULT 0xFFFF
void SWAP_EUI64(uint8_t *ptr)
{
uint8_t temp;
for(uint8_t i = 0;i<4;i++)
{
temp = ptr[7-i];
ptr[7-i] = ptr[i];
ptr[i] = temp;
}
}
bool All_Same_Data(uint8_t *buffer,uint8_t value,uint8_t len)
{
if(buffer == NULL)
return false;
for(uint8_t i = 0;i<len;i++){
if(buffer[i] != value)
return false;
}
return true;
}
/* DESP: Gets the value[in 64-bits] of the specified length from the specified OCT string.
* Note: expected output value max 64bits, so max length input is 16!!!
Auth: dingmz_frc.20191018.
*/
uint64_t kUtilsOct2Value(char *oct, int length/* ≤ 16 */ )
{
char temp_string[(sizeof(uint64_t) << 1) + 1] = { 0 };
uint64_t u64ResultValue = 0;
int orgslen = strlen(oct);
// Check whether the string length is less than the specified length. If it is less than the specified length, high-order complement is required.
memset(temp_string, '0', sizeof(temp_string));
if( orgslen < length ) {
memcpy(temp_string + (length - orgslen), oct, orgslen);
}else {
memcpy(temp_string, oct, length);
}
//iKonkeAfSelfPrint("kUtilsOct2Value:::::[%s][%d]\r\n", temp_string, length);
for(int i = 0; i < length; ++i ) {
if( oct[i] > '9') {
u64ResultValue = 16 * u64ResultValue + (10 + temp_string[i] - 'a');
} else{
u64ResultValue = 16 * u64ResultValue + (temp_string[i] - '0');
}
}
return u64ResultValue;
}
/* DESP: Convert OCT string to hex data stream.
Auth: dingmz_frc.20191018.
*/
int kUtilsStr2Hex(char *octstr, unsigned char *phexout, int max_length )
{
if( NULL == octstr || NULL == phexout ) {
return -1;
}
int str_len = strlen(octstr), iox = 0;
for(int index = 0; index < str_len; index += 2 ) {
phexout[iox++] = (uint8_t)kUtilsOct2Value(octstr + index, 2);
if( iox >= max_length ) {
break;
}
}
return iox;
}
/********************************************************************************/
/* This function converts an HEX number to 2-byte string */
/* Auth: lmm_frc.20210607. */
/********************************************************************************/
void kUtilsHex2Str( uint8_t ucChar, uint8_t *pcResult )
{
uint8_t tmp;
tmp = ucChar & 0xF0; //calculate high
tmp = tmp >> 4;
if(tmp <= 9)
pcResult[0] = tmp + '0';
else
pcResult[0] = tmp - 10 + 'a';
tmp = ucChar & 0x0F; //calculate low
if(tmp <= 9)
pcResult[1] = tmp + '0';
else
pcResult[1] = tmp - 10 + 'a';
}
#if 0
//static const DataInfoSt s_datatype_def[] = STATIC_DATA_INFO_DEF;
// global common buffer.
uint8_t g_u8GlobalBufferN1[GLOBAL_BUFFER_SIZE] = { 0 }, g_u8GlobalBufferN2[GLOBAL_BUFFER_SIZE] = { 0 };
uint8_t g_u8GlobalLengthN1 = 0, g_u8GlobalLengthN2 = 0;
/* DESP: Gets the byte length of the specified data type.
* Auth: dingmz_frc.20191025.
* */
uint8_t kUtilsGetDataLength(uint8_t type )
{
for(int index = 0; index < (sizeof(s_datatype_def) / sizeof(DataInfoSt)); ++index ) {
if( s_datatype_def[index].datatype == type ) {
return s_datatype_def[index].length;
}
}
return 0;
}
/* DESP: Check whether the given string is a number.
* Auth: dingmz_frc.20191023.
* */
bool kUtilsIsNumber(char *string )
{
if( NULL == string ) return false;
int length = strlen(string);
if( length <= 0 ) return false;
for(int index = 0; index < length; ++index ) {
if( !isdigit(string[index])) {
if((length > 1) && (index == 0) && (string[index] == '-' || string[index] == '+')) {
// do nothing.
}else {
return false;
}
}
}
return true;
}
/* DESP: Check whether the given string is OCT string.
* Auth: dingmz_frc.20191023.
* */
bool kUtilsIsOct(char *string )
{
if( NULL == string ) return false;
int length = strlen(string);
if((length > 0) || ((length % 2) == 0)) {
for(int index = 0; index < length; ++index ) {
if( (string[index] >= '0' && string[index] <= '9') || (string[index] >= 'a' && string[index] <= 'f') ||
(string[index] >= 'A' && string[index] <= 'F')) {
// do nothing.
}else {
return false;
}
}
}else {
return false;
}
return true;
}
/* DESP: 高精度随机值接口,取值[minNum, maxNum].
Auth: dingmz_frc.20190701.
*/
uint32_t kUtilsGetRandNum(uint32_t minNum, uint32_t maxNum )
{
if( minNum >= maxNum ) {
return 0;
}
static uint32_t s_counter = 0;
//halCommonGetInt32uMillisecondTick();
uint8_t u8LocalEui64[8] = { 0 };
emberAfGetEui64(u8LocalEui64);
++s_counter;
srand(s_counter * s_counter + u8LocalEui64[0] + (emberAfGetNodeId() & 0x0567)); //提供随机种子
uint32_t randNum = minNum + rand() % (maxNum - minNum + 1);
iKonkeAfSelfPrint(" xxx rand num = %d\r\n", randNum);
return randNum;
}
/* DESP: check whether the data set content is specified byte data!
* Auth: dingmz_frc.20190520.
* */
bool kUtilsCheckDataSetContext(void *data_set, uint8_t spec_v, int length )
{
if( NULL == data_set ) {
return false;
}
uint8_t *data_v = (uint8_t *)data_set;
for(int index = 0; index < length; ++index ) {
if( data_v[index] != spec_v ) {
return false;
}
}
return true;
}
/* DESP: 64bits大小端转换.
Auth: dingmz_frc.20180627.
*/
uint64_t __CPU_ENDIAN_HTONLL__(uint64_t u64_host )
{
unsigned int u32_host_l = (u64_host >> 0) & 0xffffffff;
unsigned int u32_host_h = (u64_host >> 32) & 0xffffffff;
return ((((uint64_t)NT32(u32_host_l)) << 32 ) |
NT32(u32_host_h));
}
/* DESP: Check if it is a valid long address.
* Auth: dingmz_frc.20191106.
* */
bool kUtilsIsValidEui64Addr(EmberEUI64 ineui64addr )
{
return !kUtilsCheckDataSetContext(ineui64addr, 0xFF, EUI64_SIZE);
}
///* DESP: get the crc16 value of specific InstallCode.
// * Auth: dingmz_frc.20191007.
// * */
//uint16_t kUtilsInstallCodeX25CRC16(uint8_t* u8InstallCode, uint8_t length )
//{
// uint16_t crc = 0xFFFF;
// uint8_t index;
//
// if( NULL == u8InstallCode ) {
// return 0xff;
// }
//
// // Compute the CRC and verify that it matches. The bit reversals, byte swap,
// // and ones' complement are due to differences between halCommonCrc16 and the
// // Smart Energy version.
// for(index = 0; index < length; ++index ) {
// crc = halCommonCrc16(reverse(u8InstallCode[index]), crc);
// }
//
// crc = ~HIGH_LOW_TO_INT(reverse(LOW_BYTE(crc)), reverse(HIGH_BYTE(crc)));
//
// return crc;
//}
//
///* DESP: CRC16 algorithm.
// * Auth: dingmz_frc.20191018.
// * */
//uint16_t kUtilsCRC16Sum(const unsigned char *msg, unsigned int length )
//{
// unsigned short CRC = 0xFFFF;
// int i;
//
// while (length--) {
// CRC ^= *msg++;
// for (i = 0; i < 8; ++i ) {
// CRC=(CRC & 0x0001)?((CRC>>1) ^0xA001):(CRC>>1);
// }
// }
//
// return CRC;
//}
/* DESP: message format parse, String Segmentation parse into Substrings.
Auth: dingmz_frc.20180607.
*/
int kUtilsStringSplit(char *string, char (*item)[STRING_ITEM_SIZE_MAX], char spec/*分隔符*/)
{
if( NULL == string ) return 0;
uint8_t idex, item_idex = 0, cp_idex = 0;
char tmp_char;
// Parse...
for(idex = 0; idex < strlen(string); ++idex) {
tmp_char = string[idex];
if( tmp_char == spec ) {
item[item_idex][cp_idex] = '\0';
if( ++item_idex >= STRING_ITEM_NUM_MAX)
return -1;
cp_idex = 0;
}else {
item[item_idex][cp_idex] = tmp_char;
if( ++cp_idex >= STRING_ITEM_SIZE_MAX)
return -2;
}
}
item[item_idex][cp_idex] = '\0';
return item_idex + 1;
}
/* DESP: Reverse uint8 array contents.
* PARAM[bModifyOriginalData]: Note that this interface modifies the original data content When bModifyOriginalData is true!!!
Auth: dingmz_frc.20191019.
*/
uint8_t *kUtilsReverseArrayU8int(uint8_t *org_data, int length, bool bModifyOriginalData )
{
static uint8_t s_image_data[16] = { 0 };
if((NULL == org_data || length <= 0) || length > sizeof(s_image_data)) {
return NULL;
}
for(int index = 0; index < length; ++index ) {
s_image_data[index] = org_data[length - 1 - index];
}
if( bModifyOriginalData ) {
memcpy(org_data, s_image_data, length);
}
return s_image_data;
}
static void kArraySort(uint32_t *buf, uint8_t size)
{
uint8_t i, j;
uint32_t t;
for (j = 0; j< size;j++) {
for(i = 0;i < size-1-j; i++){
if(buf[i] > buf[i+1]) /* 由小到大,由大到小时改为< */{
t = buf[i];
buf[i] = buf[i+1];
buf[i+1] = t;
}
}
}
}
/*
对一个buffer数据进行排序去除最大的和最小的滤波个数取平均值
filter_num 滤波最大和最小的个数, 相等的
*/
uint32_t kUtilsGetAverage(uint32_t *buf, uint8_t len, uint8_t filter_num) //计算平均值
{
uint64_t temp_val = 0;
uint8_t i;
if (len < 2){
return 0;
}
if (len <= filter_num * 2){
filter_num = 0;
}
printf("\r\nbefore average = ");
for (int8_t i= 0; i < len; i++){
printf("%d ", buf[i]);
}
kArraySort(buf, len); //排序
printf("\r\nbuffer data = ");
for (i = filter_num; i < len - filter_num ; i++){
emberAfCorePrint("%d ", buf[i]);
temp_val += buf[i];
}
printf("");
return temp_val / (len - 2 *filter_num);
}
//Jun 7 2021
//0123456789A
uint32_t Get_Date_Code( uint8_t * pData, uint8_t *pStr )
{
uint8_t aucDate[4];
uint8_t i = 0;
switch( pData[0] )
{
case 'J':
if ( pData[i+1] == 'a' ) // Jan
aucDate[2] = 1;
else if ( pData[i+2] == 'n' ) // Jun
aucDate[2] = 6;
else
aucDate[2] = 7; // Jul
break;
case 'F':
aucDate[2] = 2; // Feb
break;
case 'M':
if ( pData[i+2] == 'r' ) // Mar
aucDate[2] = 3;
else
aucDate[2] = 5; // May
break;
case 'A':
if ( pData[i+2] == 'r' ) // Apr
aucDate[2] = 4;
else
aucDate[2] = 8; // Aug
break;
case 'S':
aucDate[2] = 9; // Sep
break;
case 'O':
aucDate[2] = 0x10; // Oct use hex for BCD
break;
case 'N':
aucDate[2] = 0x11; // Nov
break;
case 'D':
aucDate[2] = 0x12; // Dec
break;
}
kUtilsStr2Hex((uint8_t*)pData + 7,(uint8_t*)aucDate,1);
kUtilsStr2Hex((uint8_t*)pData + 9,(uint8_t*)aucDate+1,1);
kUtilsStr2Hex((uint8_t*)pData + 4,(uint8_t*)aucDate+3,1);
emberAfCorePrintln("\r\nbuffer data = \r\n");
for (i = 0; i < 4 ; i++){
emberAfCorePrint("Buffer Data %d ", aucDate[i]);
}
emberAfCorePrintln("\r\n");
if ( pStr != NULL )
{
MEMCOPY( pStr, pData+7, 4 ); // year
kUtilsHex2Str( aucDate[2], pStr+4 ); // month
kUtilsHex2Str( aucDate[3], pStr+6 ); // Date
pStr[8] = ' ';
MEMCOPY( pStr+9, pData+i+1, 5 ); // Hour & minute
pStr[14] = 0;
}
return GET_U32_B(aucDate);
}
#endif
#ifndef __IKONKE_COMMON_UTILS_H______________________________
#define __IKONKE_COMMON_UTILS_H______________________________
#include "ikk-module-def.h"
#define U16MERG(h,l) ((((uint16_t)(h)) << 8) | (l))
#define U32MERG(b3,b2,b1,b0) ((((uint32_t)(b3)) << 24) | (((uint32_t)(b2)) << 16) | (((uint32_t)(b1)) << 8) | (b0))
#define GET_U32_L( x ) (uint32_t)( (x[3]<<24)+(x[2]<<16)+(x[1]<<8)+x[0] )
#define GET_U32_B( x ) (uint32_t)( (x[0]<<24)+(x[1]<<16)+(x[2]<<8)+x[3] )
#define H3_UINT32(a) (((a) >> 24) & 0xFF)
#define H2_UINT32(a) (((a) >> 16) & 0xFF)
#define H1_UINT32(a) (((a) >> 8) & 0xFF)
#define H0_UINT32(a) ((a) & 0xFF)
#define HI_UINT16(a) (((a) >> 8) & 0xFF)
#define LO_UINT16(a) ((a) & 0xFF)
#define UINT16_HL(a,b) (((((uint16_t)(a)) << 8)&(0XFF00)) | ((0X00FF)&(b)))
#define UINT32_HL(a,b,c,d) ( ((((uint32_t)(a)) << 24)&(0XFF000000)) | ((((uint32_t)(b)) << 16)&(0X00FF0000))| \
((((uint32_t)(c)) << 8)&(0X0000FF00)) | ((0X000000FF)&(d)))
#define S_CMP(s1,s2) (strcmp((s1),(s2)) == 0)
#define M_CMP(m1,m2,n) (memcmp((m1),(m2),(n)) == 0)
// 子字符串解析
#define STRING_ITEM_NUM_MAX 8
#define STRING_ITEM_SIZE_MAX 48
typedef char (*StrSubItem)[STRING_ITEM_SIZE_MAX];
void SWAP_EUI64(uint8_t *ptr);
bool All_Same_Data(uint8_t *buffer,uint8_t value,uint8_t len);
/* DESP: Convert OCT string to hex data stream.
Auth: dingmz_frc.20191018.
*/
int kUtilsStr2Hex(char *octstr, unsigned char *phexout, int max_length );
/* DESP: Convert hex data to OCT string stream.
Auth: LMM_frc.20210607.
*/
void kUtilsHex2Str( uint8_t ucChar, uint8_t *pcResult );
#if 0
//typedef struct tag_data_type_info {
// uint8_t datatype;
// uint8_t length;
//}DataInfoSt;
//
//#define STATIC_DATA_INFO_DEF { \
// {ZCL_DATA_TYPE_DATA8, 1}, \
// {ZCL_DATA_TYPE_DATA16, 2}, \
// {ZCL_DATA_TYPE_DATA24, 3}, \
// {ZCL_DATA_TYPE_DATA32, 4}, \
// {ZCL_DATA_TYPE_DATA40, 5}, \
// {ZCL_DATA_TYPE_DATA48, 6}, \
// {ZCL_DATA_TYPE_DATA56, 7}, \
// {ZCL_DATA_TYPE_DATA64, 8}, \
// {ZCL_DATA_TYPE_BITMAP16, 2}, \
// {ZCL_DATA_TYPE_BITMAP24, 3}, \
// {ZCL_DATA_TYPE_BITMAP32, 4}, \
// {ZCL_DATA_TYPE_BITMAP48, 6}, \
// {ZCL_DATA_TYPE_BITMAP64, 8}, \
// {ZCL_DATA_TYPE_BITMAP8, 1}, \
// {ZCL_DATA_TYPE_BOOLEAN, 1}, \
// {ZCL_DATA_TYPE_UINT8, 1}, \
// {ZCL_DATA_TYPE_ENUM16, 2}, \
// {ZCL_DATA_TYPE_ENUM8, 1}, \
// {ZCL_DATA_TYPE_SINGLE_PREC, 4}, \
// {ZCL_DATA_TYPE_IEEE_ADDR, 8}, \
// {ZCL_DATA_TYPE_INT16, 2}, \
// {ZCL_DATA_TYPE_UINT16, 2}, \
// {ZCL_DATA_TYPE_INT24, 3}, \
// {ZCL_DATA_TYPE_UINT24, 3}, \
// {ZCL_DATA_TYPE_UINT32, 4}, \
// {ZCL_DATA_TYPE_UINT32, 4}, \
// {ZCL_DATA_TYPE_INT48, 6}, \
// {ZCL_DATA_TYPE_INT56, 7}, \
// {ZCL_DATA_TYPE_INT8, 1}, \
// {ZCL_DATA_TYPE_UINT8, 1}, \
// {ZCL_DATA_TYPE_128_BIT_SEC_KEY, 16},\
// {ZCL_DATA_TYPE_UTC, 4}, \
// {ZCL_DATA_TYPE_DATE, 4}, \
// {ZCL_DATA_TYPE_CLUSTER_ID, 2}, \
// {ZCL_DATA_TYPE_ATTR_ID, 2}, \
// {ZCL_DATA_TYPE_BAC_OID, 4}, \
//}
#define GLOBAL_BUFFER_SIZE 256
extern uint8_t g_u8GlobalBufferN1[];
extern uint8_t g_u8GlobalBufferN2[];
extern uint8_t g_u8GlobalLengthN1;
extern uint8_t g_u8GlobalLengthN2;
/* DESP: 64bits大小端转换.
Auth: dingmz_frc.20180627.
*/
extern uint64_t __CPU_ENDIAN_HTONLL__(uint64_t u64_host );
// 转换字节序
#define NT16(nv) ((unsigned short)(((nv) << 8) | ((nv) >> 8)))
#define NT32(nv) ((unsigned int)((NT16((nv) & 0xffff) << 16) | (NT16((nv) >> 16))))
#define NT64(nv) __CPU_ENDIAN_HTONLL__(nv)
void NWK_AddRssi(uint16_t node_id, int8_t rssi);
bool NWK_DeleteRssiByNodeid(uint16_t node_id);
bool getEndDeviceRssiByNodeid(uint16_t node_id, int8_t *rssi, uint8_t *index);
/* DESP: Gets the byte length of the specified data type.
* Auth: dingmz_frc.20191025.
* */
uint8_t kUtilsGetDataLength(uint8_t type );
/* DESP: check whether the data set content is specified byte data!
* Auth: dingmz_frc.20190520.
* */
bool kUtilsCheckDataSetContext(void *data_set, uint8_t spec_v, int length );
/* DESP: get the crc16 value of specific InstallCode.
* Auth: dingmz_frc.20191007.
* */
uint16_t kUtilsInstallCodeX25CRC16(uint8_t* u8InstallCode, uint8_t length );
/* DESP: CRC16 algorithm.
* Auth: dingmz_frc.20191018.
* */
uint16_t kUtilsCRC16Sum(const unsigned char *msg, unsigned int length );
/* DESP: 消息格式解析 - 字符串分段解析成子串.
Auth: dingmz_frc.20180607.
*/
int kUtilsStringSplit(char *string, char (*item)[STRING_ITEM_SIZE_MAX], char spec/*分隔符*/);
/* DESP: Check whether the given string is a number.
* Auth: dingmz_frc.20191023.
* */
bool kUtilsIsNumber(char *string );
/* DESP: Check whether the given string is OCT string.
* Auth: dingmz_frc.20191023.
* */
bool kUtilsIsOct(char *string );
/* DESP: Gets the value[in 64-bits] of the specified length from the specified OCT string.
* Note: expected output value max 64bits, so max length input is 16!!!
Auth: dingmz_frc.20191018.
*/
uint64_t kUtilsOct2Value(char *oct, int length/* ≤ 16 */ );
/* DESP: High precision random interface,value in[minNum, maxNum].
Auth: dingmz_frc.20190701.
*/
uint32_t kUtilsGetRandNum(uint32_t minNum, uint32_t maxNum );
/* DESP: Reverse uint8 array contents.
* PARAM[bModifyOriginalData]: Note that this interface modifies the original data content When bModifyOriginalData is true!!!
Auth: dingmz_frc.20191019.
*/
uint8_t *kUtilsReverseArrayU8int(uint8_t *org_data, int length, bool bModifyOriginalData );
/* DESP: Check if it is a valid IEEE address.
* Auth: dingmz_frc.20191106.
* */
bool kUtilsIsValidEui64Addr(EmberEUI64 ineui64addr );
/* DESP: 对一个buffer数据进行排序去除最大的和最小的滤波个数取平均值
filter_num 滤波最大和最小的个数, 相等的
* Auth: maozj.20191123.
* */
uint32_t kUtilsGetAverage(uint32_t *buf, uint8_t len, uint8_t filter_num); //计算平均值
/* DESP: Get the first endpoint containing the specified cluster with mask.
Auth: dingmz_frc.20191024.
*/
uint8_t kCmdGetEndpointByCluserID(uint16_t cluster_id, uint8_t mask );
/* Partition the filename.
Auth: dingmz_frc.20180620.
*/
char *__FNAME__(char *dname);
/* DESP: RewriteCustomMac
Auth:
*/
uint32_t kRewriteCustomMacAddr(EmberEUI64 *eui64);
/* DESP: ReadCustomMac
Auth:
*/
void ReadCustomMacAddr(EmberEUI64 *eui64);
/* DESP: SWAP_EUI64
Auth:
*/
void SWAP_EUI64(uint8_t *ptr);
/* DESP: Get the Data_Code.
Auth: dingmz_frc.20191024.
*/
uint32_t Get_Date_Code( int8u * pData, int8u *pStr );
#endif
#endif
/**********************************************************************
* INCLUDES
*/
#include "tl_common.h"
#include "zb_api.h"
#include "zcl_include.h"
#include "ikk-interpan.h"
#include "ikk-debug.h"
#include "ikk-token.h"
#include "ikk-network.h"
static bool gInterPanEnabled; // 1:enable
static uint16_t gInterPanID = 0x1111; // 1:enable
static uint8_t g_interpanChannel = 20;
pInterPanMsgIncomingCallback gInterPanMsgIncomingCallback;
static ev_timer_event_t *Interpan_timerEvt = NULL;
static ev_timer_event_t *Interpan_DelaySendEvt = NULL;
static INCOM_MESSAGE_INFO sIncomingMessageInfo = {0};
static s32 kInterPanEventHandler(void);
static s32 kInterPanDelaySendTestDataEventHandler(void );
/**
* @brief Definition for Incoming cluster / Sever Cluster
*/
const u16 kInterpan_inClusterList[] =
{
ZCL_CLUSTER_INTERPAN_REQ,
};
/**
* @brief Definition for Outgoing cluster / Client Cluster
*/
const u16 kInterpan_outClusterList[] =
{
ZCL_CLUSTER_INTERPAN_REQ,
};
/**
* @brief Definition for Server cluster number and Client cluster number
*/
#define KINTERPAN_IN_CLUSTER_NUM (sizeof(kInterpan_inClusterList)/sizeof(kInterpan_inClusterList[0]))
#define KINTERPAN_OUT_CLUSTER_NUM (sizeof(kInterpan_outClusterList)/sizeof(kInterpan_outClusterList[0]))
/**
* @brief Definition for simple description for HA profile
*/
const af_simple_descriptor_t kInterpanSimpleDesc =
{
ZDO_PROFILE_ID, /* Application profile identifier */
HA_DEV_ONOFF_LIGHT_SWITCH, /* Application device identifier */
INTERPAN_ENDPOINT, /* Endpoint */
0, /* Application device version */
0, /* Reserved */
KINTERPAN_IN_CLUSTER_NUM, /* Application input cluster count */
KINTERPAN_OUT_CLUSTER_NUM, /* Application output cluster count */
(u16 *)kInterpan_inClusterList, /* Application input cluster list */
(u16 *)kInterpan_outClusterList, /* Application output cluster list */
};
void afInterpan_rx_handler(void *arg)
{
apsdeDataInd_t *pApsdeInd = (apsdeDataInd_t *)arg;
UMsgNodeSt *pMsgNode = (UMsgNodeSt *)pApsdeInd->indInfo.asdu;
pMsgNode->length = pApsdeInd->indInfo.asduLength;
sIncomingMessageInfo.seq = pApsdeInd->indInfo.aps_counter;
sIncomingMessageInfo.src_ep = pApsdeInd->indInfo.src_ep;
sIncomingMessageInfo.src_addr_mode = pApsdeInd->indInfo.src_addr_mode;
if(pApsdeInd->indInfo.src_addr_mode == APS_LONG_DSTADDR_WITHEP)
memcpy(sIncomingMessageInfo.src_ext_addr,pApsdeInd->indInfo.src_ext_addr,8);
else if(pApsdeInd->indInfo.src_addr_mode == APS_SHORT_DSTADDR_WITHEP)
sIncomingMessageInfo.src_short_id = pApsdeInd->indInfo.src_short_addr;
iKonkeAfSelfPrint("afInterpan_rx_handler,data len =%d\r\n",pApsdeInd->indInfo.asduLength);
iKonkeAfSelfPrintBuffer(pApsdeInd->indInfo.asdu,pApsdeInd->indInfo.asduLength);
switch(pApsdeInd->indInfo.cluster_id){
case ZCL_CLUSTER_INTERPAN_REQ:
gInterPanMsgIncomingCallback(pMsgNode);
break;
default:
break;
}
/* Must be free here. */
ev_buf_free((u8 *)arg);
}
void afInterpan_dataSendConfirm(void *arg)
{
apsdeDataConf_t *pApsDataCnf = (apsdeDataConf_t *)arg;
printf("afInterpan_dataSendConfirm,dest ep = %d\r\n!!\r\n",pApsDataCnf->dstEndpoint);
}
void kInterPanEnable(uint8_t channel)
{
rf_setChannel(channel);
printf("kInterPanEnable enable,Regesiter Interpan Func,network = %d\r\n!!\r\n",kNwkGetCurrentStatus());
if (kNwkGetCurrentStatus() == ENS_LEAVED) {
af_endpointRegister(INTERPAN_ENDPOINT, (af_simple_descriptor_t *)&kInterpanSimpleDesc, afInterpan_rx_handler, afInterpan_dataSendConfirm);
}
else{
kNwkFactoryReset(false);
}
}
void kInterpanDisable(void)
{
if (gInterPanEnabled ==true) {
af_endpointUnregister(INTERPAN_ENDPOINT);
kInterPanSetEnableStatus(false);
if(Interpan_DelaySendEvt){
TL_ZB_TIMER_CANCEL(&Interpan_DelaySendEvt);
}
}
}
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming)
{
bool interPanEnabledFlg = kGetInterpanEnableFlg();
if (interPanEnabledFlg) {
gInterPanEnabled = true;
}
if (gInterPanEnabled == true) {
kInterPanEnable(INTERPAN_CHANNEL);
if(Interpan_timerEvt){
TL_ZB_TIMER_CANCEL(&Interpan_timerEvt);
}
Interpan_timerEvt = TL_ZB_TIMER_SCHEDULE(kInterPanEventHandler, NULL, INTERPAN_AUTO_OFF_TIME);
if (kNwkGetCurrentStatus() == ENS_LEAVED) {
if(Interpan_DelaySendEvt)
TL_ZB_TIMER_CANCEL(&Interpan_DelaySendEvt);
Interpan_DelaySendEvt = TL_ZB_TIMER_SCHEDULE(kInterPanDelaySendTestDataEventHandler, NULL, INTERPAN_DELAY_SEND_INTERVAL);
}
}
gInterPanMsgIncomingCallback = pfunc_incoming;
}
static void afTest_dataSendDemo(void)
{
epInfo_t dstEp;
TL_SETSTRUCTCONTENT(dstEp, 0);
//uint8_t aucData[] = {0x5C,0x2B,0xCD,0xFE,0xFF,0x27,0xFD,0x84};
dstEp.dstAddrMode = APS_SHORT_DSTADDR_WITHEP;
dstEp.dstEp = 5;
dstEp.dstAddr.shortAddr = 0xFFFF;
dstEp.profileId = ZDO_PROFILE_ID;
dstEp.txOptions = APS_TX_OPT_INTRA_PAN;
dstEp.radius = 0;
g_zbMacPib.panId = gInterPanID;
u8 apsCnt = 0;
u8 asdu[] = {0xAA, 0x55, 0x00, 0x09, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0d, 0x00, 0xF3, 0xD0,0xFF};
u8 asdulength = sizeof(asdu);
af_dataSend(5, &dstEp, 0x0001, asdulength, asdu, &apsCnt);
printf("afTest_Receive--------------ok!!\r\n");
}
/**
* @description:
* @param {*}
* @return {*}
*/
bool kInterPanSetEnableStatus(uint8_t enable)
{
gInterPanEnabled = enable;
kSetInterpanEnableFlg(!gInterPanEnabled);
}
void SetInterpanPara(uint8_t channel,uint16_t panid,bool is_enable)
{
if(panid != 0xffff)
gInterPanID = panid;
if((channel != 0xff)&&(channel>=11)&&(channel<=26))
g_interpanChannel = channel;
if(is_enable)
{
gInterPanEnabled = TRUE;
kSetInterpanEnableFlg(gInterPanEnabled);
}
else
kInterpanDisable();
}
static uint8_t sSend_Count = 0;
static s32 kInterPanDelaySendTestDataEventHandler(void )
{
if(sSend_Count < INTERPAN_DELAY_SEND_TIMES)
{
sSend_Count++;
afTest_dataSendDemo(); //for coo find this device
return 0;
}
sSend_Count = 0;
return -1;
}
static s32 kInterPanEventHandler(void)
{
iKonkeAfSelfPrint("kInterPanEventHandler\r\n");
if (gInterPanEnabled ==true) {
af_endpointUnregister(INTERPAN_ENDPOINT);
kInterPanSetEnableStatus(false);
}
return -1;
}
kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode)
{
epInfo_t dstEp;
kk_err_t err = KET_OK;
TL_SETSTRUCTCONTENT(dstEp, 0);
dstEp.dstAddrMode = sIncomingMessageInfo.src_addr_mode;
if(sIncomingMessageInfo.src_addr_mode == APS_LONG_DSTADDR_WITHEP)
memcpy(dstEp.dstAddr.extAddr,sIncomingMessageInfo.src_ext_addr,8);
else if(sIncomingMessageInfo.src_addr_mode == APS_SHORT_DSTADDR_WITHEP)
dstEp.dstAddr.shortAddr = sIncomingMessageInfo.src_short_id;
dstEp.dstEp = sIncomingMessageInfo.src_ep;
dstEp.profileId = ZDO_PROFILE_ID;
dstEp.txOptions = APS_TX_OPT_INTRA_PAN;
dstEp.radius = 0;
g_zbMacPib.panId = gInterPanID;
u8 apsCnt = sIncomingMessageInfo.seq;
af_dataSend(INTERPAN_ENDPOINT, &dstEp, ZCL_CLUSTER_INTERPAN_REQ, pMsgNode->length, pMsgNode->buffer, &apsCnt);
return err;
}
/**
* @description:
* @param {*}
* @return {*}
*/
bool kInterPanGetEnableStatus(void)
{
return gInterPanEnabled;
}
#ifndef _IKONKE_OPT_TUNNEL_H_
#define _IKONKE_OPT_TUNNEL_H_
#include "ikk-module-def.h"
#include "../driver/ikk-uart.h"
extern const af_simple_descriptor_t kInterpanSimpleDesc;
#define INTERPAN_ENDPOINT 5
#define INTERPAN_EVENT_INIT 0x00 // interPan Event
#define INTERPAN_EVENT_OFF 0x01 //
#define INTERPAN_AUTO_OFF_TIME (10 * 60 * 1000)
#define INTERPAN_DELAY_SEND_INTERVAL (3 * 1000)
#define INTERPAN_DELAY_SEND_TIMES (2)
#define INTERPAN_CHANNEL 20
#define ZCL_CLUSTER_INTERPAN_REQ 0x0001
typedef void (*pInterPanMsgIncomingCallback)(UMsgNodeSt *pMsgNode );
typedef struct{
uint8_t seq;
uint8_t src_addr_mode;
uint8_t src_ext_addr[8];
uint16_t src_short_id;
uint8_t src_ep;
uint8_t reserved[8];
}INCOM_MESSAGE_INFO;
void SetInterpanPara(uint8_t channel,uint16_t panid,bool is_enable);
void afInterpan_dataSendConfirm(void *arg);
void afInterpan_rx_handler(void *arg);
void kInterpanDisable(void);
kk_err_t kInterPanSend(UMsgNodeSt *pMsgNode);
void kInterpan_Init(void);
bool kInterPanSetEnableStatus(uint8_t enable);
void kInterPanMoudleInit(pInterPanMsgIncomingCallback pfunc_incoming);
#endif /* _SAMPLE_LIGHT_H_ */
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