📄 holley.c
字号:
#include "Holley_ext.h"
#ifdef SINK_APP
/************************************************************************/
/* 申明集中器(广告) */
/* 参数 */
/* ucRadius 广播发送的半径 */
/* ucRadius = 0, 则发送半径为 EMBER_MAX_HOPS */
/* bRespond 是否要求应答 */
/* 返回值 */
/* 无 */
/************************************************************************/
void Send_Advertise( int8u ucRadius, int8u ucRespond, int8u ucContents )
{
aucSwam[0]= HL_CMD_STATEMENT; // 命令标识
aucSwam[1]= 0xFF; // Num = 0xFF
MEMCOPY( aucSwam+2, emberGetEui64(), 8 ); // Long Address
aucSwam[10] = sCurrent_Time.ucYear; // 当前时间占7字节
aucSwam[11] = sCurrent_Time.ucMonth;
aucSwam[12] = sCurrent_Time.ucDate;
aucSwam[13] = sCurrent_Time.ucWeek;
aucSwam[14] = sCurrent_Time.ucHour;
aucSwam[15] = sCurrent_Time.ucMinute;
aucSwam[16] = sCurrent_Time.ucSecond;
aucSwam[17] = ucRespond; // 是否返回应答
aucSwam[18] = ucContents; // 应答谌?
Sink_Send_Rf_BroadCast( aucSwam, HL_CMD_STATEMENT, 19 );
#ifdef HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
emberSerialPrintf( APP_SERIAL,"\r\nSink sent Advertise: Radius=%x, Respond=%x, Contents=%x\r\n", ucRadius, ucRespond, ucContents );
#endif
}
/************************************************************************/
/* 集中器参数初始化 */
/* 参数 */
/* 无 */
/* 返回值 */
/* 无 */
/************************************************************************/
void Sink_Para_Init ( void )
{
int8u *p;
p = (int8u*) &sUart_Buffer;
MEMSET ( p, 0, sizeof(HL_Buffered_Data) );
timeBeforeSinkAdvertise = 20; // 5 秒后发送广告
MEMSET ( aucRF_MSG_Index, 0xFF, HL_MAX_PACKAGE_NUMBER );
MEMSET ( aucSwam, 0, HL_SWAM_SIZE );
p = (int8u*) &sCurrent_Time;
MEMSET ( p, 0, sizeof(HL_Full_Time) );
}
/************************************************************************/
/* 集中器以广播形式发送数据, 广播半径不限 */
/* 参数 */
/* pData 需要发送的数葜刚? */
/* ucC_ID Cluster ID */
/* ucLength 需要发送的数据长度 */
/* 返回值 */
/* TRUE 发送成功 */
/* FALSE 发送失败,可能是由以下原因造成 */
/* 1. 缓冲区满 */
/* 2. emberSendMulticast() 失败 */
/************************************************************************/
BOOL Sink_Send_Rf_BroadCast( int8u *pData, int8u ucC_ID, int8u ucLength )
{
EmberStatus status;
EmberMessageBuffer buffer = 0;
int8u ucRadius= 0;
buffer = emberFillLinkedBuffers( pData, ucLength );
if ( buffer == EMBER_NULL_MESSAGE_BUFFER )
{
#ifdef HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
emberSerialPrintf( APP_SERIAL, "\r\nEmber Linked Buffers Full, Send Failed.\r\n" );
emberSerialWaitSend( APP_SERIAL );
#endif
return FALSE;
}
Read_OD( HL_AMR_PARA_GATEWAY_INDEX, 8, &ucRadius );
if ( ucRadius > 0 )
{
status = emberSendLimitedMulticast( MULTICAST_BINDING_INDEX, // binding
ucC_ID, // cluster ID
buffer, // data to send
ucRadius ); // hops
}
else
{
status = emberSendMulticast( MULTICAST_BINDING_INDEX, // binding
ucC_ID, // cluster ID
buffer ); // data to send
}
emberReleaseMessageBuffer( buffer );
#ifdef HL_OUTPUT_DEBUG_INFO_VIA_SERIAL
switch ( status )
{
case EMBER_SUCCESS:
emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast ok\r\n");
break;
case EMBER_CONNECTION_CLOSED:
emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:connection closed!\r\n");
break;
case EMBER_INVALID_BINDING_INDEX:
emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:invalid binding index\r\n");
break;
case EMBER_MESSAGE_TOO_LONG:
emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:message too long!\r\n");
break;
case EMBER_MAX_MESSAGE_LIMIT_REACHED:
emberSerialPrintf(APP_SERIAL,"\r\nSent RF Broadcast failed:max message limit reached!\r\n");
break;
}
#endif
if ( status != EMBER_SUCCESS )
return FALSE;
return TRUE;
}
/************************************************************************/
/* 将串口中的数据缓存到 sUart_Buffer 中 */
/* 参数 */
/* 无 */
/* 返回值 */
/* 无 */
/************************************************************************/
void Sink_Store_UART_Data ( void )
{
int8u i;
int8u ucTemp;
int16u uiTime = 0;
int8u ucLength;
uiTime = halCommonGetInt16uMillisecondTick(); //Read current time
ucLength = emberSerialReadAvailable( HOLLEY_SERIAL );
if ( ucLength > 0 )
{
uiUART_Last_Receive_Time = uiTime; //reset last receive time
if ( ( sUart_Buffer.uiEnd_Of_Last_Frame == sUart_Buffer.uiStart_Of_First_Frame ) ||
( sUart_Buffer.uiPoint != sUart_Buffer.uiStart_Of_First_Frame ) )
{
if ( sUart_Buffer.uiStart_Of_First_Frame == sUart_Buffer.uiPoint )
if ( sUart_Buffer.acBuffer[sUart_Buffer.uiPoint] == 0 )
if ( sUart_Buffer.uiPoint == 0 )
sUart_Buffer.uiPoint = HL_BUFFER_SIZE - 1;
for ( i=0; i<ucLength; i++ )
{
sUart_Buffer.uiPoint ++;
if ( sUart_Buffer.uiPoint == HL_BUFFER_SIZE )
sUart_Buffer.uiPoint = 0;
if ( ( sUart_Buffer.uiPoint == sUart_Buffer.uiStart_Of_First_Frame ) &&
( sUart_Buffer.uiPoint != 0 ) )
{
sUart_Buffer.uiPoint = sUart_Buffer.uiEnd_Of_Last_Frame; //溢出
emberSerialFlushRx( HOLLEY_SERIAL );
break;
}
emberSerialReadByte( HOLLEY_SERIAL, &ucTemp );
sUart_Buffer.acBuffer[sUart_Buffer.uiPoint] = ucTemp;
}
}
else
emberSerialFlushRx( HOLLEY_SERIAL );
}
if( uiTime - uiUART_Last_Receive_Time > HL_COLLECTOR_UART_FRAME_GAP )
{
if ( sUart_Buffer.uiPoint == sUart_Buffer.uiEnd_Of_Last_Frame ) // 没收到有效数据
return;
if ( Check_Buffered_Frame( &sUart_Buffer ) )
Sink_Reply_Buffer_Status( &sUart_Buffer, 0 ); // 向上层软件反馈缓冲区信息
else
{
sUart_Buffer.uiPoint = sUart_Buffer.uiEnd_Of_Last_Frame; // 境
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -