⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getlqienddevice.c

📁 实现zigbee设备之间的lqi传输。同时还会对温度进行检测
💻 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 + -