📄 app.c
字号:
#include <includes.h>
#include "stackTotal.h"
#include "swsZigbeeNWK_headers.h"
///*
/*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
///*
/*********************************************************************************************************
* EXTERNAL REFERENCE GLOBAL VARIABLES
*********************************************************************************************************
*/
extern NWK_FORMATION_INFO nwkFormInfo;
extern NWK_NETWORK_DISCOVERY_INFO nwkNetworkDiscoveryInfo;
extern NWK_JOIN_INFO nwkJoinInfo;
extern NWK_LEAVE_INFO nwkLeaveInfo;
extern NLDE_DATA_REQUEST_INFO nldeDataRequestInfo;
///*
/*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
//信道扫描以任务的方式实现时,创建的消息邮箱,用来传递执行信道扫描任务的结果
extern OS_EVENT *formAndScanMessageBox; //用于指示能量扫描的消息邮箱
extern OS_EVENT *formAndActiveScanMessageBox;//用于指示主动扫描的消息邮箱
OS_EVENT *discoverAndScanMessageBox=NULL;
OS_EVENT *discoverNetworkEndMessageBox=NULL;//用于指示主动扫描的消息邮箱
OS_EVENT *broadcastEndMessageBox=NULL;//用于指示广播数据传输任务是否完成的邮箱
OS_EVENT *unicastEndMessageBox=NULL; //用于指示单播数据传输任务是否完成的邮箱
OS_STK StackStartTaskStk[TASK_STK_SIZE];
OS_STK StackRunTestTaskStk[TASK_STK_SIZE];
extern OS_STK nwkJoinProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkRejoinProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkWishToLeaveProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkForcedToLeaveProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkFormNetworkProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkDiscoveryProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkDataBroadcastProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkDataUnicastProcedureStk[TASK_STK_SIZE];
extern OS_STK nwkBackgroundProcedureStk[TASK_STK_SIZE-1];
INT16S key;//用于退出的键
INT8U err;
///*
/*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void StackStartTask(void *p_arg);
static void StackRunTestTask (void *p_arg);
#if OS_VIEW_MODULE > 0
static void AppTerminalRx(INT8U rx_data);
#endif
///*
/*********************************************************************************************************
* _tmain()
*
* Description : This is the standard entry point for C++ WIN32 code.
* Arguments : none
*********************************************************************************************************
*/
void main(int argc, char *argv[])
{
INT8U err;
#if 0
BSP_IntDisAll(); /* For an embedded target, disable all interrupts until we are ready to accept them */
#endif
OSInit();
//OSTaskCreateExt(StackStartTask,
// (void *)0,
// (OS_STK *)&StackStartTaskStk[TASK_STK_SIZE-1],
// TASK_START_PRIO,
// TASK_START_PRIO,
// (OS_STK *)&StackStartTaskStk[0],
// TASK_STK_SIZE,
// (void *)0,
// OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
//测试协议栈运行以来后的一些任务
OSTaskCreateExt(StackRunTestTask,
(void *)0,
(OS_STK *)&StackRunTestTaskStk[TASK_STK_SIZE-1],
TASK_START_PRIO,
TASK_START_PRIO,
(OS_STK *)&StackRunTestTaskStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
//OSTaskCreateExt(testStartTask,
// (void *)0,
// (OS_STK *)&testStartTaskStk[TASK_STK_SIZE-1],
// TASK_START_PRIO,
// TASK_START_PRIO,
// (OS_STK *)&testStartTaskStk[0],
// TASK_STK_SIZE,
// (void *)0,
// OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
#if OS_TASK_NAME_SIZE > 11
OSTaskNameSet(APP_TASK_START_PRIO, (INT8U *)"Start Task", &err);
#endif
#if OS_TASK_NAME_SIZE > 14
OSTaskNameSet(OS_IDLE_PRIO, (INT8U *)"uC/OS-II Idle", &err);
#endif
#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
OSTaskNameSet(OS_STAT_PRIO, "uC/OS-II Stat", &err);
#endif
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
}
///*$PAGE*/
/*
*********************************************************************************************************
* STARTUP TASK
*
* Description : This is an example of a startup task. As mentioned in the book's text, you MUST
* initialize the ticker only once multitasking has started.
* Arguments : p_arg is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
* Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
* used. The compiler should not generate any code for this statement.
* 2) Interrupts are enabled once the task start because the I-bit of the CCR register was
* set to 0 by 'OSTaskCreate()'.
*********************************************************************************************************
*/
void StackStartTask (void *p_arg)
{
#ifndef NWK_OPT_ZIGBEE_PAN_COORDINATOR
NWK_DISCOVERY_RESULT networkDiscoveryResult;
#endif
p_arg = p_arg;
#if 0
BSP_Init(); /* For embedded targets, initialize BSP functions */
#endif
#if OS_TASK_STAT_EN > 0
OSStatInit(); /* Determine CPU capacity */
#endif
#if defined(NWK_OPT_ZIGBEE_PAN_COORDINATOR)
//初始化执行组网函数所需要的参数
nwkFormInfo.scanChannels=0x7000800;
nwkFormInfo.scanDuration=12;
nwkFormInfo.beaconOrder=12;
nwkFormInfo.superframeOrder=10;
nwkFormInfo.panID=0;
nwkFormInfo.batteryLifeExtension=FALSE;
formAndScanMessageBox=OSMboxCreate((void *)0);
printf("will start wrapNlmeFormNetworkTask!\n");
//the following code is important!!!
OSTaskCreateExt(nwkFormNetworkProcedure,
(void *)&nwkFormInfo, //this is the parameter
(OS_STK *)&nwkFormNetworkProcedureStk[TASK_STK_SIZE-1],
TASK_START_PRIO+2,
TASK_START_PRIO+2,
(OS_STK *)&nwkFormNetworkProcedureStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
//should wait the task 'nwkFormNetworkProcedure' complete!
for(;;)
{
if(nwkFormInfo.nwkFormStatus==NWK_NETWORK_FORM_STATUS_ACTIVE)
{
OSTimeDlyHMSM(0,0,1,0);
printf("nwkFormNetworkProcedure haven't completes!\n");
continue;
}
else
{
printf("nwkFormNetworkProcedure Completes!\n");
break;
}
}
//组网任务完成后,将组网任务删除
if (nwkFormInfo.panID== 0x0000)
{
printf("succeed in forming network!\n");
//return NWK_SUCCESS;
nwkFormInfo.nwkFormNetworkReturnState=NWK_SUCCESS;
}
else
{
printf("failed in forming network!\n");
//return NWK_STARTUP_FAILURE;
nwkFormInfo.nwkFormNetworkReturnState=NWK_STARTUP_FAILURE;
}
OSTaskDel(TASK_START_PRIO+10);
#else
//创建关于执行网络发现操作的消息邮箱
discoverAndScanMessageBox=OSMboxCreate((void *)0);
//初始化执行发现网络函数所需要的参数
nwkNetworkDiscoveryInfo.scanChannels=0x7000800;
nwkNetworkDiscoveryInfo.scanDuration=12;
//nwkNetworkDiscoveryInfo.nwkDiscoveryResult=networkDiscoveryResult;
discoverNetworkEndMessageBox=OSMboxCreate((void *)0);
printf("will start wrapNlmeFormNetworkTask!\n");
//发现网络所需的参数初始化完毕
OSTaskCreateExt(nwkDiscoveryProcedure,
(void *)&nwkNetworkDiscoveryInfo, //this is the parameter
(OS_STK *)&nwkDiscoveryProcedureStk[TASK_STK_SIZE-1],
TASK_START_PRIO+10,
TASK_START_PRIO+10,
(OS_STK *)&nwkDiscoveryProcedureStk[0],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
//等待网络发现操作的完成
for(;;)
{
if(nwkNetworkDiscoveryInfo.status==NWK_NETWORK_DISCOVERY_STATUS_ACTIVE)
{
OSTimeDlyHMSM(0,0,3,0);
printf("nwkDiscoveryProcedure haven't completes!\n");
continue;
}
else
{
printf("nwkDiscoveryProcedure Completes!\n");
break;
}
}
OSTaskDel(TASK_START_PRIO+10);
//网络发现操作完成之后,创建设备加入网络的任务
//创建真正的设备加入网络的任务
//初始化执行加入网络所需要的参数
nwkJoinInfo.panID=0x00;
nwkJoinInfo.joinAsRouter=TRUE;
nwkJoinInfo.rejoinNetwork=FALSE;
nwkJoinInfo.scanChannels=0x7000800;
nwkJoinInfo.scanDuration=12;
nwkJoinInfo.powerSource=OTHER_ENERGY;
nwkJoinInfo.rxOnWhenIdle=FALSE;
nwkJoinInfo.macSecurity=FALSE;
printf("will start nwkJoinProcedure!\n");
if(!nwkJoinInfo.rejoinNetwork)
{
OSTaskCreateExt(nwkJoinProcedure,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -