Main Content

AUTOSAR Adaptive サービス検出モードの構成

AUTOSAR Adaptive サービス通信には、サービスをサブスクライブするために 1 回だけの検出または動的検出を使用するようにアプリケーションを構成するオプションがあります。既定の検出モードである OneTime を使用すると、AUTOSAR アプリケーションは初期化時にサービスを検索してサービスにサブスクライブできます。この検出モードでは、適用の前にサービスを開始する必要がある場合があります。AUTOSAR アプリケーションが、サービスが使用可能になった時点でサービスを検出してサービスにサブスクライブできるように、サービス検出モードを DynamicDiscovery に変更できます。

各要求側サービス ポートのサービス検出モードを、モデルで、またはプログラムによって OneTime または DynamicDiscovery として構成できます。

  • モデルから、AUTOSAR ディクショナリを使用して、要求側ポートの [Service discovery] 属性を開き、それらのサービス検出モードを選択できます。

    この例では、要求側ポートを DynamicDiscovery に設定する方法を示します。

  • プログラムによって、getAUTOSARProperties API から関数setを使用することで、サービス検出モードを構成できます。

    この例では、要求側ポートを DynamicDiscovery に設定する方法を示します。

    hModel = 'autosar_LaneGuidance';
    addpath(fullfile(matlabroot,'/examples/autosarblockset/main'));
    open_system(hModel);
    apiObj = autosar.api.getAUTOSARProperties(hModel);
    set(apiObj,"/LaneGuidance_pkg/LaneGuidance_swc/LaneGuidance/RequiredPort/", ...
    "ServiceDiscoveryMode", "DynamicDiscovery")

サービス検出モードの値は、次の 2 つの場所にある生成された C++ コード (モデルのソース コード ファイル) に影響します。

  • StartFindService API の呼び出しサイトとコールバック (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);
      }
    }

関連する例

詳細