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

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

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

はじめに

AUTOSAR-Dcmのインターフェースの話。
実際のインターフェース部分のソースコードについて。

登場人物

博識フクロウのフクさん

イラスト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 インターフェース用関数

フクさん
フクさん

さて、前々回やったけどAUTOSAR-Dcmのインターフェース関数は以下。

  • Dcm_ProvideRxBuffer
  • Dcm_RxIndication
  • PduR_DcmTransmit
  • Dcm_TxConfirmation
  • Dcm_MainFunction
太郎くん
太郎くん

これらの辻褄合わせがいるんだっけ?

フクさん
フクさん

うん。
でもまぁそんなに難しくはないんだよねー。

太郎くん
太郎くん

もしかして結構一撃?

フクさん
フクさん

まぁDcmのコンフィグレーション側に難易度が寄ってる分、
ソースコード側は一撃。

太郎くん
太郎くん

じゃー、とっとと始末してしまおう!

AUTOSAR-Dcm インターフェース用関数の実装

フクさん
フクさん

以下がそのコード。

PduInfoType *g_pDcmInfoType = NULL_PTR;	// Dcm送受信バッファへの参照
int g_rxcnt = 0;	// 受信カウンタ
int g_txcnt = 0;	// 送信カウンタ

BufReq_ReturnType _PduR_CanTpCopyRxData(PduIdType PduId, PduInfoType *PduInfoPtr, PduLengthType *RxBufferSizePtr)
{
	int i;
	PduIdType dcmRxPduId;
	PduInfoType *pDcmInfoType;
	
	pDcmInfoType = g_pDcmInfoType;

	if( pDcmInfoType != NULL_PTR ){
		for (i = 0U; i < PduInfoPtr->SduLength; i++) {
			pDcmInfoType->SduDataPtr[g_rxcnt++] = PduInfoPtr->SduDataPtr[i]; 
		}
	}
	
	return(BUFREQ_OK);
}

BufReq_ReturnType _PduR_CanTpCopyTxData(PduIdType PduId, PduInfoType *PduInfoPtr, RetryInfoType *RetryInfoPtr, PduLengthType *TxDataCntPtr)
{
	int i;
	PduInfoType *pDcmInfoType = NULL_PTR;
	
	pDcmInfoType = g_pDcmInfoType;
	
	if( pDcmInfoType != NULL_PTR ){
		for (i = 0U; i < PduInfoPtr->SduLength; i++) {
			PduInfoPtr->SduDataPtr[i] = pDcmInfoType->SduDataPtr[g_txcnt++]; 
		}
	}

	
	return(BUFREQ_OK);
}

Std_ReturnType PduR_DcmTransmit(PduIdType DcmTxPduId, const PduInfoType* PduInfoPtr) {
	PduInfoType *pDcmInfoType;
	
	CanTp_Transmit( canTxPduId, PduInfoPtr);
	Dcm_ProvideTxBuffer( canTxPduId, &pDcmInfoType, PduInfoPtr->SduLength );
	g_pDcmInfoType = pDcmInfoType;

	return 0;
}

BufReq_ReturnType _PduR_CanTpStartOfReception(PduIdType PduId, const PduInfoType *PduInfoPtr, PduLengthType TpSduLength, PduLengthType *RxBufferSizePtr)
{
	PduIdType dcmPduIdType;
	PduInfoType *pDcmInfoType = NULL_PTR;
	
	// Dcmよりバッファの参照を取得
	Dcm_ProvideRxBuffer( PduId, TpSduLength, &pDcmInfoType );
	g_pDcmInfoType = pDcmInfoType;
	g_rxcnt = 0;	// 受信カウンタクリア
	g_txcnt = 0;	// 送信カウンタクリア
	
	return(BUFREQ_OK);
}

void _PduR_CanTpRxIndication(PduIdType PduId, NotifResultType Result)
{
	Dcm_RxIndication(PduId ,Result);
}

void _PduR_CanTpTxConfirmation(PduIdType PduId, NotifResultType Result)
{
	Dcm_TxConfirmation(PduId, Result);
}



// 1[ms]周期で呼び出し
void main_handler()
{
	_WaitForSigleObject( hMutex,-1);
	
	CanTp_MainFunction();
	Dcm_MainFunction(); 
	
	_ReleaseMutex(hMutex);
}

AUTOSAR-Dcm インターフェース用関数の解説

太郎くん
太郎くん

予想以上にシンプルだけど・・・。
何をしてるの?

フクさん
フクさん

ポイントはグローバル変数で定義した、これ

PduInfoType *g_pDcmInfoType = NULL_PTR;	// Dcm送受信バッファへの参照
int g_rxcnt = 0;	// 受信カウンタ
int g_txcnt = 0;	// 送信カウンタ
太郎くん
太郎くん

たしか、送受信用のバッファはDcm側が管理してるんだよね?
それを参照するためにg_pDcmInfoTypeがある感じだね。

太郎くん
太郎くん

そして、実際の送受信数はg_rxcnt、g_txcntで自前でカウントする必要があると。

フクさん
フクさん

あとは、_PduR_CanTpStartOfReceptionが受信開始時に呼び出される関数なので、
ここで、Dcm管理のバッファ取得と各種カウンタの初期化をしている。

太郎くん
太郎くん

うん。コメントにも書いてあったんでなんとなくわかった。

フクさん
フクさん

とりあえず、インターフェースの辻褄合わせはこんなもん。

まとめ

フクさん
フクさん

まとめだよ。

  • AUTOSAR-Dcmのインターフェース関数復習。
  • AUTOSAR-Dcmのインターフェース関数を実装してみた。

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

コメント

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