📄 car.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 + -