exponenta event banner

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

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

В модели или программно можно настроить режим обнаружения услуг для каждого требуемого порта услуг как OneTime или DynamicDiscovery:

  • В модели можно использовать словарь AUTOSAR, чтобы открыть атрибуты обнаружения службы для требуемых портов и выбрать их режимы обнаружения службы.

    В этом примере показано, как установить требуемый порт в значение DynamicDiscovery.

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

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

Значение режима обнаружения службы влияет на сгенерированный код 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);
      }
    }

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

Подробнее