【Dcm】車両診断通信 その69【シミュレーション⑦】

【Dcm】車両診断通信 その69【シミュレーション⑦】 車両診断通信

バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/

はじめに

AUTOSAR-Dcmのコンフィグレーションの話。
Dslのコンフィグレーションコードについて

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

AUTOSAR-Dcm Dslのコンフィグレーションコード

フクさん
フクさん

とりあえず、
・Dslの概要は説明した。
・Dslのクラス図及びその概要を説明した。

太郎くん
太郎くん

となると、最後は・・・。

フクさん
フクさん

構造体定義のコードを書く!(書いた!)

//----------------------------------------------------------------
//		  DSL				
//----------------------------------------------------------------

#define	DCM_BUF_SIZE	4095
#define	CANTP_DIAG_P2P_REQ	0
#define	CANTP_DIAG_P2P_ACK	1

static uint8 rxDcmBuffer_DiagP2P[DCM_BUF_SIZE];
static Dcm_DslBufferRuntimeType rxBufferParams_DiagP2P =
{
	NOT_IN_USE	/* status */
};
static uint8 txDcmBuffer_DiagP2P[DCM_BUF_SIZE];
static Dcm_DslBufferRuntimeType txBufferParams_DiagP2P =
{
	NOT_IN_USE	/* status */
};
static const Dcm_DslBufferType DcmDslBufferList[DCM_DSL_BUFFER_LIST_LENGTH] = {
	{
		0,	/* DslBufferID */
		DCM_BUF_SIZE,	/* DslBufferSize */
		{
			rxDcmBuffer_DiagP2P,	/* pduInfo.SduDataPtr */
			DCM_BUF_SIZE,	/* pduInfo.SduLength */
		},
		&rxBufferParams_DiagP2P	/* externalBufferRuntimeData */
	},
	{
		1,	/* DslBufferID */
		DCM_BUF_SIZE,	/* DslBufferSize */
		{
			txDcmBuffer_DiagP2P,	/* pduInfo.SduDataPtr */
			DCM_BUF_SIZE,	/* pduInfo.SduLength */
		},
		&txBufferParams_DiagP2P	/* .externalBufferRuntimeData */
	},
};

static const Dcm_DslCallbackDCMRequestServiceType DCMRequestServiceList[] = {
	{ // vRequestService_1
		Diag_RequestServiceStart,	/* StartProtocol */  // must at least config one
		Diag_RequestServiceStop,	/* StopProtocol */
		FALSE	/* Arc_EOL */
	},
	{
		NULL_PTR,	/* StartProtocol */  // must at least config one
		NULL_PTR,	/* StopProtocol */
		TRUE	/* Arc_EOL */
	}
};

static const Dcm_DslServiceRequestIndicationType DCMServiceRequestIndicationList[] = {
	{
		Diag_RequestServiceIndication,	/* Indication */
		FALSE	/* Arc_EOL */
	},
	{
		NULL_PTR,	/* Indication */
		TRUE	/* Arc_EOL */
	}
};

extern const Dcm_DslMainConnectionType DslMainConnectionList[];

static const Dcm_DslProtocolRxType DcmDslProtocolRxList[] = {
	{
		&DslMainConnectionList[0],	/* DslMainConnectionParent */
		DCM_PROTOCOL_PHYSICAL_ADDR_TYPE,	/* DslProtocolAddrType */
		CANTP_DIAG_P2P_REQ,	/* DcmDslProtocolRxPduId */
		0,	/* DcmDslProtocolRxTesterSourceAddr_v4 */		//.Value is not configurable
		0,	/* DcmDslProtocolRxChannelId_v4 */				//.Value is not configurable
		FALSE	/* Arc_EOL */
	},
	{// EOL
		NULL_PTR,	/* DslMainConnectionParent */
		0,	/* DslProtocolAddrType */
		-1,	/* DcmDslProtocolRxPduId */
		0,	/* DcmDslProtocolRxTesterSourceAddr_v4 */		//.Value is not configurable
		0,	/* DcmDslProtocolRxChannelId_v4 */				//.Value is not configurable
		TRUE	/* Arc_EOL */
	}
};

