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

📄 wxl_sampleapp.c

📁 Zigbee2006入门(源代码+文档讲解+系统推荐)
💻 C
字号:
/******************************************************************************
*                                                                             *
*    ****       ******       ****
*     ****     ********     ****
*      ****   ****  ****   ****
*       **** ****    **** ****              wxl
*        *******      *******
*         *****        *****                    成都无线龙通讯科技有限公司
*                                                                             *
*******************************************************************************

Filename:     WXL_SampleApp.c                 文 件 名:      WXL_SampleApp.c
Target:       cc2430                          使用芯片:       cc2430
Author:       hxl                             程 序 员:      hxl
data:         19/08-2008                      日    期:      19/08-2008
******************************************************************************/

/**********************************头文件**************************************/
#include "OSAL.h"
#include "ZGlobals.h"
#include "AF.h"
#include "aps_groups.h"
#include "ZDApp.h"

#include "WXL_SampleApp.h"

#include "OnBoard.h"

/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"

#include "string.h"

/************************************end****************************************/

// 这里注册了应用中合法的串ID.
const cId_t WXL_SampleApp_ClusterList[WXL_SAMPLEAPP_MAX_CLUSTERS] =
{
  WXL_SAMPLEAPP_CLUSTERID1,
  WXL_SAMPLEAPP_CLUSTERID2
};

const SimpleDescriptionFormat_t WXL_SampleApp_SimpleDesc =
{
  WXL_SAMPLEAPP_ENDPOINT,              //  int Endpoint;
  WXL_SAMPLEAPP_PROFID,                //  uint16 AppProfId[2];
  WXL_SAMPLEAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  WXL_SAMPLEAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  WXL_SAMPLEAPP_FLAGS,                 //  int   AppFlags:4;
  WXL_SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  (cId_t *)WXL_SampleApp_ClusterList,  //  uint8 *pAppInClusterList;
  WXL_SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  (cId_t *)WXL_SampleApp_ClusterList   //  uint8 *pAppInClusterList;
};

endPointDesc_t WXL_SampleApp_epDesc;


/******************************** 变量申明*************************************/
uint8 WXL_SampleApp_TaskID;                 // 内部的任务 ID,它的值在SampleApp_Init()中获得

devStates_t WXL_SampleApp_NwkState;         //网络状态

uint8 WXL_SampleApp_TransID;                // 这是唯一的一个消息ID(计数器)

afAddrType_t WXL_SampleApp_All_DstAddr;     //广播的方式
afAddrType_t WXL_SampleApp_Single_DstAddr;  //短地址单播的方式
/************************************end***************************************/

/******************************** 函数申明*************************************/

void WXL_SampleApp_HandleKeys(  uint8 keys );
void WXL_SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void WXL_SampleApp_SendPeriodicMessage( void );
void WXL_SampleApp_SendFlashMessage( uint8 *buffer );
void WXL_SampleApp_SendData(uint8 *buf, uint16 addr, uint8 Leng);

/************************************end***************************************/

/*********************************************************************
 * @函数名   SampleApp_Init
 *
* 函数功能: 任务初始化函数的功能是将该任务需要完成的功能的功能部件初始化,
 *          在每一个任务的初始化函数中,必须完成的功能是要得到设置任务的任
 *          务ID。
 *
 * @参 数: task_id - OS分配的任务ID.  这个ID将用于发送数据和设置时间片.
 *
 * @return  none
 */
void WXL_SampleApp_Init( uint8 task_id )
{
  WXL_SampleApp_TaskID = task_id;                  //任务ID
  /**********************************************************/
  /*                    通讯需要的参数                      */
  /**********************************************************/
  WXL_SampleApp_NwkState = DEV_INIT;               //网络类型
  WXL_SampleApp_TransID = 0;      
  
  // 设置发送数据的方式和目的地址
  // 广播到所有的设备
  
  WXL_SampleApp_All_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
  WXL_SampleApp_All_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT;
  WXL_SampleApp_All_DstAddr.addr.shortAddr = 0xFFFF;

 // 单播到一个设备
  WXL_SampleApp_Single_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;;
  WXL_SampleApp_Single_DstAddr.endPoint = WXL_SAMPLEAPP_ENDPOINT;

  // 设置 endpoint description.
  WXL_SampleApp_epDesc.endPoint = WXL_SAMPLEAPP_ENDPOINT;
  WXL_SampleApp_epDesc.task_id = &WXL_SampleApp_TaskID;
  WXL_SampleApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&WXL_SampleApp_SimpleDesc;
  WXL_SampleApp_epDesc.latencyReq = noLatencyReqs;

  // 登记endpoint description 到 AF
  afRegister( &WXL_SampleApp_epDesc );

  // 登记所有的按键时间
  RegisterForKeys( WXL_SampleApp_TaskID );
}

/*********************************************************************
 * @函数名   WXL_SampleApp_ProcessEvent
 *
 * 函数功能: 一般应用任务事件处理,这个函数是处理所有的事件到任务,事件包括
 *          时间片、消息和所有其他使用者定义过的时间。
 *
 * @参 数: task_id - OS分配的任务ID.  这个ID将用于发送数据和设置时间片.
 *          events  - 处理的事件
 *
 * @return  none
 */
