📄 getlqienddevice.c
字号:
#include <AppHardwareApi.h>
#include "jendefs.h"
#include <AppQueueApi.h>
#include <AppApi.h>
#include <mac_sap.h>
#include <mac_pib.h>
#include "config.h"
#include "HtsDriver.h"
#include "gdb.h"
#include "LedControl.h"
typedef enum
{
E_STATE_OFF,
E_STATE_SCANNING,
E_STATE_ASSOCIATING,
E_STATE_RUNNING
}teState;
typedef struct
{
uint8 u8TxNum;
uint8 u8Temperature;
uint8 u8Channel;
uint16 u16Address;
}tsData;
PRIVATE void vInitSystem(void);
PRIVATE void vInitEndDeive(void);
PRIVATE void vStartScan(void);
PRIVATE void vHandleActiveScanResponse(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vStartAssociate(void);
PRIVATE void vHandleAssociateResponse(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vReadTemperature(void)anResponse(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vStartAssociate;
PRIVATE void vHandleTickTimerInterrupt(uint32 u32DeviceId, uint32 u32ItemBitmap);
PRIVATE void vTxData(void);
PRIVATE void vProcessInterrupts(void);
PRIVATE void vProcessIncomingMlme(MAC_MlmeDcfmInd_s *psMlmeInd);
PRIVATE void vProcessIncomingMcps(MAC_McpsDcfmInd_s *psMcpsInd);
PRIVATE void vProcessIncomingHwEvent(AppQApiHwInd_s *psAHI_Ind);
PRIVATE void vDisPlay(char *pcMessage);
PRIVATE void *s_pvMac;
PRIVATE MAC_Pib_s *s_psMacPib;
PRIVATE tsData sData;
PRIVATE teState eState;
/****************************************************************************
*
* NAME: AppColdStart
*
* DESCRIPTION:
* Entry point for application from boot loader.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppColdStart(void)
{
/* Debug hooks: include these regardless of whether debugging or not */
HAL_GDB_INIT();
HAL_BREAKPOINT();
vInitSystem();
vInitEndDeive();
vStartScan();
while(1)
{
vProcessInterrupts();
}
}
/****************************************************************************
*
* NAME: AppWarmStart
*
* DESCRIPTION:
* Entry point for application from boot loader.
*
* RETURNS:
* Never returns.
*
****************************************************************************/
PUBLIC void AppWarmStart(void)
{
AppColdStart();
}
//初始化系统
PRIVATE void vInitSystem(void)
{
/*setup interface to mac*/
(void)u32AppQApiInit(NULL,NULL,NULL);
(void)u32AHI_Init();
/*setup the mac handle*/
s_pvMac=pvAppApiGetMacHandle();
s_psMacPib=MAC_psPibGetHandle(s_pvMac);
/*setup the PANID for the wireless Pan*/
MAC_vPibSetPanId(s_pvMac,PAN_ID);
/*Initialise the temperature device*/
vLedInitRfd();
vLedControl(0,FALSE);
vLedControl(1,FALSE);
vHTSreset();
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 vInitEndDeive(void)
{
/*Initial the data*/
sData.u8TxNum=0;
eState=E_STATE_OFF;
vDisPlay("vInitEndDevice ");
}
//开始进行主动扫描
PRIVATE void vStartScan(void)
{
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
eState=E_STATE_SCANNING;
vDisPlay("vStartScan ");
sMlmeReqRsp.u8Type=MAC_MLME_REQ_SCAN;
sMlmeReqRsp.u8ParamLength=sizeof(MAC_MlmeReqScan_s);
sMlmeReqRsp.uParam.sReqScan.u8ScanType=MAC_MLME_SCAN_TYPE_ACTIVE;
sMlmeReqRsp.uParam.sReqScan.u32ScanChannels=SCAN_CHANNELS;
sMlmeReqRsp.uParam.sReqScan.u8ScanDuration=ACTIVE_SCAN_DURATION;
vAppApiMlmeRequest(&sMlmeReqRsp,&sMlmeSyncCfm);
if(sMlmeSyncCfm.u8Status!=MAC_MLME_CFM_DEFERRED)
{
vDisPlay("MAC_MLME_CFM_NOT_DEFFERD ");
//在这里我们不做处理,调试时用到就行
}
}
//开始连接协调器
PRIVATE void vStartAssociate(void)
{
MAC_MlmeReqRsp_s sMlmeReqRsp;
MAC_MlmeSyncCfm_s sMlmeSyncCfm;
eState=E_STATE_ASSOCIATING;
vDisPlay("vStartAssociate ");
sMlmeReqRsp.u8Type=MAC_MLME_REQ_ASSOCIATE;
sMlmeReqRsp.u8ParamLength=sizeof(MAC_MlmeReqAssociate_s);
sMlmeReqRsp.uParam.sReqAssociate.sCoord.u8AddrMode=2;
sMlmeReqRsp.uParam.sReqAssociate.sCoord.u16PanId=PAN_ID;
sMlmeReqRsp.uParam.sReqAssociate.sCoord.uAddr.u16Short=COORDINATOR_ADR;
sMlmeReqRsp.uParam.sReqAssociate.u8LogicalChan=sData.u8Channel;
sMlmeReqRsp.uParam.sReqAssociate.u8Capability=0x80;
sMlmeReqRsp.uParam.sReqAssociate.u8SecurityEnable=FALSE;
vAppApiMlmeRequest(&sMlmeReqRsp,&sMlmeSyncCfm);
if(sMlmeSyncCfm.u8Status!=MAC_MLME_CFM_DEFERRED)
{
//这里我们不做处理,调试时再用到
}
}
PRIVATE void vProcessInterrupts(void)
{
MAC_MlmeDcfmInd_s *psMlmeInd;
MAC_McpsDcfmInd_s *psMcpsInd;
AppQApiHwInd_s *psAHI_Ind;
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);
do
{
psAHI_Ind=psAppQApiReadHwInd();
if(psAHI_Ind!=NULL)
{
vProcessIncomingHwEvent(psAHI_Ind);
vAppQApiReturnHwIndBuffer(psAHI_Ind);
}
}while(psAHI_Ind!=NULL);
}
PRIVATE void vProcessIncomingMlme(MAC_MlmeDcfmInd_s *psMlmeInd)
{
switch(psMlmeInd->u8Type)
{
case MAC_MLME_DCFM_SCAN:
{
if(eState==E_STATE_SCANNING)
vHandleActiveScanResponse(psMlmeInd);
break;
}
case MAC_MLME_DCFM_ASSOCIATE:
{
if(eState==E_STATE_ASSOCIATING)
{
vHandleAssociateResponse(psMlmeInd);
}
break;
}
default:
break;
}
}
PRIVATE void vProcessIncomingMcps(MAC_McpsDcfmInd_s *psMcpsInd)
{
}
//处理主动扫描的结果
PRIVATE void vHandleActiveScanResponse(MAC_MlmeDcfmInd_s *psMlmeInd)
{
vDisPlay("vHandleActiveScanResponse ");
uint8 i=0;
if(psMlmeInd->uParam.sDcfmScan.u8Status==MAC_ENUM_SUCCESS)
{
while(i<psMlmeInd->uParam.sDcfmScan.u8ResultListSize)
{
if((psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[i].sCoord.u16PanId==PAN_ID)&&
(psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[i].sCoord.u8AddrMode==2)&&
(psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[i].sCoord.uAddr.u16Short==COORDINATOR_ADR))
{
sData.u8Channel=psMlmeInd->uParam.sDcfmScan.uList.asPanDescr[i].u8LogicalChan;
vStartAssociate();
return;
}
i++;
}
vStartScan();
}
vDisPlay("ERROROCCUR! ");
}
PRIVATE void vProcessIncomingHwEvent(AppQApiHwInd_s *psAHI_Ind)
{
}
//处理连接响应的结果
PRIVATE void vHandleAssociateResponse(MAC_MlmeDcfmInd_s *psMlmeInd)
{
if(psMlmeInd->uParam.sDcfmAssociate.u8Status==MAC_ENUM_SUCCESS)
{
sData.u16Address=psMlmeInd->uParam.sDcfmAssociate.u16AssocShortAddr;
eState=E_STATE_RUNNING;
vDisPlay("vHandleAssociateResponse ");
vLedControl(0,TRUE);//连接成功之后,LED0 开始亮
vAHI_TickTimerInterval(0x0FFFFFFFF);
vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_RESTART);
vAHI_TickTimerWrite(0x00000000);
vAHI_TickTimerInit(vHandleTickTimerInterrupt);
vAHI_TickTimerIntEnable(TRUE);
}
else
{
vStartScan();
}
}
PRIVATE void vTxData(void)
{
// vReadTemperature();
MAC_McpsReqRsp_s sMcpsReqRsp;
MAC_McpsSyncCfm_s sMcpsSyncCfm;
sMcpsReqRsp.u8Type=MAC_MCPS_REQ_DATA;
vReadTemperature();
vDisPlay("vTxData ");
sMcpsReqRsp.u8ParamLength = sizeof(MAC_McpsReqData_s);
sMcpsReqRsp.uParam.sReqData.u8Handle=0x00;
sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.u8AddrMode=2;
sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.u16PanId=PAN_ID;
sMcpsReqRsp.uParam.sReqData.sFrame.sSrcAddr.uAddr.u16Short=sData.u16Address;
sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.u8AddrMode=2;
sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.u16PanId=PAN_ID;
sMcpsReqRsp.uParam.sReqData.sFrame.sDstAddr.uAddr.u16Short=COORDINATOR_ADR;
sMcpsReqRsp.uParam.sReqData.sFrame.u8TxOptions=0x00;
sMcpsReqRsp.uParam.sReqData.sFrame.u8SduLength=0x02;
sMcpsReqRsp.uParam.sReqData.sFrame.au8Sdu[0]=sData.u8Temperature;
sMcpsReqRsp.uParam.sReqData.sFrame.au8Sdu[1]=sData.u8TxNum;
sData.u8TxNum=sData.u8TxNum+1;
vAppApiMcpsRequest(&sMcpsReqRsp,&sMcpsSyncCfm);
}
PRIVATE void vReadTemperature(void)
{
vHTSstartReadTemp();
sData.u8Temperature=(uint8)u16HTSreadTempResult();
vDisPlay("vReadTemprature ");
}
PRIVATE void vHandleTickTimerInterrupt(uint32 u32DeviceId, uint32 u32ItemBitmap)
{
vLedControl(1,TRUE);
vTxData();
vLedControl(1,FALSE);
}
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 + -