static const Dcm_DslProtocolTxType DcmDslProtocolTxList[] = {
	{
		&DslMainConnectionList[DCM_DIAG_P2P_ACK],	/* DslMainConnectionParent */
		CANTP_DIAG_P2P_ACK,	/* DcmDslProtocolTxPduId */
		DCM_DIAG_P2P_ACK,	/* DcmDslProtocolDcmTxPduId */
		FALSE	/* Arc_EOL */
	},
	{// EOL
		NULL_PTR,	/* DslMainConnectionParent */
		-1,	/* DcmDslProtocolTxPduId */
		-1,	/* DcmDslProtocolDcmTxPduId */
		TRUE	/* Arc_EOL */
	}
};

extern const Dcm_DslConnectionType DslConnectionList[];

const Dcm_DslMainConnectionType DslMainConnectionList[] = {
	{
		&DslConnectionList[0],	/* DslConnectionParent */
		NULL_PTR,	/* DslPeriodicTransmissionConRef */		//.Value is not configurable
		NULL_PTR,	/* DslROEConnectionRef */				//.Value is not configurable
		&DcmDslProtocolTxList[DCM_DIAG_P2P_ACK],	/* DslProtocolTx */
	},
};

extern const Dcm_DslProtocolRowType DslProtocolRowList[];

const Dcm_DslConnectionType DslConnectionList[] = {
	{
		&DslProtocolRowList[0],	/* DslProtocolRow */
		&DslMainConnectionList[0],	/* DslMainConnection */
		NULL_PTR,	/* DslPeriodicTransmission */	//.Value is not configurable
		NULL_PTR,	/* DslResponseOnEvent */	//.Value is not configurable
		FALSE	/* Arc_EOL */
	},
	{// EOL
		NULL_PTR,	/* DslProtocolRow */
		NULL_PTR,	/* DslMainConnection */
		NULL_PTR,	/* DslPeriodicTransmission */	//.Value is not configurable
		NULL_PTR,	/* DslResponseOnEvent */	//.Value is not configurable
		TRUE	/* Arc_EOL */
	}
};

extern const Dcm_DslProtocolTimingRowType ProtocolTimingList[];

static Dcm_DslRunTimeProtocolParametersType dcmDslRuntimeVariables[2]; // for DIAG_P2P and DIAG_P2A
const Dcm_DslProtocolRowType DslProtocolRowList[]= {
	{
		DCM_UDS_ON_CAN,	/* DslProtocolID */
		FALSE,	/* DslProtocolIsParallelExecutab */ // not supported
		0,	/* DslProtocolPreemptTimeout */	// not supported
		0,	/* DslProtocolPriority */	// not supported
		DCM_PROTOCOL_TRANS_TYPE_1,	/* DslProtocolTransType */
		&DcmDslBufferList[0],	/* DslProtocolRxBufferID */
		&DcmDslBufferList[1],	/* DslProtocolTxBufferID */
		&DsdServiceTable[0],	/* DslProtocolSIDTable */
		&ProtocolTimingList[0],	/* DslProtocolTimeLimit */
		DslConnectionList,	/* DslConnection */
		&dcmDslRuntimeVariables[0],	/* DslRunTimeProtocolParameters */
		FALSE	/* Arc_EOL */
	},
	{//EOL
		-1,	/* DslProtocolID */
		FALSE,	/* DslProtocolIsParallelExecutab */ // not supported
		0,	/* DslProtocolPreemptTimeout */	// not supported
		0,	/* DslProtocolPriority */	// not supported
		0,	/* DslProtocolTransType */
		NULL_PTR,	/* DslProtocolRxBufferID */
		NULL_PTR,	/* DslProtocolTxBufferID */
		NULL_PTR,	/* DslProtocolSIDTable */
		NULL_PTR,	/* DslProtocolTimeLimit */
		NULL_PTR,	/* DslConnection */
		NULL_PTR,	/* DslRunTimeProtocolParameters */
		TRUE	/* Arc_EOL */
	}
};

static const Dcm_DslProtocolType DslProtocol = {
    DcmDslProtocolRxList,	/* DslProtocolRxGlobalList */
    DcmDslProtocolTxList,	/* DslProtocolTxGlobalList */
    DslProtocolRowList	/* DslProtocolRowList */
};

