VHAL-интерфейс

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()
Возвращает список всех конфигураций свойств, поддерживаемых HAL этого транспортного средства.
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 propIdAreaIds)
Получает списки поддерживаемых значений для указанных пар идентификаторов свойств и областей.
Представлено в VHAL V4.
( Новое в Android 16 )
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Получает минимальные и максимальные поддерживаемые значения для указанных пар идентификаторов свойства и идентификаторов области.
Представлено в VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Регистрирует обратный вызов, который будет вызван при изменении поддерживаемых значений.
Представлено в VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Отменяет регистрацию поддерживаемого обратного вызова изменения значения.
Представлено в VHAL V4.

Обратные вызовы определены в 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 propIdAreaIds)
Обратный вызов для сообщения об изменении минимального и максимального поддерживаемого значения или списка поддерживаемых значений. Вызывающий должен вызвать 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}