微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > cc2530的板子,zigbee协议栈开发,节点网络断开,没法调用系统时间执行相应程序,终端代码如下

cc2530的板子,zigbee协议栈开发,节点网络断开,没法调用系统时间执行相应程序,终端代码如下

时间:10-02 整理:3721RD 点击:
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "common.h"
#include "DebugTrace.h"
#include "OnBoard.h"
#include "aps_groups.h"
#include "NLMEDE.h"
//#include "iic.h"
/*HAL*/
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
#include "OSAL_Nv.h"
#include "MT_UART.h"
#include "MT_APP.h"
#include "MT.h"
#include "OSAL_Clock.h" 
#include "hal_drivers.h"


#include "DHT11.h"
#include "SW-420.h"
#include "ADXL345.h"
#include "SD_Card.h"
#include "ff.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char headbyte[4];

FRESULT res;         //FatFs函数执行结果
UINT bw,br;          //写入和读出数据字节计数器
DWORD free_clust;//空簇,空扇区大小
FATFS fs;            // Work area (file system object) for logical drive
FIL fsrc;            // 文件结构
DIR dirs;
FILINFO fno;

static uint8 fileFlag = 0;

const cId_t TestApp_ClusterList[TestApp_MAX_CLUSTERS] = 
{
  TestApp_PERIODIC_CLUSTERID,
  TestApp_FLASH_CLUSTERID,
  //TestApp_P2P_CLUSTERID
};


const SimpleDescriptionFormat_t TestApp_SimpleDesc =
{
  TestApp_ENDPOINT,              //  int Endpoint;
  TestApp_PROFID,                //  uint16 AppProfId[2];
  TestApp_DEVICEID,              //  uint16 AppDeviceId[2];
  TestApp_DEVICE_VERSION,        //  int   AppDevVer:4;
  TestApp_FLAGS,                 //  int   AppFlags:4; 
  TestApp_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)TestApp_ClusterList,  //  byte *pAppInClusterList;
  TestApp_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)TestApp_ClusterList  

};

endPointDesc_t TestApp_epDesc;
byte TestApp_TaskID;
byte TestApp_TransID;
devStates_t TestApp_NwkState;

afAddrType_t TestApp_Periodic_DstAddr;//广播
afAddrType_t TestApp_Flash_DstAddr; //组播
afAddrType_t TestApp_P2P_DstAddr ; //点播

aps_Group_t  TestApp_Group;

uint8 TestApp_PeriodicCounter = 0;
uint8 TestApp_FlashCounter = 0;

uint8 LedState = 0;

#define MAX_BUFFER_LENGTH 100
 char str[MAX_BUFFER_LENGTH] = {0};
 
void TestApp_Init( uint8 task_id );
uint16 TestApp_ProcessEvent( uint8 task_id,uint16 events );
void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt );
void TestApp_HandleKeys( uint8 shift,uint8 keys );
void TestApp_send_sensordata( uint8 sensor_type );
void TestApp_SendPeriodicMessage( void );
void TestApp_SendFlashMessage(uint16 flashTime);
void TestApp_Send_P2P_Message( uint16 shortAddr,uint8 *data,uint16 len );
void ShowInfo(void);
void TestApp_send_sensordata( uint8 sensor_type );


/***********************************************************************
*local function
*/
 
void TestApp_Init( uint8 task_id )
{
  
  TestApp_TaskID = task_id;
  TestApp_NwkState = DEV_INIT;
  TestApp_TransID = 0;
  
  
     // Broadcast to everyone 发送模式:广播发送
    TestApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
    TestApp_Periodic_DstAddr.endPoint = TestApp_ENDPOINT;
    TestApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
    
    // Broadcast to everyone 发送模式:组播发送
    TestApp_Flash_DstAddr.addrMode = (afAddrMode_t)AddrGroup;
    TestApp_Flash_DstAddr.endPoint = TestApp_ENDPOINT;
    TestApp_Flash_DstAddr.addr.shortAddr = TestApp_FLASH_GROUP;
    
    // Broadcast to everyone 发送模式:点播发送
    TestApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
    TestApp_P2P_DstAddr.endPoint = TestApp_ENDPOINT;
    TestApp_P2P_DstAddr.addr.shortAddr = TestApp_COORD_SHORTADDR;
    
    TestApp_epDesc.endPoint = TestApp_ENDPOINT; //定义本设备用来通信的APS层端点描述符
    TestApp_epDesc.task_id = &TestApp_TaskID; //任务描述符ID
    TestApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&TestApp_SimpleDesc; //简单描述符
    TestApp_epDesc.latencyReq = noLatencyReqs;  //延时策略
    
    afRegister(&TestApp_epDesc); //向AF层登记描述符
    RegisterForKeys( TestApp_TaskID ); //登记所有按键事件
    
    TestApp_Group.ID = TestApp_FLASH_GROUP;
    osal_memcpy(TestApp_Group.name,"Group 1",7);
    aps_AddGroup(TestApp_ENDPOINT,&TestApp_Group);

#if defined ( LCD_SUPPORTED )
    HalLcdWriteString( "TestApp", HAL_LCD_LINE_1 ); //如果支持LCD,显示提示信息
#endif 
    
       //------------------------配置串口---------------------------------
    MT_UartInit();                    //串口初始化
    MT_UartRegisterTaskID(task_id);   //注册串口任务
 
  
    osal_memset( str ,0,MAX_BUFFER_LENGTH );
    printf( "Zigbee endDevice OK \n" );
 
//  osalTimeUpdate();
    HalUARTPoll();  // This replaces MT_SerialPoll() and osal_check_timer().
  //-----------------------------------------------------------------
    //ASXL345初始化
    //IIC_INIT();
    ADXL345_Init();
    printf( "ADXL345 ID: 0x%02x\n" , (char)ADXL345_GetDeviceID() );
    HalUARTPoll();
  //温湿度DHT11 初始化
    DHT111_Init();
  //震动传感器初始化   
    SW_240_Init();
    register_SW_420ID( TestApp_TaskID );
    if(SD_Init())
    {
      printf("mmc init fail\n");
      HalUARTPoll();
    }
    else
    {
      printf("mmc size:%lu\n",SD_GetCapacity());
      if( f_mount(0,&fs)==0 )
      {
        printf( "fs_mount ok\n" );
         HalUARTPoll();
      }
      else
      {
        printf( "fs_mount error\n" );
        HalUARTPoll();
      }
    }
}


/******************************************************************************
* @function TestApp_ProcessEvent
* @brief  Application task process. this function is called to process all events for the task.
*         events include timers messages and any other user defined event                              
* @param  task_id - the OSAL assigned task ID.
*         events  - events to process .this is a bit map and can contain more than one event.
* @return none
*/

uint16 TestApp_ProcessEvent( uint8 task_id,uint16 events )
{
  afIncomingMSGPacket_t *MSGpkt;
  if( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( TestApp_TaskID );
    while( MSGpkt )
    {
      switch( MSGpkt->hdr.event )
      {
        case KEY_CHANGE:
          printf("key\n");
          TestApp_HandleKeys( ((keyChange_t *)MSGpkt)->state,((keyChange_t *)MSGpkt)->keys);
          break;
        case AF_INCOMING_MSG_CMD:
          TestAPP_MessageMSGCB(MSGpkt);
          break;
        case ZDO_STATE_CHANGE:
          TestApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
      
          if ( TestApp_NwkState== DEV_END_DEVICE )
          {
            printf("connection\n\r");
            HalUARTPoll();
            res=f_opendir(&dirs, "0:/");
            osal_set_event( TestApp_TaskID ,SHOW_INFO_EVENT );
            osal_set_event( TestApp_TaskID ,SD_EVENT );
           
          }
          if ( TestApp_NwkState == DEV_INIT )
          {
            printf("disconnection\n\r");
            HalUARTPoll();
            res = f_open(&fsrc,"0:/mao.txt",FA_OPEN_ALWAYS | FA_WRITE );
            printf("open file1 /mao.txt %u\n",res);
            printf("network disconnection\r\n");
            osal_start_timerEx( TestApp_TaskID, 
                                 SENSOR_LOOP_EVENT,
                                 TestApp_SENSOR_LOOP_TIMEOUT );
          }
          break;
        default:
          break;
            
      }
      osal_msg_deallocate((uint8 *)MSGpkt);
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(TestApp_TaskID);
    }
    return ( events ^ SYS_EVENT_MSG );
  
  }
  if( events & SHOW_INFO_EVENT) 
  {
    ShowInfo();
    return ( events ^ SHOW_INFO_EVENT );
  }
  if( events & SD_EVENT )
  {
    if( fileFlag == 0 )
    {
      if( (f_readdir(&dirs,&fno) == FR_OK) && fno.fname[0] )
      {
        printf("sd success\n\r");
        res = f_open(&fsrc,fno.fname,FA_OPEN_ALWAYS | FA_READ );
        fileFlag = 1;
      }
      else
      { 
         printf("sd fail\n\r");
         osal_start_timerEx(TestApp_TaskID,
                            SENSOR_LOOP_EVENT,
                            TestApp_SENSOR_LOOP_TIMEOUT);
      }
    }
    if( fileFlag == 1 )
    {
      if( fsrc.fptr < fsrc.fsize )
      {
        osal_memset( str,0,MAX_BUFFER_LENGTH );
        res = f_read( &fsrc,headbyte,sizeof(headbyte),&br );
        res = f_read( &fsrc,str,strtol((const char *)headbyte,NULL,10),&br );
        TestApp_Send_P2P_Message( TestApp_COORD_SHORTADDR,(uint8 *)str,strlen( (const char *)str ));
        HalUARTWrite(0,(uint8 *)str,strlen((const char *)str));
      }
      else
      {
        fileFlag = 0;
        res = f_unlink(fno.fname);
      }
      osal_set_event(TestApp_TaskID,SD_EVENT);
    }
    return ( events ^ SD_EVENT );
  }
  if( events & SENSOR_LOOP_EVENT)
  {
    TestApp_send_sensordata( TEMPERATURE_DHT11 );
    TestApp_send_sensordata( ADXL345 );
    osal_start_timerEx( TestApp_TaskID,
                       SENSOR_LOOP_EVENT,
                       TestApp_SENSOR_LOOP_TIMEOUT );
    return ( events ^ SENSOR_LOOP_EVENT );
  }
  if( events & TestApp_SW_420_INIT_EVENT )
  {
    SW_420_enable_int();
    return ( events ^ TestApp_SW_420_INIT_EVENT );
  }
  if( events & TestApp_SW_420_EVENT )
  {
      TestApp_send_sensordata( SHOCK );
      return ( events ^ TestApp_SW_420_EVENT );
  }
  
  return 0;
}
                             
void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
   byte buf;
   uint8 sensor_type;
 

   switch(pkt->clusterId)
   {
     
     case TestApp_PERIODIC_CLUSTERID:
       HalUARTWrite(0, "PERIODIC Rx:", 12);
       HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); 
       break;
     case TestApp_FLASH_CLUSTERID:
      osal_memcpy(&buf,pkt->cmd.Data,1);
       if( buf == 1)
       {
          HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
       }
       else
       {
          HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);
       }
       break;
     case TestApp_P2P_CLUSTERID:
     if( strstr((char *)pkt->cmd.Data,(char *)sensor_name[TEMPERATURE_DHT11]))
     {
        sensor_type = TEMPERATURE_DHT11;
        goto result;
     }
     else if( strstr((char *)pkt->cmd.Data,(char *)sensor_name[HUMIDITY_DHT11]))
     {
        sensor_type = HUMIDITY_DHT11; 
        goto result;
     }
     else if( strstr((char *)pkt->cmd.Data,(char *)sensor_name[ADXL345]))
     {
        sensor_type = ADXL345;
        goto result;
     }
     else if( strstr((char *)pkt->cmd.Data,(char *) sensor_name[SHOCK]))
     {
        sensor_type = SHOCK;
        goto result;
     }

     else
       return;
      result:      
        printf("P2P RX: %s\n",pkt->cmd.Data);
     // HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength);
        TestApp_send_sensordata( sensor_type );         
      break;
       break;
   
   }

}
void TestApp_HandleKeys( uint8 shift,uint8 keys )
{
  (void)shift; 
  if( keys & HAL_KEY_SW_1 )
  {
    HalUARTWrite(0,"send key1",9);
    HalUARTPoll();
    TestApp_SendFlashMessage(0);  
  }
  if( keys & HAL_KEY_SW_6 )
  {
    aps_Group_t *grp;
    grp = aps_FindGroup( TestApp_ENDPOINT,TestApp_FLASH_GROUP );
    if(grp)
    {
      aps_RemoveGroup(TestApp_ENDPOINT,TestApp_FLASH_GROUP);
    
    }
    else
    {
      aps_AddGroup(TestApp_ENDPOINT,&TestApp_Group);
    }
  }

}


void TestApp_send_sensordata( uint8 sensor_type )
{
  ADXL345_Data_T *ADXL345_Data;

  printf("data\n\r");
  osal_memset( str,0,MAX_BUFFER_LENGTH);
  if( sensor_type == TEMPERATURE_DHT11 || sensor_type == HUMIDITY_DHT11 )
  {
      DHT11_start();
      sprintf( str,"wendu: %d%d , shidu: %d%d\n\r",wendu_shi,wendu_ge,shidu_shi,shidu_ge );
      goto result;
  }
  else if( sensor_type == ADXL345 )
  {
    //ADXL345初始化
    
    ADXL345_Data = ADXL345_GetRawAccelGyro();
       sprintf( str, "%s: ax:%.2f ay:%.2f az:%.2f mg#\r\n", 
                     sensor_name[sensor_type], ADXL345_Data->accel_x , ADXL345_Data->accel_y , ADXL345_Data->accel_z );
   
       goto result;
  }
  else if( sensor_type == SHOCK )
  {
    printf("SHOCK\n");
    sprintf( str,"%s: %c\r\n",sensor_name[SHOCK],get_sw_420_state() );
    goto result;
  }
  else
    return;
  result:
    if( TestApp_NwkState == DEV_INIT )
    {
        printf("DEV_INIT\n");
        HalUARTPoll();
        res = f_lseek( &fsrc,fsrc.fsize );
        sprintf( headbyte,"%-3u ",strlen((const char *)str) );
        res = f_write( &fsrc,headbyte,sizeof(headbyte),&bw );
        res = f_write( &fsrc,str,strlen((const char *)str),&bw );
        res = f_sync( &fsrc );
    }
  
  else if( TestApp_NwkState == DEV_END_DEVICE )
  {
    TestApp_Send_P2P_Message( TestApp_COORD_SHORTADDR,(uint8 *)str,strlen( (const char *)str ));
  }
  HalUARTWrite(0,(uint8 *)str,strlen( (const char *)str ));
  HalUARTPoll();
  if( sensor_type == SHOCK )
  {
      osal_start_timerEx( TestApp_TaskID,
                         TestApp_SW_420_INIT_EVENT,TestApp_SW_420_IT_TIMEOUT );
  }
}


void TestApp_SendFlashMessage(uint16 flashTime)
{
  LedState = ~LedState;
  if( AF_DataRequest( &TestApp_Flash_DstAddr ,
                        &TestApp_epDesc, 
                        TestApp_FLASH_CLUSTERID,
                        1,
                        &LedState, 
                        &TestApp_TransID, 
                        AF_DISCV_ROUTE, 
                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
    if( LedState == 0 )
    {
       HalLedSet( HAL_LED_1,HAL_LED_MODE_ON );
    }
    else
    {
      HalLedSet( HAL_LED_1,HAL_LED_MODE_OFF );
    }
  
  }
  else
  {
  
  }
  

}


void TestApp_SendPeriodicMessage( void )
{
   AF_DataRequest( &TestApp_Periodic_DstAddr, 
                   &TestApp_epDesc,
                   TestApp_PERIODIC_CLUSTERID,
                   1,
                   (uint8*)&TestApp_PeriodicCounter,
                   &TestApp_TransID,
                   AF_DISCV_ROUTE,
                   AF_DEFAULT_RADIUS );
}


void TestApp_Send_P2P_Message( uint16 shortAddr,uint8 *data,uint16 len )
{
  printf("end send\n\r");
  //TestApp_P2P_DstAddr.addr.shortAddr = shortAddr;
  TestApp_P2P_DstAddr.addr.shortAddr = TestApp_COORD_SHORTADDR;
  if(AF_DataRequest( &TestApp_P2P_DstAddr,
                  &TestApp_epDesc,
                  TestApp_P2P_CLUSTERID,
                  len,
                  data,
                  &TestApp_TransID,
                   AF_DISCV_ROUTE, 
                   AF_DEFAULT_RADIUS) == afStatus_SUCCESS)
  {
   
  }
  else
  {
    // Error occurred in request to send.
  }

}
                             
void ShowInfo(void)
{
  uint16 myShortAddr;
  uint8 myMAC[8];
  myShortAddr = NLME_GetShortAddr();//得到自己的网络地址
  osal_memcpy(myMAC,NLME_GetExtAddr(),8);
  sprintf( (char *)str,"NWK:%x MAC:%x%x%x%x\n",myShortAddr,(uint16)myMAC[6],(uint16)myMAC[4], (uint16)myMAC[2],(uint16)myMAC[0]);
  HalUARTWrite(0,(uint8 *)str,strlen((const char *)str));
  TestApp_Send_P2P_Message( TestApp_COORD_SHORTADDR,(uint8 *)str,strlen((const char *)str) );
  HalUARTPoll();
}

//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、终端节点和协调器断开时不执行下面这段代码,这是为什么啊

  if ( TestApp_NwkState == DEV_INIT )
          {
            printf("disconnection\n\r");
            HalUARTPoll();
            res = f_open(&fsrc,"0:/mao.txt",FA_OPEN_ALWAYS | FA_WRITE );
            printf("open file1 /mao.txt %u\n",res);
            printf("network disconnection\r\n");
            osal_start_timerEx( TestApp_TaskID, 
                                 SENSOR_LOOP_EVENT,
                                 TestApp_SENSOR_LOOP_TIMEOUT );
          }

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

然而当连接上协调器时,下面这段代码却能正常执行

if ( TestApp_NwkState== DEV_END_DEVICE )
          {
            printf("connection\n\r");
            HalUARTPoll();
            res=f_opendir(&dirs, "0:/");
            osal_set_event( TestApp_TaskID ,SHOW_INFO_EVENT );
            osal_set_event( TestApp_TaskID ,SD_EVENT );
           
          }

、、、、、、、、、、、、、、、、、、、、、、、、、、、

求各位牛人解答下

那个状态变量应该跟协调器是有关系的,可以查看一下那个变量寄存器的定义与说明。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top