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

📄 oioic.c

📁 robot open source code
💻 C
📖 第 1 页 / 共 2 页
字号:
/**
 *
 * 文 件 名:oioic.c
 *
 * 描    述:OIOIC 的 .c 文件。
 *
 * 创 建 者:赵平智   <pervise.zhao@gmail.com>
 *
 * 创建日期:20050310
 *
 * 版    本:1.0.0
 *
 * 版权(C)2005 赵平智。保留所有权利。   
 *
 * 备    注:
 *
 *
 * * 维护历史 *
 *
 *   <日期>              <修改者>
 *   <修改内容...>
 *
 **/

#include <stdlib.h>
#include <string.h> 
#include "oioic.h"


/*=====================+ Interface +=====================*/

/**
 *
 * 名称:OIOIC_Open
 * 描述:Open接口。
 * 参数:pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Open(OBJECT* This, const VR* pCaller)
{
	This->RefCnt++; 
	return IR_P;
}

/**
 *
 * 名称:OIOIC_Input
 * 描述:Input接口。
 * 参数:IStrm --- [IN] 输入流;
 *      Qty --- [IN] 输入的Byte数量;
 *      pCaller --- [IN] 来访者。 
 */
static IRESULT  OIOIC_Input(OBJECT* This, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
	return IR_O_SBOOIX;
}

/**
 *
 * 名称:OIOIC_Output
 * 描述:Output接口。
 * 参数:OStrm --- [OUT] 输出流的流向;
 *      Cty --- [IN] OStrm所指存储空间的容量;
 *      pQty --- [OUT] 指向实际输出的Byte数量;
 *      pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Output(OBJECT* This, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{	
   	return IR_O_SBOOIX;
}

/**
 *
 * 名称:OIOIC_IOput
 * 描述:IOput接口。
 *  参数:IStrm --- [IN] 输入流;
 *        Qty --- [IN] 输入的Byte数量;
 *        OStrm --- [OUT] 输出流的流向;
 *        Cty --- [IN] OStrm所指存储空间的容量;
 *        pQty --- [OUT] 指向实际输出的Byte数量;
 *        pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_IOput(struct TAG_OBJECT* This, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
	return IR_O_SBOOIX;
}

/**
 *
 * 名称:OIOIC_Interact0
 * 描述:Interact0接口。
 * 参数:Act --- [IN] 交互行为;
 *      pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Interact0(OBJECT* This, ACTION Act, const VR* pCaller)
{
	EM_OIOIC*  pem = (EM_OIOIC*)This->pEM;

	switch( Act )
	{
		case ASK_SHARED: /* 问共享么。*/
			if(pem->mds & MOD_SHARED) 
				return IR_N;
			return IR_P;
		case SET_SHARED: /* 设置共享。*/
			pem->mds &= ~MOD_SHARED;
			return IR_P;
		case SET_UNSHARED: /* 设置非共享。*/
			pem->mds |= MOD_SHARED;
			return IR_P;
		case SET_BLOCKI: /* 设置阻断输入。*/
			pem->mds &= ~MOD_BLOCKI;
			return IR_P;
		case SET_UNBLOCKI: /* 设置非阻断输入。*/
			pem->mds |= MOD_BLOCKI;
			return IR_P;
		case SET_BLOCKO: /* 设置阻断输出。*/
			pem->mds &= ~MOD_BLOCKO;
			return IR_P;
		case SET_UNBLOCKO: /* 设置非阻断输出。*/
			pem->mds |= MOD_BLOCKO;
			return IR_P;
		case CMD_RESET: /* 重置。*/
			pem->IQ.Front = pem->IQ.Rear = pem->IQ.Dtrm - 1;
			pem->IQ.Qty = pem->IQ.Lost = 0;
			pem->OQ.Front = pem->OQ.Rear = pem->OQ.Dtrm - 1;
			pem->OQ.Qty = pem->OQ.Lost = 0;
			return IR_P;
		default:
			break;					
	}

	return IR_O_SBOOIX;			
}

/**
 *
 * 名称:OIOIC_Interact1
 * 描述:Interact1接口。
 * 参数:Act --- [IN] 交互行为;
 *      OStrm --- [OUT] 输出流的流向;
 *      Cty --- [IN] OStrm所指存储空间的容量;
 *      pQty --- [OUT] 指向实际输出的Byte数量;
 *      pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Interact1(OBJECT* This, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
	EM_OIOIC*   pem = (EM_OIOIC*)(This->pEM);

	switch( Act )
	{
		case GET_IQCTY: /* 获取IQ容量。*/
			if(Cty >= sizeof(BYTKTY))
			{
				*((BYTKTY*)OStrm) = pem->IQ.Cty;
				*pQty = sizeof(BYTKTY); 
				return IR_P;
			}else{ return  IR_N; }
		case GET_OQCTY: /* 获取OQ容量。*/
			if(Cty >= sizeof(BYTKTY))
			{
				*((BYTKTY*)OStrm) = pem->OQ.Cty;
				*pQty = sizeof(BYTKTY); 
				return IR_P;
			}else{ return IR_N; }
		default:
			break;						
	}
	
	return IR_O_SBOOIX;
}
/**
 *
 * 名称:OIOIC_Interact2
 * 描述:Interact2接口。
 * 参数:Act --- [IN] 交互行为;
 *      IStrm --- [IN] 输入流;
 *      Qty --- [IN] 输入的Byte数量;
 *      pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Interact2(OBJECT* This, ACTION  Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{
	EM_OIOIC*   pem = (EM_OIOIC*)(This->pEM);

	switch( Act )
	{
		case SET_IQCTY: /* 设置IQ容量。*/
			if(sizeof(BYTKTY) == Qty)
			{
				if(pem->IQ.Dtrm != NULL)
					free(pem->IQ.Dtrm); 
				pem->IQ.Dtrm = (BYTE*)calloc(*((BYTKTY*)IStrm), 1);
				if( pem->IQ.Dtrm != NULL )
				{
					pem->IQ.Front = pem->IQ.Rear = pem->IQ.Dtrm - 1;
					pem->IQ.Cty = *((BYTKTY*)IStrm);
					pem->IQ.Qty = pem->IQ.Lost = 0;
					return IR_P;
				}else { return IR_N; }
			}else{ return IR_N; }
		case SET_OQCTY: /* 设置OQ容量。*/
			if(sizeof(BYTKTY) == Qty)
			{
				if(pem->OQ.Dtrm != NULL)
					free(pem->OQ.Dtrm); 
				pem->OQ.Dtrm = (BYTE*)calloc(*((BYTKTY*)IStrm), 1);
				if( pem->OQ.Dtrm != NULL ) 
				{
					pem->OQ.Front = pem->OQ.Rear = pem->OQ.Dtrm - 1;
					pem->OQ.Cty = *((BYTKTY*)IStrm);
					pem->OQ.Qty = pem->OQ.Lost = 0;
					return IR_P; 
				}else { return IR_N; }
			}else{ return IR_N; }
		default:
			break;						
	}
	
	return IR_O_SBOOIX;
}

/**
 *
 * 名称:OIOIC_Interact3
 * 描述:Interact3接口。
 * 参数:Act --- [IN] 交互行为;
 *      IStrm --- [IN] 输入流;
 *      Qty --- [IN] 输入的Byte数量;
 *      OStrm --- [OUT] 输出流的流向;
 *      Cty --- [IN] OStrm所指存储空间的容量;
 *      pQty --- [OUT] 指向实际输出的Byte数量;
 *      pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Interact3(OBJECT* This, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{	
	return IR_O_SBOOIX;
}

/**
 *
 * 名称:OIOIC_Close
 * 描述:Close接口。
 * 参数:pCaller --- [IN] 来访者。
 */
static IRESULT  OIOIC_Close(OBJECT* This, const VR* pCaller)
{
	This->RefCnt--; 
	return IR_P;
}

/*========================+ TOG +========================*/

/**
 *
 * 名称:TOG_OIOIC
 */
VOID  TOG_OIOIC(OBJECT* pObj)
{
	pObj->Open = OIOIC_Open;
	pObj->Input = OIOIC_Input;
	pObj->Output = OIOIC_Output;
	pObj->IOput = OIOIC_IOput;
	pObj->Interact0 = OIOIC_Interact0;
	pObj->Interact1 = OIOIC_Interact1;
	pObj->Interact2 = OIOIC_Interact2;
	pObj->Interact3 = OIOIC_Interact3;
	pObj->Close = OIOIC_Close;
}

/*=============+ InitAIBofND & InitABNofND +=============*/

/* 注:InitAIBofND,InitABNofND只由CRT函数调用。*/

/**
 *
 * 名称:InitAIBofND
 * 描述:初始化ND的AIB。
 * 参数:pND --- [IN] ND指针;
 *      pMsn --- [IN] IB的MSN数组;
 *      nib --- [IN] pMsn所指数组的元素个数,即IB的数量。
 * 备注:1. 只由CRT函数调用。
 *      2. 注意,pMsn所指数组元素的排序决定了IB的访问顺序。
 */
VOID  InitAIBofND(OBJECT* pND, MLDSN* pMsn, NUMIB nib)
{
	NUMND   i;
	NUMIB   j;
	
	pND->NIB = nib;
	
	while(nib)
	{
		j = pND->NIB-nib;
		for(i=1; i<pND->NND; i++)
		{
			if( *(pMsn+j) == (pND->po_AND+i)->MSN)
			{
				*(pND->ppo_AIB+j) = pND->po_AND+i;
				break;
			}
		}
		nib--;
	}
}	

/**
 *
 * 名称:InitABNofND
 * 描述:初始化ND的ABN。
 * 参数:pND --- [IN] ND指针;
 *      pMsn --- [IN] BN的MSN数组;
 *      nbn --- [IN] pMsn所指数组的元素个数,即BN的数量。
 * 备注:只由CRT函数调用。
 */
VOID  InitABNofND(OBJECT* pND, MLDSN* pMsn, NUMBN nbn)
{
	NUMND  i;
	NUMBN  j;
	
	pND->NBN = nbn;
	
	while(nbn)
	{
		j = pND->NBN-nbn;
		for(i=1; i<pND->NND; i++)
		{
			if( *(pMsn+j) == (pND->po_AND+i)->MSN)
			{
				*(pND->ppo_ABN+j) = pND->po_AND+i;
				break;
			}
		}
		nbn--;
	}
}

/*=============+ CallerCome & CallerLeave +==============*/

/* 注:不允许外面使用 CallerCome 和 CallerLeave。*/

/**
 *
 * 名称:CallerCome
 * 描述:来访者来访,登记来访记录。
 * 参数:pND --- [IN] ND地址;
 *       pCaller --- [IN] 来访者。
 * 备注:不允许外面使用。
 */
FRESULT CallerCome(OBJECT* pND, const VR* pCaller)
{    
	NUMCS   i;
	VR*   pVR; 
	
	/* 先检查有没有这个VR。 */
	for(i=0; i<pND->NCS; i++)
	{
		pVR = pND->pvr_ACS+i;
		if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
			return FR_N_HASVR; /* 已经有这个VR了。*/
	}

	/* 加上这个VR。 */
	for(i=0; i<pND->NCS; i++)
	{
		pVR = pND->pvr_ACS+i;
		if( 0 == pVR->cr )
		{
			*pVR = *pCaller;
			return FR_P;
		}
	}
		
	return FR_N;  
}

/**
 *
 * 名称:CallerLeave
 * 描述:来访者离开,清除来访记录。
 * 参数:pND --- [IN] ND地址;
 *       pCaller --- [IN] 来访者。
 * 备注:不允许外面使用。
 */
FRESULT CallerLeave(OBJECT* pND, const VR* pCaller)
{
	NUMBN  i;
	NUMCS  j;
	VR*  pVR;
	
	/* 首先ND的BN */
	for(i=0; i<pND->NBN; i++)
	{
		for(j=0; j<(*(pND->ppo_ABN+i))->NCS; j++)
		{
			pVR = (*(pND->ppo_ABN+i))->pvr_ACS+j;
		  	if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
				pVR->cr = pVR->mr = 0;
		}
	}
	
	/* 然后ND自己 */
	for(j=0; j<pND->NCS; j++)
	{
		pVR = pND->pvr_ACS+j;
		if((pVR->cr == pCaller->cr) && (pVR->mr == pCaller->mr))
			pVR->cr = pVR->mr = 0;
	} 

	return FR_P;
}

/*==================+ Enqueue & Dequeue +================*/

/**
 *
 * 名称:Enqueue
 * 描述:向指定的队列入列指定数量的Byte。
 * 参数:IData --- [IN] 入列数据;
 *       Qty --- [IN] 入列的Byte数量。
 */
FRESULT  Enqueue(QUEUE* pq, BYTE* IData, BYTKTY Qty)
{
    BYTE*     newRear;  /* 入列成功后pq->Rear应该所处的位置。*/
	BYTKTY   ctyFree, qtyEnq;
	
	if( NULL == pq || NULL == IData )
	{
		return FR_N_INVALIDARG;
	}
	

⌨️ 快捷键说明

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