このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
AUTOSAR Adaptive サービス検出モードの構成
AUTOSAR Adaptive サービス通信には、サービスをサブスクライブするために 1 回だけの検出または動的検出を使用するようにアプリケーションを構成するオプションがあります。既定の検出モードである OneTime を使用すると、AUTOSAR アプリケーションは初期化時にサービスを検索してサービスにサブスクライブできます。この検出モードでは、適用の前にサービスを開始する必要がある場合があります。AUTOSAR アプリケーションが、サービスが使用可能になった時点でサービスを検出してサービスにサブスクライブできるように、サービス検出モードを DynamicDiscovery に変更できます。
各要求側サービス ポートのサービス検出モードを、モデルで、またはプログラムによって OneTime または DynamicDiscovery として構成できます。
モデルから、AUTOSAR ディクショナリを使用して、要求側ポートの [サービス検出] 属性を開き、それらのサービス検出モードを選択できます。
この例では、要求側ポートを
DynamicDiscoveryに設定する方法を示します。
プログラムによって、getAUTOSARProperties API から関数
setを使用することで、サービス検出モードを構成できます。この例では、要求側ポートを
DynamicDiscoveryに設定する方法を示します。hModel = 'autosar_LaneGuidance'; openExample(hModel); apiObj = autosar.api.getAUTOSARProperties(hModel); set(apiObj,"/LaneGuidance_pkg/LaneGuidance_swc/LaneGuidance/RequiredPort/", ... "ServiceDiscoveryMode", "DynamicDiscovery")
サービス検出モードの値は、次の 2 つの場所にある生成された C++ コード (モデルのソース コード ファイル) に影響します。
StartFindServiceAPI の呼び出しサイトとコールバック (InstanceIdentifierバリアントとInstanceSpecifierバリアントの両方) の登録。// Model initialize function void autosar_LaneGuidanceModelClass::initialize() { ProvidedPort = std::make_shared< company::chassis::provided::skeleton:: ProvidedInterfaceSkeleton >(ara::com::InstanceIdentifier("2"), ara::com:: MethodCallProcessingMode::kPoll); ProvidedPort->OfferService(); company::chassis::required::proxy::RequiredInterfaceProxy::StartFindService (std::move(std::bind(&autosar_LaneGuidanceModelClass::RequiredPortSvcHandler, this, std::placeholders::_1, std::placeholders::_2)), ara::com:: InstanceIdentifier("1")); }コールバック関数の定義。
void autosar_LaneGuidanceModelClass::RequiredPortSvcHandler(ara::com:: ServiceHandleContainer< company::chassis::required::proxy:: RequiredInterfaceProxy::HandleType > svcHandles, const ara::com:: FindServiceHandle fsHandle) { if ((!RequiredPort) && (svcHandles.size() > 0U)) { RequiredPort = std::make_shared< company::chassis::required::proxy:: RequiredInterfaceProxy >(*svcHandles.begin()); RequiredPort->leftCarInBlindSpot.Subscribe(1U); RequiredPort->leftLaneDistance.Subscribe(1U); RequiredPort->leftTurnIndicator.Subscribe(1U); RequiredPort->rightCarInBlindSpot.Subscribe(1U); RequiredPort->rightLaneDistance.Subscribe(1U); RequiredPort->rightTurnIndicator.Subscribe(1U); company::chassis::required::proxy::RequiredInterfaceProxy::StopFindService (fsHandle); } }