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

📄 car.c

📁 robot open source code
💻 C
字号:
/**
 *
 * 文 件 名:car.c
 *
 * 描    述:
 *
 * 创 建 者:
 *
 * 创建日期:
 *
 * 备    注:
 *
 *
 * * 维护历史 *
 *
 *   <日期>                <修改者>
 *   <修改内容...>
 *
 **/

#include <stdlib.h>
#include "../vehicle/vehicle.h"
#include "car.h"


VOID  TOG_car(OBJECT* pObj);


/*=====================+ OICC label +====================*/

/*<oicc>*/
/*<ibn> vehicle </ibn>*/
/*<crt>*/FRESULT  CRT_car(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic){	extern  VOID  InitAIBofND(OBJECT* pND, MLDSN* pMsn, NUMIB nib);	extern  VOID  InitABNofND(OBJECT* pND, MLDSN* pMsn, NUMBN nbn);	extern  VOID  TOG_vehicle(OBJECT* pObj);	extern  VOID  TOG_OIOIC(OBJECT* pObj);	UI32   ux_ND = 3; 	/* ND数量。*/	UI32   ux_BN = 3; 	/* 各ND的BN数量之和。*/	UI32   ux_IB = 2; 	/* 各ND的IBN数量之和。*/	UI32   ux_CS = NumCR*6; 	/* 各ND的最少CS数量之和。*/	UI32   ux_EM = sizeof(EM_CAR) + sizeof(EM_VEHICLE) + sizeof(EM_OIOIC); 	/* 各ND的EM尺寸之和。*/	UI32  sum = ux_ND * sizeof(OBJECT) 	/* for AND. */		 + ux_BN * sizeof(OBJECT*) 	/* for "ppo_ABN". */		 + ux_IB * sizeof(OBJECT*) 	/* for "ppo_AIB". */		 + ux_CS * sizeof(VR) + ux_EM; 	/* for "pvr_ACS" and "pEM". */	BYTE*  pIC = NULL;	if(NULL == pExotic)	{		*ppObj = NULL;		pIC = (BYTE*)calloc(sum, 1);	}else { pIC = pExotic; }	if( pIC != NULL )	{		OBJECT*  pND;		MLDSN    ArrMsn[2];		BYTE*    p = pIC + sizeof(OBJECT) * ux_ND;		/***  确定AND各元素  ***/		/** car **/		pND = (OBJECT*)pIC;		TOG_car(pND);		pND->MSN = MSN_CAR;		pND->OID = (*pOID)++;		pND->po_AND = (OBJECT*)pIC;		pND->NND = ux_ND;		/** vehicle **/		TOG_vehicle(++pND);		pND->MSN = MSN_VEHICLE;		pND->OID = (*pOID)++;		pND->po_AND = (OBJECT*)pIC;		pND->NND = ux_ND;		/** OIOIC **/		TOG_OIOIC(++pND);		pND->MSN = MSN_OIOIC;		pND->OID = (*pOID)++;		pND->po_AND = (OBJECT*)pIC;		pND->NND = ux_ND;		/***  初始化各ND  ***/		/** car **/		pND = (OBJECT*)pIC;		/* - AIB - */		pND->ppo_AIB = (OBJECT**)p;		ArrMsn[0] = MSN_VEHICLE;		InitAIBofND(pND, ArrMsn, 1);		p += sizeof(OBJECT*) * 1;		/* - ABN - */		pND->ppo_ABN = (OBJECT**)p;		ArrMsn[0] = MSN_VEHICLE;		ArrMsn[1] = MSN_OIOIC;		InitABNofND(pND, ArrMsn, 2);		p += sizeof(OBJECT*) * 2;		/* - ACS - */		pND->pvr_ACS = (VR*)p;		pND->NCS = NumCR * 1;		p += sizeof(VR) * pND->NCS;		/* - EM - */		pND->pEM = (EM*)p;		p += sizeof(EM_CAR);		/** vehicle **/		++pND;		/* - AIB - */		pND->ppo_AIB = (OBJECT**)p;		ArrMsn[0] = MSN_OIOIC;		InitAIBofND(pND, ArrMsn, 1);		p += sizeof(OBJECT*) * 1;		/* - ABN - */		pND->ppo_ABN = (OBJECT**)p;		ArrMsn[0] = MSN_OIOIC;		InitABNofND(pND, ArrMsn, 1);		p += sizeof(OBJECT*) * 1;		/* - ACS - */		pND->pvr_ACS = (VR*)p;		pND->NCS = NumCR * 2;		p += sizeof(VR) * pND->NCS;		/* - EM - */		pND->pEM = (EM*)p;		p += sizeof(EM_VEHICLE);		/** OIOIC **/		++pND;		/* - ACS - */		pND->pvr_ACS = (VR*)p;		pND->NCS = NumCR * 3;		p += sizeof(VR) * pND->NCS;		/* - EM - */		pND->pEM = (EM*)p;		if( IQCty > 0 )		{			/* - IQ - */			((EM_OIOIC*)(pND->pEM))->IQ.Dtrm = (BYTE*)calloc(IQCty, 1);			if( NULL == ((EM_OIOIC*)(pND->pEM))->IQ.Dtrm)			{				/* 分配IQ的容量失败!*/				if(NULL == pExotic)					free(pIC);				return FR_N;			}			((EM_OIOIC*)(pND->pEM))->IQ.Front = ((EM_OIOIC*)(pND->pEM))->IQ.Rear = ((EM_OIOIC*)(pND->pEM))->IQ.Dtrm - 1;			((EM_OIOIC*)(pND->pEM))->IQ.Cty = IQCty;			((EM_OIOIC*)(pND->pEM))->IQ.Qty = ((EM_OIOIC*)(pND->pEM))->IQ.Lost = 0;		}		if( OQCty > 0 ) 		{			/* - OQ - */			((EM_OIOIC*)(pND->pEM))->OQ.Dtrm = (BYTE*)calloc(OQCty, 1);			if(NULL == ((EM_OIOIC*)(pND->pEM))->OQ.Dtrm)			{				/* 分配OQ的容量失败!*/				if( ((EM_OIOIC*)(pND->pEM))->IQ.Dtrm != NULL )					free(((EM_OIOIC*)(pND->pEM))->IQ.Dtrm);				if(NULL == pExotic)					free(pIC);				return FR_N;			}			((EM_OIOIC*)(pND->pEM))->OQ.Front = ((EM_OIOIC*)(pND->pEM))->OQ.Rear = ((EM_OIOIC*)(pND->pEM))->OQ.Dtrm - 1;			((EM_OIOIC*)(pND->pEM))->OQ.Cty = OQCty;			((EM_OIOIC*)(pND->pEM))->OQ.Qty = ((EM_OIOIC*)(pND->pEM))->OQ.Lost = 0;		}		p += sizeof(EM_OIOIC);	}	if(NULL == pExotic)		*ppObj = (OBJECT*)pIC;	return  FR_P;}
/*</crt>*/
/*</oicc>*/

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

/**
 *
 * 名称:car_Open
 */
static IRESULT  car_Open(OBJECT* This, const VR* pCaller)
{
	EM_VEHICLE*		pvem = GetEMofBN(This, MSN_VEHICLE); 
	EM_CAR*         pem = (EM_CAR*)This->pEM;

	OBS_OBJECT_OPEN_;

	/* 在下面完成接口自己的任务。*/

	pvem->weight = 1.01f;
	pem->max_load = 1.53f;
	pem->max_velocity = 186.5f;

	return IR_P;
}

/**
 *
 * 名称:car_Input
 */
static IRESULT  car_Input(OBJECT* This, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_INPUT;
}

/**
 *
 * 名称:car_Output
 */
static IRESULT  car_Output(OBJECT* This, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_OUTPUT;
}

/**
 *
 * 名称:car_IOput
 */
static IRESULT  car_IOput(OBJECT* This, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_IOPUT;
}

/**
 *
 * 名称:car_Interact0
 */
static IRESULT  car_Interact0(OBJECT* This, ACTION Act, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_INTERACT0;
}

/**
 *
 * 名称:car_Interact1
 */
static IRESULT  car_Interact1(OBJECT* This, ACTION Act, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{
	EM_CAR*   pem = (EM_CAR*)This->pEM;

	switch(Act)
	{
	case GET_MAXLOAD:
		if(Cty<sizeof(SR32)) /* 判断输出流容量够不够。*/
			return IR_N_INVALIDARG;
		*(SR32*)OStrm = pem->max_load; /* 输出最大载重量值。*/
		*pQty = sizeof(SR32); /* 输出的字节数。*/
		return IR_P;
	case GET_MAXVELOCITY:
		if(Cty<sizeof(SR32)) /* 判断输出流容量够不够。*/
			return IR_N_INVALIDARG;
		*(SR32*)OStrm = pem->max_velocity; /* 输出最大速度值。*/
		*pQty = sizeof(SR32); /* 输出的字节数。*/
		return IR_P;
	default:
		break;
	}

	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_INTERACT1;
}

/**
 *
 * 名称:car_Interact2
 */
static IRESULT  car_Interact2(OBJECT* This, ACTION  Act, BYTE* IStrm, BYTKTY Qty, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_INTERACT2;
}

/**
 *
 * 名称:car_Interact3
 */
static IRESULT  car_Interact3(OBJECT* This, ACTION Act, BYTE* IStrm, BYTKTY Qty, BYTE* OStrm, BYTKTY Cty, BYTKTY* pQty, const VR* pCaller)
{

	/* ... */


	/* 在上面完成接口自己的任务。*/

	SBO_OBJECT_INTERACT3;
}

/**
 *
 * 名称:car_Close
 */
static IRESULT  car_Close(OBJECT* This, const VR* pCaller)
{
	OBS_OBJECT_CLOSE_;

	/* 在下面完成接口自己的任务。*/

	if(0 == This->RefCnt)
		return IR_P_RCZERO;

	return IR_P;
}

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

/**
 *
 * 名称:TOG_car
 */
VOID  TOG_car(OBJECT* pObj)
{
	pObj->Open = car_Open;
	pObj->Input = car_Input;
	pObj->Output = car_Output;
	pObj->IOput = car_IOput;
	pObj->Interact0 = car_Interact0;
	pObj->Interact1 = car_Interact1;
	pObj->Interact2 = car_Interact2;
	pObj->Interact3 = car_Interact3;
	pObj->Close = car_Close;
}

/*=======================+ IRF(s) +======================*/
/*... */

/*====================+ Function(s) +====================*/
/* ... */

⌨️ 快捷键说明

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