📄 getlqico.c
字号:
#include <jendefs.h>
#include "AppQueueApi.h"
#include "AppHardwareApi.h"
#include "mac_sap.h"
#include "mac_pib.h"
#include "Printf.h"
#include "gdb.h"
#include "config.h"
#include "LedControl.h"
typedef enum
{
E_STATE_OFF,
E_STATE_SCANNING,
E_STATE_RUNNING
}teState;
typedef struct//保存节点的地址与u8NodeNum共同使用
{
uint16 u16Short;
uint32 u32ExtAdrL;
uint32 u32ExtAdrH;
}tsNodeAddress;
typedef struct
{
//需要从节点数据包获取的数据
uint8 u8Temperature;
uint8 u8RxNum;
uint8 u8LQI;
}tsData;
//网络相关的参数
typedef struct
{
uint8 u8Channel;
uint8 u8NodeNum;
}tsNetData;
PRIVATE void vInitSystem(void);
PRIVATE void vInitCoordinator(void);
PRIVATE void vStartEnergyScan(void);
PRIVATE void vHandleEnergyScan(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vStartCoordinator(void);
PRIVATE void vHandleNodeAssociation(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vHandleIncomingData(MAC_McpsDcfmInd_s *psMcpsInd);
PRIVATE void vProcessInterrupt(void);
PRIVATE void vProcessIncomingMlme(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vProcessIncomingMcps(MAC_McpsDcfmInd_s *psMcpsInd);
PRIVATE void vDisplayData(uint8 u8WhichNode,tsData sData[MAX_END_DEVICES]);
//PRIVATE void vDisPlay(char *pcMessage);
PRIVATE void *s_pvMac;
PRIVATE MAC_Pib_s *s_psMacPib;
PRIVATE teState eState;
PRIVATE tsData sData[MAX_END_DEVICES];
PRIVATE tsNodeAddress sNodeAddress[MAX_END_DEVICES];
PRIVATE tsNetData sNetData;
/****************************************************************************
*
* NAME: AppColdStart
*
* DESCRIPTION:
* Entry point for application from boot loader.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppColdStart(void)
{
#ifdef GDB
HAL_GDB_INIT();
HAL_BREAKPOINT();
#endif
vInitSystem();
vInitCoordinator();
vStartEnergyScan();
while(1)
{
vProcessInterrupt();
}
}
/****************************************************************************
*
* NAME: AppWarmStart
*
* DESCRIPTION:
* Entry point for application from boot loader.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppWarmStart(void)
{
AppColdStart();
}
//主要是初始化系统参数
PRIVATE void vInitSystem()
{
// vPrintf("vInitSystem");
u32AppQApiInit(NULL,NULL,NULL);//消息队列初始化
u32AHI_Init();//硬件初始化
vUART_printInit();
s_pvMac=pvAppApiGetMacHandle();
s_psMacPib=MAC_psPibGetHandle(s_pvMac);
MAC_vPibSetPanId(s_pvMac,PAN_ID);
MAC_vPibSetShortAddr(s_pvMac,COORDINATOR_ADR);
MAC_vPibSetRxOnWhenIdle(s_pvMac,TRUE,FALSE);
s_psMacPib->bAssociationPermit=1;
vLedInitRfd();
vLedControl(0,FALSE);
/* vAHI_UartEnable(E_AHI_UART_0);
vAHI_UartReset(E_AHI_UART_0,TRUE,TRUE);
vAHI_UartSetClockDivisor(E_AHI_UART_0,E_AHI_UART_RATE_19200);
vAHI_UartSetControl(E_AHI_UART_0,E_AHI_UART_ODD_PARITY,E_AHI_UART_PARITY_DISABLE,E_AHI_UART_WORD_LEN_8,E_AHI_UART_1_STOP_BIT,E_AHI_UART_RTS_LOW);
vAHI_UartReset(E_AHI_UART_0,FALSE,FALSE);
vDisPlay("vInitSystem ");*/
}
//主要是初始化数据
PRIVATE void vInitCoordinator()
{
vPrintf("vInitCoordinator");
// vDisPlay("vInitCoordinator ");
uint8 i=0;
sNetData.u8NodeNum=0;
while(i<MAX_END_DEVICES)
{
sData[i].u8RxNum=0;
i++;
}
}
PRIVATE void vStartEnergyScan()
{
vPrintf("vStartEnergyScan");
//vDisPlay("vStartEnergyScan ");
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
eState=E_STATE_SCANNING;
sMlmeReqRsp.u8Type=MAC_MLME_REQ_SCAN;
sMlmeReqRsp.u8ParamLength=sizeof(MAC_MlmeReqScan_s);
sMlmeReqRsp.uParam.sReqScan.u8ScanType=MAC_MLME_SCAN_TYPE_ENERGY_DETECT;
sMlmeReqRsp.uParam.sReqScan.u32ScanChannels=SCAN_CHANNELS;
sMlmeReqRsp.uParam.sReqScan.u8ScanDuration=ACTIVE_SCAN_DURATION;
vAppApiMlmeRequest(&sMlmeReqRsp,&sMlmeSyncCfm);
if(sMlmeSyncCfm.u8Status!=MAC_MLME_CFM_DEFERRED)
{
//这里进行发送的错误处理
}
}
PRIVATE void vProcessInterrupt(void)
{
MAC_MlmeDcfmInd_s *psMlmeInd;
MAC_McpsDcfmInd_s *psMcpsInd;
do
{
psMlmeInd=psAppQApiReadMlmeInd();
if(psMlmeInd!=NULL)
{
vProcessIncomingMlme(psMlmeInd);
vAppQApiReturnMlmeIndBuffer(psMlmeInd);
}
}while(psMlmeInd!=NULL);
do
{
psMcpsInd=psAppQApiReadMcpsInd();
if(psMcpsInd!=NULL)
{
vProcessIncomingMcps(psMcpsInd);
vAppQApiReturnMcpsIndBuffer(psMcpsInd);
}
}while(psMcpsInd!=NULL);
}
PRIVATE void vProcessIncomingMlme(MAC_MlmeDcfmInd_s *psMlmeInd)//这里参数MAC_MlmeDcfmInd_s, 参看mac_sap.h
{
switch(psMlmeInd->u8Type)
{
case MAC_MLME_DCFM_SCAN:
{
if(psMlmeInd->uParam.sDcfmScan.u8ScanType==MAC_MLME_SCAN_TYPE_ENERGY_DETECT)
{
if(eState==E_STATE_SCANNING)
{
vHandleEnergyScan(psMlmeInd);
}
}
}
break;
case MAC_MLME_IND_ASSOCIATE:
{
if(eState==E_STATE_RUNNING)
{
vHandleNodeAssociation(psMlmeInd);
}
}
break;
default:
break;
}
}
PRIVATE void vHandleEnergyScan(MAC_MlmeDcfmInd_s *psMlmeInd)
{
//vDisPlay("vHanldeEneryScan ");
uint8 i=1;
uint8 u8EnergyLevel;
u8EnergyLevel=psMlmeInd->uParam.sDcfmScan.uList.au8EnergyDetect[0];
sNetData.u8Channel=psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[0].u8LogicalChan;//这里值就是为11
while(i<(psMlmeInd->uParam.sDcfmScan.u8ResultListSize))
{
if((psMlmeInd->uParam.sDcfmScan.uList.au8EnergyDetect[i])<u8EnergyLevel)
{
u8EnergyLevel=(psMlmeInd->uParam.sDcfmScan.uList.au8EnergyDetect[i]);
sNetData.u8Channel=(psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[i].u8LogicalChan);
}
i++;
}
vStartCoordinator();
}
PRIVATE void vStartCoordinator(void)
{
vPrintf("vStartCoordinator");
// vDisPlay("vStartCoordinator ");
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
eState=E_STATE_RUNNING;
sMlmeReqRsp.u8Type=MAC_MLME_REQ_START;
sMlmeReqRsp.u8ParamLength=sizeof(MAC_MlmeReqStart_s);
vLedControl(0,TRUE); //协调器建立网络之后,LED 0将开始一直亮
sMlmeReqRsp.uParam.sReqStart.u16PanId=PAN_ID;
sMlmeReqRsp.uParam.sReqStart.u8Channel=sNetData.u8Channel;
sMlmeReqRsp.uParam.sReqStart.u8BeaconOrder=15;
sMlmeReqRsp.uParam.sReqStart.u8SuperframeOrder=15;//构建的是无信标网络
sMlmeReqRsp.uParam.sReqStart.u8PanCoordinator=TRUE;
sMlmeReqRsp.uParam.sReqStart.u8BatteryLifeExt=FALSE;
sMlmeReqRsp.uParam.sReqStart.u8Realignment=FALSE;
sMlmeReqRsp.uParam.sReqStart.u8SecurityEnable=FALSE;
vAppApiMlmeRequest(&sMlmeReqRsp,&sMlmeSyncCfm);
if(sMlmeSyncCfm.u8Status!=MAC_MLME_CFM_DEFERRED)
{
//这里定义意外错误处理
}
}
PRIVATE void vHandleNodeAssociation(MAC_MlmeDcfmInd_s *psMlmeInd)
{
// vDisPlay("vHandleNodeAssociation ");
uint8 u8Count=sNetData.u8NodeNum;
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
if(sNetData.u8NodeNum<MAX_END_DEVICES)
{
sNodeAddress[u8Count].u32ExtAdrL=psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32L;
sNodeAddress[u8Count].u32ExtAdrH=psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32H;
sNodeAddress[u8Count].u16Short=COORDINATOR_ADR+u8Count;
sNetData.u8NodeNum=u8Count+1;
sMlmeReqRsp.uParam.sRspAssociate.u8Status=0;
}
else
{
sMlmeReqRsp.uParam.sRspAssociate.u8Status=2;
}
sMlmeReqRsp.u8Type=MAC_MLME_RSP_ASSOCIATE;
sMlmeReqRsp.u8ParamLength=sizeof(MAC_MlmeRspAssociate_s);
sMlmeReqRsp.uParam.sRspAssociate.u16AssocShortAddr=sNodeAddress[u8Count].u16Short;
sMlmeReqRsp.uParam.sRspAssociate.sDeviceAddr.u32L=psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32L;
sMlmeReqRsp.uParam.sRspAssociate.sDeviceAddr.u32H=psMlmeInd->uParam.sIndAssociate.sDeviceAddr.u32H;
sMlmeReqRsp.uParam.sRspAssociate.u8SecurityEnable=FALSE;
vAppApiMlmeRequest(&sMlmeReqRsp,&sMlmeSyncCfm);
}
PRIVATE void vProcessIncomingMcps(MAC_McpsDcfmInd_s *psMcpsInd)
{
if(eState==E_STATE_RUNNING)
{
switch(psMcpsInd->u8Type)
{
case MAC_MCPS_IND_DATA:
{
vHandleIncomingData(psMcpsInd);
}
break;
default:
break;
}
}
}
PRIVATE void vHandleIncomingData(MAC_McpsDcfmInd_s *psMcpsInd)
{
// vDisPlay("vHandleIncomingData ");
uint8 u8WhichNode;
u8WhichNode=(psMcpsInd->uParam.sIndData.sFrame.sSrcAddr.uAddr.u16Short)-COORDINATOR_ADR;
sData[u8WhichNode].u8RxNum=psMcpsInd->uParam.sIndData.sFrame.au8Sdu[1];
sData[u8WhichNode].u8Temperature=psMcpsInd->uParam.sIndData.sFrame.au8Sdu[0];
sData[u8WhichNode].u8LQI=psMcpsInd->uParam.sIndData.sFrame.u8LinkQuality;
vDisplayData(u8WhichNode,sData);
}
PRIVATE void vDisplayData(uint8 u8WhichNode,tsData sData[MAX_END_DEVICES])
{
//vDisPlay("show data ");
vPrintf("the Node is=%d",u8WhichNode);
vPrintf("the Data Num is=%d",sData[u8WhichNode].u8RxNum);
vPrintf("the temperature is=%d",sData[u8WhichNode].u8Temperature);
vPrintf("the current LQI is=%d\n",sData[u8WhichNode].u8LQI);
}
/*
PRIVATE void vDisPlay(char *pcMessage)
{
while(*pcMessage)
{
while(((u8AHI_UartReadLineStatus(0))&0x20)==0);
vAHI_UartWriteData(0,*pcMessage);
pcMessage++;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -