AIDL VHAL определен в android.hardware.automotive.vehicle namespace
. Интерфейс VHAL определен в IVehicle.aidl
. Если не указано иное, все методы должны быть реализованы для конкретной версии VHAL.
Версии
Android-версия | Последняя версия VHAL | Последняя версия свойства VHAL | Минимальная совместимая версия VHAL |
---|---|---|---|
Андроид 16 | В4 | В4 | В1 |
Андроид 15 | В3 | В3 | В1 |
Андроид 14 | В2 | В2 | В1 |
Андроид 13 | В1 | (Интерфейс свойств VHAL не разделен) | В1 |
РЕКОМЕНДУЕТСЯ внедрить последнюю версию VHAL для конкретной версии Android.
Функции и обратные вызовы
Функции VHAL определены в IVehicle.aidl
.
Метод | |
---|---|
VehiclePropConfigs getAllPropConfigs() | |
VehiclePropConfigs getPropConfigs(in int[] props) | |
void getValues(IVehicleCallback callback, in GetValueRequests requests) GetValueRequest асинхронно. Результат доставляется через метод обратного вызова onGetValues . | |
void setValues(IVehicleCallback callback, in SetValueRequests requests) SetValueRequest . Результат доставляется через метод обратного вызова onSetValues . | |
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount) maxSharedMemoryFileCount не используется. | |
void unsubscribe(in IVehicleCallback callback, in int[] propIds) | |
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId) | |
( Новое в Android 16 )SupportedValuesListResults getSupportedValuesLists(in List | |
( Новое в Android 16 )MinMaxSupportedValueResults getMinMaxSupportedValue(in List | |
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List | |
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List |
Обратные вызовы определены в IVehicleCallback.aidl
и содержат эти методы.
Метод | |
---|---|
oneway void onGetValues(in GetValueResults responses) getValues для доставки результатов получения значений. Вызывается, когда некоторые из значений для извлечения готовы. | |
oneway void onSetValues(in SetValueResults responses) setValues для доставки результатов набора значений. Вызывается, когда VHAL завершил обработку некоторых запросов на набор свойств. | |
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount) CONTINUOUS , событие свойства происходит на основе частоты выборки подписки в Гц или частоты сообщений шины транспортного средства. Событие свойства может также произойти, если статус свойства меняется. Например, с недоступного на доступный.ON_CHANGE событие свойства происходит, когда изменяется значение свойства или статус свойства.VehiclePropValue со статусом недоступно или ошибка и пустым значением.SharedMemoryFileCount всегда равен 0 . | |
oneway void onPropertySetError(in VehiclePropErrors errors) onSetValues с результатом ошибки. | |
oneway void onSupportedValueChange(in List getMinMaxSupportedValue или getSupportedValuesLists для получения обновленных значений. |
Реализация VHAL проверена VHAL VTS в VtsHalAutomotiveVehicle_TargetTest.cpp
.
Тест проверяет, что основные методы реализованы правильно, а поддерживаемые конфигурации свойств верны. Тест выполняется для всех экземпляров VHAL на устройстве, однако AAOS использует только экземпляр по умолчанию ( android.hardware.automotive.vehicle.IVehicle/default
)
Стоимость имущества транспортного средства
Используйте структуру VehiclePropValue
для описания значения каждого свойства, которая имеет следующие поля:
Поле | Описание |
---|---|
timestamp | Временная метка, представляющая время, когда произошло событие, синхронизированное с часами SystemClock.elapsedRealtimeNano() . |
prop | Идентификатор свойства для этого значения. |
areaid | Идентификатор области для этого значения. Область должна быть одной из поддерживаемых областей, перечисленных в конфигурации идентификатора области, или 0 для глобальных свойств. |
value | Структура данных, содержащая фактическое значение свойства. В зависимости от типа свойства одно или несколько полей в этом поле используются для хранения фактического значения. Например, первый элемент в value.int32Values используется для свойств типа Int32. Подробности см. в разделе Конфигурации свойств . |
status | Статус свойства для чтения. Для свойства чтения/записи это может также применяться для записи, но не гарантируется, например, свойство может быть доступно для чтения, но недоступно для записи. В таком случае статусом будет AVAILABLE , а поле значения содержит допустимую информацию. Возможные статусы см. в разделе VehiclePropertyStatus . |
Асинхронные getValues и setValues
Операции getValues
и setValues
выполняются асинхронно, что означает, что функция может вернуться до того, как фактическая операция get или set будет завершена. Результаты операции (например, значение свойства для getValues
и статус успеха или ошибки для setValues
) доставляются через обратные вызовы, передаваемые в качестве аргументов.
Реализация не должна блокировать результат в потоке связующего, который обрабатывает запрос. Вместо этого мы рекомендуем вам сохранить запрос в очереди запросов и использовать отдельный поток обработчика для асинхронной обработки запросов. Подробности см. в справочной реализации .
Рисунок 1. Асинхронный процесс.
Большие посылки
Все структуры с именем XXXs
, такие как VehiclePropConfigs
, SetValueRequests
и VehiclePropValues
, называются LargeParcelable
(или StableLargeParcelable
). Каждая представляет собой список значений, используемых для передачи больших данных, которые могут превышать ограничения связующего устройства (4 КБ в реализации библиотеки LargeParcelable
) через границы связующего устройства. Каждая имеет похожее определение структуры, которое содержит следующие поля.
Руководство | Описание |
---|---|
payloads | Список значений, размер которых соответствует ограничению памяти связующего устройства, или пустой список. |
sharedMemoryFd | Обнуляемый файловый дескриптор, указывающий на файл общей памяти, в котором хранятся сериализованные полезные данные, если список значений слишком велик. |
Например, VehiclePropConfigs
определяется как:
parcelable VehiclePropConfigs { // The list of vehicle property configs if they fit the binder memory // limitation. VehiclePropConfig[] payloads; // Shared memory file to store configs if they exceed binder memory // limitation. Created by VHAL, readable only at client. Client could keep // the fd opened or keep the FD mapped to access configs. @nullable ParcelFileDescriptor sharedMemoryFd; }
VehiclePropConfigs
содержит либо непустые полезные данные, либо ненулевой sharedMemoryFd
.
- Если
payloads
не пусты, они сохраняют список фактических данных, который является конфигурацией свойств. - Если
sharedMemoryFd
не равен нулю, он содержит файл общей памяти, в котором хранится сериализованная структураVehiclePropConfigs
. Структура использует функциюwriteToParcel
для сериализации Parcel.
Как клиент Java для VHAL, Car Service обрабатывает сериализацию и десериализацию для LargeParcelable
. Для реализаций VHAL и собственных клиентов LargeParcelable
должен быть сериализован и десериализован с помощью библиотеки LargeParcelable
или полезного класса-обертки для библиотеки в ParcelableUtils.h
.
Например, собственный клиент, анализирующий запросы getValues
, полученные от связующего устройства, выглядит следующим образом:
// 'requests' are from the binder. GetValueRequests requests; expected<LargeParcelableBase::BorrowedOwnedObject, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests); if (deserializedResults.ok()) { const std::vector & getValueRequests = deserializedResults.value().getObject()->payloads; // Use the getValueRequests. } else { // handle error. }
Ниже показан пример реализации VHAL, которая отправляет результаты для getValues
через связующее устройство:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }