首先看下以下几个结构体,定义在AF.h文件中
typedef struct
{
uint8 EndPoint; //端点/端口/终端号 1-240
uint16 AppProfId; //支持的Profile ID,配置文件ID
uint16 AppDeviceId; //支持的设备ID
uint8 AppDevVer:4; //执行的设备描述的版本
uint8 Reserved:4; // AF_V1_SUPPORT uses for AppFlags:4.
uint8 AppNumInClusters; //终端支持的输入群集数目
cId_t *pAppInClusterList; //指向输入Cluster ID(输入群集)列表的指针
uint8 AppNumOutClusters; //终端支持的输入簇数目
cId_t *pAppOutClusterList; //指向输出Cluster ID(输出)列表的指针
} SimpleDescriptionFormat_t;//简单描述符
typedef struct
{
uint8 endPoint; //终端号
uint8 *task_id; // Pointer to location of the Application task ID.任务ID指针
SimpleDescriptionFormat_t *simpleDesc; //简单描述符,就是上面定义的结构体
afNetworkLatencyReq_t latencyReq; //必须赋值为noLatencyReqs
} endPointDesc_t;//终端描述符
typedef struct _epList_t {
struct _epList_t *nextDesc; //下一个节点或称下一个终端条目
endPointDesc_t *epDesc; //终端/端点/端口描述符,里面包括简单的描述符
pDescCB pfnDescCB; // Don't use if this function pointer is NULL.回调函数
afAPSF_Config_t apsfCfg;
eEP_Flags flags; //终端标志,eEP_Flags是一个枚举类型,里面含有两个变量eEP_AllowMatch=1,eEP_NotUsed=2
} epList_t;//终端列表条目描述符
afRegister函数解析
afStatus_t afRegister( endPointDesc_t *epDesc )
{
/*查找是否已经存在此端点*/
if (afFindEndPointDescList(epDesc->endPoint)) // Look for duplicate endpoint.
{
return afStatus_INVALID_PARAMETER;
}
/*
* 不存在,则调用afRegisterExtended,注册
* 注册成功(不为NULL)返回afStatus_SUCCESS
* 注册失败(为NULL)返回afStatus_MEM_FAIL
*/
return ((NULL == afRegisterExtended(epDesc, NULL)) ? afStatus_MEM_FAIL : afStatus_SUCCESS);
}
epList_t *afRegisterExtended( endPointDesc_t *epDesc, pDescCB descFn )
{
/*开辟一个终端条目节点*/
epList_t *ep = osal_mem_alloc(sizeof(epList_t));
if (ep != NULL)
{
ep->nextDesc = epList; //将此节点的nextDesc指向终端条目的头节点,即链表头插法
epList = ep; //重新将终端条目链表的头指向最后一个插入的节点
ep->epDesc = epDesc; //将参数中的终端描述符赋值给终端条目结构体中的终端描述符成员
ep->pfnDescCB = descFn; //回调函数赋值,这里赋值为NULL
ep->apsfCfg.frameDelay = APSF_DEFAULT_INTERFRAME_DELAY;// #define APSF_DEFAULT_INTERFRAME_DELAY 50
ep->apsfCfg.windowSize = APSF_DEFAULT_WINDOW_SIZE; // #define APSF_DEFAULT_WINDOW_SIZE 1
ep->flags = eEP_AllowMatch; // Default to allow Match Descriptor.赋值为1
}
return ep;
}
总结:
ZStask-OSAL中将所有的终端以一个终端列表条目表现出来,并将它们都串在一个链表上,用全局epList结构体指针指向最后一个注册的终端列表条目结构体。一个任务就是一个应用程序,也就是一个终端,在任务初始化函数中调用afRegister函数,只需要我们传一个终端描述符endPointDesc_t,所有在调用afRegister函数之前需要将终端描述符endPointDesc_t进行初始化,初始化终端号、初始化任务ID指针、初始化简单描述符等。