Interfaz de VHAL

La VHAL del AIDL se define en el android.hardware.automotive.vehicle namespace La interfaz de VHAL se define en IVehicle.aidl A menos que se especifique, se deben implementar todos los métodos.

Método
VehiclePropConfigs getAllPropConfigs()
Devuelve una lista de todos Compatibilidad con parámetros de configuración de la propiedad por el HAL de este vehículo.
VehiclePropConfigs getPropConfigs(in int[] props)
Devuelve una lista de Parámetros de configuración de la propiedad para proporcionados IDs de propiedad.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Obtén los valores de propiedad del vehículo de forma asíncrona. Controla un lote. de GetValueRequest de forma asíncrona. El resultado se entrega a través de la onGetValues de devolución de llamada.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Define los valores de propiedad del vehículo de forma asíncrona. Maneja un lote de SetValueRequest de forma asíncrona. El resultado se entrega a través de la onSetValues de devolución de llamada.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Se suscribe a los eventos de la propiedad con las opciones especificadas. Las opciones de suscripción incluyen ID de propiedad, ID de área de propiedad y tasa de muestreo en Hz (para una propiedad continua). maxSharedMemoryFileCount no está en uso.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Anula la suscripción de los eventos de propiedades a las que te suscribiste anteriormente para propiedades específicas.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
No se usa y se puede implementar como no-op.

Las devoluciones de llamada se definen en IVehicleCallback.aidl y contiene estos métodos.

Método
oneway void onGetValues(in GetValueResults responses)
Es la devolución de llamada para que la función getValues entregue resultados de valores. Llamaste a cuando algunos de los valores para recuperar estén listos.
oneway void onSetValues(in SetValueResults responses)
Es la devolución de llamada para que la función setValues proporcione resultados de valores establecidos. Se llama cuando VHAL terminó de controlar algunas de las solicitudes de conjuntos de propiedades.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Devolución de llamada para informar eventos de actualización de propiedades.
propiedad
CONTINUOUS, se produce un evento de propiedad en función de la tasa de muestreo de suscripción en Hz o frecuencia de mensajes de bus del vehículo. Un evento de propiedad también puede ocurrir si la configuración los cambios de estado. Por ejemplo, de no disponible a disponible.
Para la propiedad ON_CHANGE, se produce un evento de propiedad cuando el valor de una propiedad o cambia el estado de una propiedad.
SharedMemoryFileCount siempre es 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Devolución de llamada para informar errores de conjuntos de propiedades asíncronos que no tienen un conjunto correspondiente para cada solicitud. Si sabemos para qué solicitud de configuración corresponde el error, onSetValues con un error.

Para obtener más información, consulta IVehicle.aidl y IVehicleCallback.aidl.

La implementación de VHAL es validada por el VTS de VHAL en VtsHalAutomotiveVehicle_TargetTest.cpp La prueba verifica que los métodos básicos se implementen correctamente y que se admita la propiedad. de configuración sean correctos.

Valor de propiedad del vehículo

Usa el VehiclePropValue para describir el valor de cada propiedad, que tiene los siguientes campos:

Campo Descripción
timestamp La marca de tiempo que representa la hora en que ocurrió el evento y se sincronizó con el Reloj de SystemClock.elapsedRealtimeNano().
prop Es el ID de propiedad de este valor.
areaid Es el ID de área de este valor. El área debe ser una de las áreas admitidas que se mencionan en el área. configuración de ID, o 0 para propiedades globales.
value Es una estructura de datos que contiene el valor real de la propiedad. Según el tipo de propiedad, puede ser se usarán más campos dentro de este campo para almacenar el valor real. Por ejemplo, el primer en value.int32Values se usa para las propiedades de tipo Int32. Para obtener más información, consulta Propiedad Configuraciones.

getValues y setValues asíncronos

Las operaciones getValues y setValues se realizan de forma asíncrona. lo que significa que la función puede mostrarse antes de que se complete la operación get o set real. Los resultados de la operación (por ejemplo, valor de propiedad para getValues y éxito o estado de error de setValues) se entregan a través de las devoluciones de llamada pasadas como argumentos.

La implementación no debe bloquear el resultado en el subproceso de Binder que controla la solicitud. En su lugar, te recomendamos que almacenes la solicitud en una cola de solicitudes y uses un subproceso de controlador independiente para manejar las solicitudes de forma asíncrona. Consulta la Implementación de referencia para más detalles.

Figura 1: Proceso asíncrono.

Objetos parcelables grandes

Todas las estructuras llamadas XXXs, como VehiclePropConfigs, Se llama a SetValueRequests y VehiclePropValues LargeParcelable (o StableLargeParcelable) Cada uno representa una lista de valores usados para pasar grandes datos que podrían superar las limitaciones de Binder (4 KB en el implementación de la biblioteca LargeParcelable) a través de los límites de Binder. Cada uno tiene un de estructura básica que contiene los siguientes campos.

Orientación Descripción
payloads Lista de valores cuando el tamaño del valor se ajusta a una limitación de memoria de Binder o una lista vacía.
sharedMemoryFd Descriptor de archivos anulable que apunta a un archivo de memoria compartida que almacena la configuración cargas útiles si la lista de valores es demasiado extensa.

Por ejemplo, VehiclePropConfigs se define de la siguiente manera:

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 contiene cargas útiles no vacías o un valor no nulo sharedMemoryFd

  • Si payloads no está vacío, almacenará una lista de los datos reales, que es la la configuración de la propiedad.
  • Si sharedMemoryFd no es nulo, contiene un archivo de memoria compartida, que almacena la estructura serializada de VehiclePropConfigs. La estructura utiliza writeToParcel para serializar un Parcel.

Como cliente de Java para VHAL, Car Service controla la serialización y deserialización para LargeParcelable Para las implementaciones de VHAL y los clientes nativos, se puede LargeParcelable debe serializarse y deserializarse con el LargeParcelable o una clase wrapper útil para la biblioteca en ParcelableUtils.h

Por ejemplo, un cliente nativo que analiza solicitudes de getValues recibidas de un Binder es la siguiente:

// 'requests' are from the binder.
GetValueRequests requests;
expected, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests);
if (deserializedResults.ok()) {
    const std::vector& getValueRequests = deserializedResults.value().getObject()->payloads;
    // Use the getValueRequests.
  } else {
    // handle error.
}

En este ejemplo, se muestra una implementación de VHAL de ejemplo que envía resultados para getValues a través del Binder. como se muestra a continuación:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}