AIDL VHAL определен в android.hardware.automotive.vehicle namespace
. Интерфейс 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) |
Обратные вызовы определены в 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::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }