Интерфейс Vehicle Hardware Abstraction Layer (VHAL) определяет свойства, которые OEM-производители могут реализовать, и содержит метаданные свойств (например, является ли свойство целым числом и какие режимы изменения разрешены). Интерфейс VHAL основан на доступе (чтении, записи, подписке) к свойству, которое является абстракцией для определенной функции.
HAL-интерфейсы
VHAL использует следующие интерфейсы:
-
getAllPropConfigs()
генерирует(vec<VehiclePropConfig>propConfigs)
Перечислите конфигурацию всех свойств, поддерживаемых VHAL. CarService использует только поддерживаемые свойства. -
getPropConfigs(vec<int32_t> props)
генерирует(StatusCode status,vec<VehiclePropConfig> propConfigs);
Верните конфигурацию выбранных свойств. -
set(VehiclePropValue propValue)
генерирует(StatusCodestatus);
Записать значение в свойство. Результат записи определяется для каждого свойства. -
subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
генерирует(StatusCode status);
Начать мониторинг изменения значения свойства. Для зонированного свойстваunsubscribe(IVehicleCallback callback, int32_t propId)
генерирует(StatusCode status);
VHAL использует следующие интерфейсы обратного вызова:
-
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Уведомляет об изменении стоимости имущества транспортного средства. Следует делать только для подписанных свойств. -
oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Возвращает глобальную ошибку уровня VHAL или ошибку по свойству. Глобальная ошибка приводит к перезапуску HAL, что может привести к перезапуску других компонентов (включая приложения).
Свойства транспортного средства
Свойства могут быть только для чтения, только для записи (используются для передачи информации на уровень VHAL) или для чтения и записи (поддержка большинства свойств необязательна). Каждое свойство уникально идентифицируется ключом int32 и имеет предопределенный тип ( value_type
):
-
BYTES
-
BOOLEAN
-
EPOCH_TIME
-
FLOAT
-
FLOAT[]
-
INT32
-
INT32[]
-
INT64
-
INT64[]
-
STRING
-
MIXED
Зонированная недвижимость может иметь более одного значения в зависимости от количества зон, поддерживаемых недвижимостью.
Типы площадей
VHAL определяет несколько типов областей:
Тип площади | Описание |
---|---|
GLOBAL | Данный объект недвижимости является одиночным и не имеет нескольких зон. |
WINDOW | Область основана на окнах, использует перечисление VehicleAreaWindow . |
MIRROR | Площадь на основе зеркал, использует перечисление VehicleAreaMirror . |
SEAT | Площадь определяется по количеству мест, используется перечисление VehicleAreaSeat . |
DOOR | Площадь на основе дверей, использует перечисление VehicleAreaDoor . |
WHEEL | Площадь основана на колесах, используется перечисление VehicleAreaWheel . |
Каждое зонированное свойство должно использовать предопределенный тип области. Каждый тип области имеет набор битовых флагов, определенных в перечислении для типа области. Например, область SEAT
определяет перечисления VehicleAreaSeat
:
-
ROW_1_LEFT = 0x0001
-
ROW_1_CENTER = 0x0002
-
ROW_1_RIGHT = 0x0004
-
ROW_2_LEFT = 0x0010
-
ROW_2_CENTER = 0x0020
-
ROW_2_RIGHT = 0x0040
-
ROW_3_LEFT = 0x0100
- ...
Идентификаторы областей
Зонированные свойства адресуются через идентификаторы областей. Каждое зонированное свойство может поддерживать один или несколько идентификаторов областей. Идентификатор области состоит из одного или нескольких флагов из соответствующего перечисления. Например, свойство, использующее VehicleAreaSeat
, может использовать следующие идентификаторы областей:
Элемент | Описание |
---|---|
ROW_1_LEFT | ROW_1_RIGHT | Идентификатор зоны применяется к обоим передним сиденьям. |
ROW_2_LEFT | Применимо только к заднему левому сиденью. |
ROW_2_RIGHT | Применимо только к заднему правому сиденью. |
Статус имущества
Каждое значение свойства имеет значение VehiclePropertyStatus
. Оно указывает текущий статус свойства:
Элемент | Описание |
---|---|
AVAILABLE | Недвижимость доступна и ее стоимость действительна. |
UNAVAILABLE | Значение свойства в настоящее время недоступно. Используется для временно отключенных функций для поддерживаемого свойства. |
ERROR | С этим объектом недвижимости что-то не так. |
Настройка свойства
Используйте VehiclePropConfig
для предоставления информации о конфигурации для каждого свойства. Информация включает:
Переменная | Описание |
---|---|
access | r , w , rw |
changeMode | Показывает, как контролируется свойство: при изменении или непрерывно. |
areaConfigs | Значения areaId , min и max . |
configArray | Дополнительные параметры конфигурации. |
configString | Дополнительная информация передается в виде строки. |
minSampleRate | maxSampleRate |
prop | Идентификатор свойства, int |
Обработка свойств зоны
Зонированная недвижимость эквивалентна набору нескольких объектов недвижимости, где к каждому подобъекту недвижимости можно получить доступ с помощью указанного значения идентификатора области.
- вызов
get
для зонированного свойства всегда включает в запрос идентификатор области. Поэтому возвращается только текущее значение для запрошенного идентификатора области. Если свойство глобальное, идентификатор области равен 0. - вызов
set
для зонированной собственности всегда включает в запрос идентификатор области. Поэтому изменяется только запрошенный идентификатор области. - Вызов
subscribe
генерирует события для всех идентификаторов областей объекта недвижимости.
Получайте звонки
Во время инициализации значение свойства может быть еще недоступно, поскольку соответствующее сообщение сети транспортного средства еще не получено. В таких случаях вызов get
должен возвращать -EAGAIN
. Некоторые свойства (например, HVAC) имеют отдельное свойство включения/выключения питания. Вызов get
для такого свойства (при выключенном питании) должен возвращать статус UNAVAILABLE
, а не возвращать ошибку. Например, get HVAC Temperature
Рисунок 1. Получить температуру HVAC (CS = CarService, VHAL = Vehicle HAL)
Установить звонки
В типичной операции вызов set
приводит к выполнению запроса на изменение по всей сети транспортного средства. В идеале вызов set
— это асинхронная операция, которая возвращается как можно скорее, но она также может быть синхронной. Некоторые вызовы set
могут потребовать готовности начальных данных, но во время инициализации такие данные могут быть еще недоступны. В таких случаях вызов set
должен возвращать StatusCode#TRY_AGAIN
. Некоторые свойства с раздельным включением и выключением питания должны возвращать StatusCode#NOT_AVAILABLE
или StatusCode#NOT_AVAILABLE_DISABLED
когда свойство выключено и set
не может быть выполнено. Пока set
не вступит в силу, get
не обязательно возвращает то же значение, что и set. Например, set HVAC Temperature
.
Рисунок 2. Установка температуры HVAC (CS = CarService, VHAL = Vehicle HAL)
Обработка пользовательских свойств
Для поддержки потребностей партнеров VHAL допускает пользовательские свойства, которые ограничены системными приложениями. Используйте следующие рекомендации при работе с пользовательскими свойствами:
- Идентификатор недвижимости должен быть сформирован с использованием следующих полей:
-
VehiclePropertyGroup:VENDOR
ГруппаVENDOR
используется только для пользовательских свойств. -
VehicleArea
Выберите подходящий тип области. -
VehiclePropertyType
Выберите правильный тип данных. ТипBYTES
позволяет передавать необработанные данные, что достаточно в большинстве случаев. Частая отправка больших данных через пользовательские свойства может замедлить доступ ко всей сети транспортного средства — будьте осторожны при добавлении большой полезной нагрузки. -
Property ID
Выберите четырехбайтовый идентификатор для пользовательского свойства.
-
- Чтобы предотвратить фрагментацию экосистемы, пользовательские свойства не должны использоваться для копирования свойств транспортного средства, которые уже существуют в (SDK VehiclePropertyIds ).
- Заполните
VehiclePropConfig.configString
кратким описанием пользовательского свойства. Это позволяет инструментам проверки работоспособности отмечать случайное копирование существующих свойств транспортного средства. Например, «состояние аварийного сигнала». - Доступ через
CarPropertyManager
(для компонентов Java) или через API службы сети транспортного средства (для нативных). Не изменяйте другие автомобильные API, так как это может привести к будущим проблемам совместимости. - После реализации свойств поставщика выберите только список разрешений в перечислении
VehicleVendorPermission
для свойств поставщика. Сопоставление разрешений поставщика со свойствами системы нарушит CTS и VTS.
Управление объектами HVAC
Вы можете использовать VHAL для управления HVAC, устанавливая свойства, связанные с HVAC. Большинство свойств HVAC являются зонированными свойствами, хотя некоторые из них являются незонированными (глобальными) свойствами. Примеры определенных свойств включают:
Свойство | Цель |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET | Установите температуру для каждой зоны. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON | Управление рециркуляцией по зонам. |
Чтобы увидеть полный список свойств HVAC, выполните поиск VEHICLE_PROPERTY_HVAC_*
в types.hal
. Когда свойство HVAC использует VehicleAreaSeat
, применяются дополнительные правила сопоставления зонированного свойства HVAC с идентификаторами областей. Каждое доступное место в автомобиле должно быть частью идентификатора области в массиве идентификаторов областей.
Пример первый. В автомобиле два передних сиденья ( ROW_1_LEFT, ROW_1_RIGHT
) и три задних сиденья ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). В автомобиле два блока управления температурой: со стороны водителя и со стороны пассажира.
- Допустимый набор сопоставлений идентификаторов областей для
HVAC_TEMPERATURE SET
:-
ROW_1_LEFT | ROW_2_LEFT
-
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
-
- Альтернативное сопоставление для той же конфигурации оборудования:
-
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
-
ROW_1_RIGHT | ROW_2_RIGHT
-
Пример два. В автомобиле три ряда сидений с двумя сиденьями в первом ряду ( ROW_1_LEFT, ROW_1_RIGHT
), тремя сиденьями во втором ряду ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) и тремя в третьем ряду ( ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). В автомобиле три блока управления температурой: со стороны водителя, со стороны пассажира и сзади. Разумный способ сопоставить HVAC_TEMPERATURE_SET
с идентификаторами областей — это использовать трехэлементный массив:
-
ROW_1_LEFT
-
ROW_1_RIGHT
-
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Обработка свойств датчика
Свойства датчика VHAL представляют собой реальные данные датчика или информацию о политике, такую как статус вождения. Некоторая информация датчика (например, статус вождения и режим день/ночь) доступна любому приложению без ограничений, поскольку эти данные являются обязательными для создания безопасного приложения для транспортного средства. Другая информация датчика (например, скорость транспортного средства) более конфиденциальна и требует специальных разрешений, которыми могут управлять пользователи.
См. поддерживаемые свойства датчика (в types.hal
).
Служба карт транспортных средств
Служба карт транспортных средств (VMS) предоставляет механизм обмена картографическими данными между клиентами через интерфейс pub/sub для поддержки общих функций транспортных средств, таких как Advanced Driver Assistance Systems (ADAS) . Клиенты могут включать системы транспортных средств, взаимодействующие через свойство VMS в VHAL или привилегированные приложения Android. Данные, совместно используемые в VMS, предназначены для ограничения картографических данных для использования системами транспортных средств и вспомогательными приложениями.
VMS предназначена для использования только в реализациях Android Automotive; AOSP не содержит клиентов по умолчанию, которые публикуют или подписываются на VMS. Для свойства VMS в VHAL типы сообщений и структуры данных описаны в VHAL 2.0 в перечислении VmsMessageType
, в котором перечислены типы поддерживаемых сообщений VMS. Это перечисление используется как первое целое число в массиве целых чисел свойств транспортного средства и определяет, как декодируется остальная часть сообщения.