Коммуникация адаптивного сервиса 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); } }