const Dcm_DslProtocolTimingRowType ProtocolTimingList[] = {
	{
		50,	/* TimStrP2ServerMax */		// ms
		10,	/* TimStrP2ServerMin */
		5000,	/* TimStrP2StarServerMax */		//.Value is not configurable
		2000,	/* TimStrP2StarServerMin */		//.Value is not configurable
		5000,	/* TimStrS3Server */
		FALSE	/* Arc_EOL */
	},
	{//EOL
		0,	/* TimStrP2ServerMax */		// ms
		0,	/* TimStrP2ServerMin */
		0,	/* TimStrP2StarServerMax */		//.Value is not configurable
		0,	/* TimStrP2StarServerMin */		//.Value is not configurable
		0,	/* TimStrS3Server */
		TRUE	/* Arc_EOL */
	},
};

const Dcm_DslProtocolTimingType ProtocolTiming = {
    ProtocolTimingList	/* DslProtocolTimingRow */
};

static const Dcm_DslSessionControlType SessionControlList[] = {
	{
		 Diag_GetSesChgPer,	/* GetSesChgPermission */
		 NULL_PTR,	/* ChangeIndication */
		 NULL_PTR,	/* ConfirmationRespPend */
		 FALSE	/* Arc_EOL */
	},
	{//EOL
		 NULL_PTR,	/* GetSesChgPermission */
		 NULL_PTR,	/* ChangeIndication */
		 NULL_PTR,	/* ConfirmationRespPend */
		 TRUE	/* Arc_EOL */
	}
};

static const Dcm_DslDiagRespType DiagResp = {
    TRUE,	/* DslDiagRespForceRespPendEn */
    10	/* DslDiagRespMaxNumRespPend */
};

static const Dcm_DslType Dsl = {
    DcmDslBufferList,	/* DslBuffer */
    DCMRequestServiceList,	/* DslCallbackDCMRequestService */
    &DiagResp,	/* DslDiagResp */
    &DslProtocol,	/* DslProtocol */
    &ProtocolTiming,	/* DslProtocolTiming */
    DCMServiceRequestIndicationList,	/* DslServiceRequestIndication */
    SessionControlList	/* DslSessionControl */
};

AUTOSAR-Dcm Dslのコンフィグレーションコード解説

太郎くん
太郎くん

これは・・・。
読み解ける気がしないのだけど・・・。

フクさん
フクさん

クラス図と睨めっこしながら追いかけるしかないねー。
一個、コツとしては、構造体配列になっている部分の終端がをArc_EOLというメンバ変数で指定することができて、
これがTUREだと終端って扱いになるよ。

AUTOSAR-Dcm Dslのコンフィグレーション構造
太郎くん
太郎くん

なるほど。
Arc_EOLがTRUEの部分は終端だから読まなくてよいのか・・・。
ちょっと読む量が減ったかも?くらいだな・・・。

フクさん
フクさん

ちなみにこれで必要最低限の構成なんで。

太郎くん
太郎くん

まじか・・・。

フクさん
フクさん

あと、以下のコールバック関数も定義している。

  • Diag_RequestServiceStart:診断サービス開始時に呼ばれる。
  • Diag_RequestServiceStop:診断サービス終了時に呼ばれる。
  • Diag_RequestServiceIndication:有効なサービスリクエスト時に読み出される。
  • Diag_GetSesChgPer:セッション移行時に呼び出される(移行元と移行先が引数でわかる)

現状は空関数だけどね。

フクさん
フクさん

ここらへんは、動作確認が取れた後に少しずつ弄っていければいいんじゃないかな?

太郎くん
太郎くん

いや、ホントそんな感じだよねー。

まとめ

フクさん
フクさん

まとめだよ。

  • Dslの構造体定義のコードを書いた。
  • リストの終端はArc_EOLがTUREの時。
    • ※ OpenSARことArcCore独自の仕様
  • 診断サービスの開始停止、有効なサービスリクエスト時、セッション移行をトリガとしたコールバック関数が定義できる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました