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

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

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

  • Из вашей модели можно использовать Словарь 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);
      }
    }

Связанные примеры

Больше о