VHAL-интерфейс

AIDL VHAL определен в android.hardware.automotive.vehicle namespace . Интерфейс 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)
Не используется и может быть реализован как неактивный.

Обратные вызовы определены в 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 событие свойства происходит при изменении значения или состояния свойства.
SharedMemoryFileCount всегда равен 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Обратный вызов для сообщения об ошибках асинхронного набора свойств, для которых нет соответствующего запроса на установку. Если мы знаем, для какого запроса установки возникла ошибка, вместо этого необходимо использовать onSetValues ​​с результатом ошибки.

Дополнительные сведения см. в разделах IVehicle.aidl и IVehicleCallback.aidl .

Реализация VHAL проверяется VHAL VTS по адресу VtsHalAutomotiveVehicle_TargetTest.cpp . Тест проверяет правильность реализации основных методов и правильность поддерживаемых конфигураций свойств.

Стоимость имущества транспортного средства

Используйте структуру VehiclePropValue для описания значения каждого свойства, которое имеет следующие поля:

Поле Описание
timestamp Временная метка, представляющая время возникновения события и синхронизированная с часами SystemClock.elapsedRealtimeNano() .
prop Идентификатор свойства для этого значения.
areaid Идентификатор области для этого значения. Область должна быть одной из поддерживаемых областей, перечисленных в конфигурации идентификатора области, или 0 для глобальных свойств.
value Структура данных, содержащая фактическое значение свойства. В зависимости от типа свойства одно или несколько полей в этом поле используются для хранения фактического значения. Например, первый элемент в value.int32Values ​​используется для свойств типа Int32. Подробности см. в разделе «Конфигурации свойств» .

Асинхронные getValues ​​и setValues

Операции getValues ​​и setValues ​​выполняются асинхронно, что означает, что функция может вернуться до завершения фактической операции получения или установки. Результаты операции (например, значение свойства для getValues ​​и статус успеха или ошибки для setValues ) доставляются через обратные вызовы, передаваемые в качестве аргументов.

Реализация не должна блокировать результат в потоке связывания, обрабатывающем запрос. Вместо этого мы рекомендуем хранить запрос в очереди запросов и использовать отдельный поток обработчика для асинхронной обработки запросов. Подробности смотрите в эталонной реализации .

Рисунок 1. Асинхронный процесс.

Крупные посылки

Все структуры с именами XXXs , такие как VehiclePropConfigs , SetValueRequests и VehiclePropValues называются LargeParcelable (или StableLargeParcelable ). Каждый представляет собой список значений, используемых для передачи больших данных, которые могут превышать ограничения связующего (4 КБ в реализации библиотеки LargeParcelable ) через границы связующего. Каждый из них имеет схожее определение структуры, которое содержит следующие поля.

Руководство Описание
payloads Список значений, размер которых соответствует ограничению памяти подшивки, или пустой список.
sharedMemoryFd Дескриптор файла, допускающий значение NULL, указывающий на файл общей памяти, в котором хранятся сериализованные полезные данные, если список значений слишком велик.

Например, 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 для сериализации посылки.

В качестве 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.
}