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 ); }
、、、、、、、、、、、、、、、、、、、、、、、、、、、
求各位牛人解答下
那个状态变量应该跟协调器是有关系的,可以查看一下那个变量寄存器的定义与说明。