uint16 WXL_SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
  afIncomingMSGPacket_t *MSGpkt;

  if ( events & SYS_EVENT_MSG )                                                   //系统信息,
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WXL_SampleApp_TaskID );   //OS发送过来的信息
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
          // 按键事件
        case KEY_CHANGE:
          //按键处理函数
          WXL_SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->keys );
          break;

          // 接收数据事件
        case AF_INCOMING_MSG_CMD:
          //接收数据的处理函数
          WXL_SampleApp_MessageMSGCB( MSGpkt );
          break;

          // 网络状态发生变化时间
        case ZDO_STATE_CHANGE:
          WXL_SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);         //获取网络状态
          if ( (WXL_SampleApp_NwkState == DEV_ZB_COORD)                       //判断网络类型
              || (WXL_SampleApp_NwkState == DEV_ROUTER)
              || (WXL_SampleApp_NwkState == DEV_END_DEVICE) )
          {

          }
          else
          {
            // 设备不属于这个网络
          }
          break;

        default:
          break;
      }

      // 释放存储器
      osal_msg_deallocate( (uint8 *)MSGpkt );

      // Next - 如果有一个空闲的任务
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WXL_SampleApp_TaskID );
    }

    // 返回未处理的任务
    return (events ^ SYS_EVENT_MSG);
  }
  return 0;
}

/*********************************************************************
 * 事件处理函数
 */

/*********************************************************************
 * @函数名   WXL_SampleApp_ProcessEvent
 *
 * 函数功能: 一般应用任务事件处理,这个函数是处理所有的事件到任务,事件包括
 *          时间片、消息和所有其他使用者定义过的时间。
 *
 * @参 数: task_id - OS分配的任务ID.  这个ID将用于发送数据和设置时间片.
 *          events  - 处理的事件
 *
 * @return  none
 */

/*********************************************************************
 * @函数名     WXL_SampleApp_HandleKeys
 *
 * @函数功能: 处理所有的按键事件
 *
 * @参数:     keys - 返回的按键值
 *             
 *
 * @return  none
 */
void WXL_SampleApp_HandleKeys(uint8 keys )
{
  if ( keys & HAL_KEY_SW_1 )
  {
    if(WXL_SampleApp_NwkState == DEV_ZB_COORD)                      //如果是协调器
    WXL_SampleApp_SendFlashMessage( "OPEN" );                       //发送数据
    else
    {
    
    }
  }
}

/*********************************************************************
 * @函数名:   WXL_SampleApp_MessageMSGCB
 *
 * @函数功能: 接收的数据处理量.根据不同的串ID实现不同的功能。  
 *
 * @param   none
 *
 * @return  none
 */
void WXL_SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  unsigned char Rx_Buf[4];
  switch ( pkt->clusterId )
  {
    case WXL_SAMPLEAPP_CLUSTERID1:
      memcpy(Rx_Buf,pkt->cmd.Data,3);
      if((Rx_Buf[0] == 'Y') && (Rx_Buf[1] == 'E') && (Rx_Buf[2] == 'S'))
      {
        HalLedBlink( HAL_LED_4, 4, 50, 250);         //小灯闪烁四次
      }       
      break;
      
    case WXL_SAMPLEAPP_CLUSTERID2:
      memcpy(Rx_Buf,pkt->cmd.Data,4);
      if((Rx_Buf[0] == 'O') && (Rx_Buf[1] == 'P') && (Rx_Buf[2] == 'E') && (Rx_Buf[3] == 'N'))
      {
        HalLedBlink( HAL_LED_4, 4, 50, 250);         //小灯闪烁四次
        WXL_SampleApp_SendData("YES",pkt->srcAddr.addr.shortAddr,3);  //以单播的方式回复信号
      }      
      break;  
  }
}
/*********************************************************************
 * @函数名:   SampleApp_SendFlashMessage
 *
 * @函数功能: 广播发送一串数据。  
 *
 * @param   none
 *
 * @return  none
 */

void WXL_SampleApp_SendFlashMessage( uint8 *buffer )
{
  
  if ( AF_DataRequest( &WXL_SampleApp_All_DstAddr, &WXL_SampleApp_epDesc,
                       WXL_SAMPLEAPP_CLUSTERID2,
                       4,
                       buffer,
                       &WXL_SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

//**********************************************************************
//**以短地址方式发送数据
//buf ::发送的数据
//addr::目的地址
//Leng::数据长度
//********************************************************************
void WXL_SampleApp_SendData(uint8 *buf, uint16 addr, uint8 Leng)
{
	WXL_SampleApp_Single_DstAddr.addr.shortAddr = addr;
        if ( AF_DataRequest( &WXL_SampleApp_Single_DstAddr, //发送的地址和模式
                       &WXL_SampleApp_epDesc,   //终端(比如操作系统中任务ID等)
                       WXL_SAMPLEAPP_CLUSTERID1,//发送串ID
                       Leng,                    //信息长度
                       buf,                     //待发送的数据
                       &WXL_SampleApp_TransID,  
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
	{

	}
	else
	{

	}
}

/*********************************************************************
*********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -