Сконфигурируйте режимы обнаружения адаптивных служб AUTOSAR

Коммуникация адаптивного сервиса AUTOSAR обеспечивает опцию настройки приложений для использования разового или динамического обнаружения для подписки на сервисы. Режим обнаружения по умолчанию, OneTime, позволяет приложению AUTOSAR находить и подписываться на службы при инициализации. Этот режим обнаружения может потребовать запуска служб перед приложением. Можно изменить режим обнаружения служб на DynamicDiscovery позволяет приложению AUTOSAR находить и подписываться на услуги по мере их доступности.

Можно сконфигурировать в модели или программно режим обнаружения услуг каждого необходимого сервисного порта следующим OneTime или DynamicDiscovery:

  • Из вашей модели можно использовать Dictionary AUTOSAR, чтобы открыть атрибуты Service discovery необходимых портов и выбрать их режимы обнаружения услуг.

    В этом примере показано, как задать необходимый порт DynamicDiscovery.

  • Программно можно использовать set функция из getAUTOSARProperties API, чтобы настроить режим обнаружения служб.

    В этом примере показано, как задать необходимый порт 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")

Значение режима обнаружения услуг влияет на сгенерированный код С++ (в файле исходного кода модели) в следующих двух местах:

  • Узел вызова 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);
      }
    }

Похожие примеры

Подробнее о