Commit 4f207db8 authored by limm's avatar limm

add unincluded files

parent 682c75ca
#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