Interfaz VHAL

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

Método
VehiclePropConfigs getAllPropConfigs()
Devuelve una lista de todas las configuraciones de propiedad admitidas por este vehículo HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Devuelve una lista de configuraciones de propiedades para ID de propiedad determinados.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Obtenga valores de propiedad de vehículos de forma asincrónica. Maneja un lote de GetValueRequest de forma asincrónica. El resultado se entrega a través del método de devolución de llamada onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Establezca los valores de propiedad del vehículo de forma asincrónica. Maneja un lote de SetValueRequest de forma asincrónica. El resultado se entrega a través del método de devolución de llamada onSetValues .
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Se suscribe a eventos de propiedad con opciones específicas. Las opciones de suscripción incluyen ID de propiedad, ID de área de propiedad y frecuencia de muestreo en Hz (para una propiedad continua). maxSharedMemoryFileCount no se utiliza.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Cancela la suscripción a eventos de propiedad previamente suscritos para propiedades específicas.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
No se utiliza y se puede implementar como no operativo.

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

Método
oneway void onGetValues(in GetValueResults responses)
Devolución de llamada para la función getValues ​​para entregar resultados de obtención de valor. Se llama cuando algunos de los valores a recuperar están listos.
oneway void onSetValues(in SetValueResults responses)
Devolución de llamada para la función setValues ​​para entregar resultados de valores establecidos. Se llama cuando VHAL ha terminado de manejar algunas de las solicitudes del conjunto de propiedades.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Devolución de llamada para informar eventos de actualización de propiedades.
Propiedad CONTINUOUS , un evento de propiedad ocurre según la frecuencia de muestreo de suscripción en Hz o la frecuencia de mensajes del bus del vehículo. También puede ocurrir un evento de propiedad si cambia el estado de una propiedad. Por ejemplo, de no disponible a disponible.
Para la propiedad ON_CHANGE , se produce un evento de propiedad cuando cambia el valor o el estado de una propiedad.
SharedMemoryFileCount es siempre 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Devolución de llamada para informar errores de conjuntos de propiedades asincrónicos que no tienen una solicitud de conjunto correspondiente. Si sabemos para qué solicitud de configuración es el error, se deben usar onSetValues ​​con un resultado de error en lugar de esto.

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

La implementación de VHAL es validada por VHAL VTS en VtsHalAutomotiveVehicle_TargetTest.cpp . La prueba verifica que los métodos básicos se implementen correctamente y que las configuraciones de propiedades admitidas sean correctas.

Valor de la propiedad del vehículo

Utilice la estructura VehiclePropValue para describir el valor de cada propiedad, que tiene estos campos:

Campo Descripción
timestamp La marca de tiempo que representa la hora en que ocurrió el evento y se sincronizó con el reloj SystemClock.elapsedRealtimeNano() .
prop El identificador de propiedad para este valor.
areaid El ID de área para este valor. El área debe ser una de las áreas admitidas enumeradas en la configuración de ID de área, o 0 para propiedades globales.
value Una estructura de datos que contiene el valor real de la propiedad. Según el tipo de propiedad, uno o más campos dentro de este campo se utilizan para almacenar el valor real. Por ejemplo, el primer elemento de value.int32Values ​​se utiliza para propiedades de tipo Int32. Para obtener más información, consulte Configuraciones de propiedades .

getValues ​​y setValues ​​asincrónicos

Las operaciones getValues ​​y setValues ​​se realizan de forma asincrónica, lo que significa que la función podría regresar antes de que se complete la operación get o set real. Los resultados de la operación (por ejemplo, el valor de la propiedad de getValues ​​y el estado de éxito o 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 carpeta que maneja la solicitud. En su lugar, le recomendamos almacenar la solicitud en una cola de solicitudes y utilizar un subproceso de controlador independiente para manejar las solicitudes de forma asincrónica. Consulte la Implementación de referencia para obtener más detalles.

Figura 1. Proceso asincrónico.

Parcelables grandes

Todas las estructuras denominadas XXXs , como VehiclePropConfigs , SetValueRequests y VehiclePropValues , se denominan LargeParcelable (o StableLargeParcelable ). Cada uno representa una lista de valores utilizados para pasar datos grandes que podrían exceder las limitaciones del cuaderno (4 KB en la implementación de la biblioteca LargeParcelable ) a través de los límites del cuaderno. Cada uno tiene una definición de estructura similar que contiene los siguientes campos.

Guía Descripción
payloads Lista de valores cuando el tamaño del valor se ajusta a una limitación de memoria de la carpeta o a una lista vacía.
sharedMemoryFd Descriptor de archivo que acepta valores NULL que apunta a un archivo de memoria compartida que almacena las cargas útiles serializadas si la lista de valores es demasiado grande.

Por ejemplo, VehiclePropConfigs se define como:

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 sharedMemoryFd no nulo.

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

Como cliente Java para VHAL, Car Service maneja la serialización y deserialización de LargeParcelable . Para implementaciones VHAL y clientes nativos, un LargeParcelable debe serializarse y deserializarse con la biblioteca LargeParcelable o una clase contenedora útil para la biblioteca en ParcelableUtils.h .

Por ejemplo, un cliente nativo que analiza las solicitudes de getValues ​​recibidas de una carpeta es el 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.
}

A continuación se muestra una implementación de VHAL de ejemplo que envía resultados para getValues ​​a través del cuaderno:

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