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

📄 getlqico.c

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