La interfaz de la capa de abstracción de hardware del vehículo (VHAL) define las propiedades que los OEMs pueden implementar y contiene metadatos de propiedades (por ejemplo, si la propiedad es un int y qué modos de cambio se permiten). La interfaz de VHAL se basa en acceder (leer, escribir, suscribirse) a una propiedad, que es una abstracción para una función específica.
Interfaces de HAL
La VHAL usa las siguientes interfaces:
getAllPropConfigs()
genera(vec<VehiclePropConfig>propConfigs)
Enumera la configuración de todas las propiedades compatibles con VHAL. CarService solo usa propiedades compatibles.getPropConfigs(vec<int32_t> props)
genera(StatusCode status,vec<VehiclePropConfig> propConfigs);
Muestra la configuración de las propiedades seleccionadas.set(VehiclePropValue propValue)
genera(StatusCodestatus);
Escribe un valor en la propiedad. El resultado de la escritura se define por propiedad.subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
genera(StatusCode status);
Comienza a supervisar un cambio en el valor de una propiedad. Para la propiedad con zona,unsubscribe(IVehicleCallback callback, int32_t propId)
genera(StatusCode status);
.
El VHAL usa las siguientes interfaces de devolución de llamada:
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Notifica el cambio de valor de la propiedad del vehículo. Solo se debe realizar para las propiedades suscritas.oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Devuelve un error global a nivel de VHAL o un error por propiedad. El error global hace que se reinicie el sistema HAL, lo que puede provocar el reinicio de otros componentes (incluidas las aplicaciones).
Propiedades del vehículo
Las propiedades pueden ser de solo lectura, de solo escritura (se usan para pasar información al nivel de VHAL) o de lectura y escritura (la compatibilidad con la mayoría de las propiedades es opcional). Cada propiedad se identifica de forma inequívoca con una clave int32 y tiene un tipo predefinido (value_type
):
BYTES
BOOLEAN
EPOCH_TIME
FLOAT
FLOAT[]
INT32
INT32[]
INT64
INT64[]
STRING
MIXED
Una propiedad con zonas puede tener más de un valor, según la cantidad de zonas que admite la propiedad.
Tipos de áreas
El VHAL define varios tipos de áreas:
Tipo de área | Descripción |
---|---|
GLOBAL |
Esta propiedad es un singleton y no tiene varias áreas. |
WINDOW |
Área basada en ventanas, usa la enumeración VehicleAreaWindow . |
MIRROR |
El área basada en espejos usa la enumeración VehicleAreaMirror . |
SEAT |
Área basada en asientos, usa la enumeración VehicleAreaSeat . |
DOOR |
Área basada en puertas, usa la enumeración VehicleAreaDoor . |
WHEEL |
Área basada en ruedas, usa enum VehicleAreaWheel . |
Cada propiedad con zonas debe usar un tipo de área predefinido. Cada tipo de área tiene un conjunto de marcas de bits definidas en una enumeración para el tipo de área. Por ejemplo, el área SEAT
define enums VehicleAreaSeat
:
ROW_1_LEFT = 0x0001
ROW_1_CENTER = 0x0002
ROW_1_RIGHT = 0x0004
ROW_2_LEFT = 0x0010
ROW_2_CENTER = 0x0020
ROW_2_RIGHT = 0x0040
ROW_3_LEFT = 0x0100
- …
IDs de área
Las propiedades con zonas se abordan a través de los IDs de área. Cada propiedad por zonas puede admitir uno o más IDs de área. Un ID de área se compone de una o más marcas de su respectiva enumeración. Por ejemplo, una propiedad que usa VehicleAreaSeat
podría usar los siguientes IDs de área:
Artículo | Descripción |
---|---|
ROW_1_LEFT | ROW_1_RIGHT |
El ID de área se aplica a ambos asientos delanteros. |
ROW_2_LEFT |
Solo se aplica al asiento trasero izquierdo. |
ROW_2_RIGHT |
Solo se aplica al asiento trasero derecho. |
Estado de la propiedad
Cada valor de propiedad incluye un valor VehiclePropertyStatus
.
Indica el estado actual de la propiedad:
Artículo | Descripción |
---|---|
AVAILABLE |
La propiedad está disponible y el valor es válido. |
UNAVAILABLE |
El valor de la propiedad no está disponible en este momento. Se usa para funciones inhabilitadas de forma transitoria para una propiedad compatible. |
ERROR |
Hay un problema con esta propiedad. |
Cómo configurar una propiedad
Usa VehiclePropConfig
para proporcionar información de configuración para cada propiedad. La información incluye lo siguiente:
Variable | Descripción |
---|---|
access |
r , w y rw |
changeMode |
Representa cómo se supervisa una propiedad, ya sea de forma continua o cuando cambia. |
areaConfigs |
Valores de areaId , min y max |
configArray |
Parámetros de configuración adicionales. |
configString |
Es la información adicional que se pasa como una cadena. |
minSampleRate |
maxSampleRate |
prop |
ID de la propiedad, int |
Cómo controlar las propiedades de la zona
Una propiedad con zonas equivale a una colección de varias propiedades a las que se puede acceder con el valor de ID de área especificado para cada subpropiedad.
- La llamada a
get
para propiedad por zonas siempre incluye el ID de área en la solicitud. Por lo tanto, solo se muestra el valor actual del ID de área solicitado. Si la propiedad es global, el ID de área es 0. - La llamada
set
para la propiedad con zona siempre incluye el ID de área en la solicitud. Por lo tanto, solo se cambia el ID de área solicitado. - La llamada
subscribe
genera eventos para todos los IDs de área de la propiedad.
Cómo recibir llamadas
Durante la inicialización, es posible que el valor de la propiedad aún no esté disponible, ya que aún no se recibió el mensaje de red del vehículo coincidente. En esos casos, la llamada a get
debe mostrar -EAGAIN
. Algunas propiedades (como el sistema de HVAC) tienen una propiedad de encendido/apagado independiente. Llamar a get
para una propiedad de este tipo (cuando está apagada) debería mostrar un estado UNAVAILABLE
en lugar de un error. Por ejemplo, obtener la temperatura del sistema de HVAC
Figura 1. Obtén la temperatura del sistema de HVAC (CS = CarService, VHAL = HAL del vehículo)
Cómo configurar llamadas
En una operación típica, una llamada a set
genera una solicitud de cambio en la red del vehículo. Idealmente, una llamada a set
es una operación asíncrona que se muestra lo antes posible, pero también puede ser síncrona. Es posible que algunas llamadas a set
requieran que los datos iniciales estén listos, pero es posible que durante la inicialización esos datos aún no estén disponibles. En esos casos, la llamada a set
debería mostrar StatusCode#TRY_AGAIN
. Algunas propiedades con encendido y apagado independientes deben mostrar StatusCode#NOT_AVAILABLE
o StatusCode#NOT_AVAILABLE_DISABLED
cuando la propiedad está apagada y no se puede realizar set
. Hasta que set
se haga efectivo, get
no muestra necesariamente el mismo valor que se configuró. Por ejemplo, set HVAC Temperature
.
Figura 2. Establece la temperatura del sistema de HVAC (CS = CarService, VHAL = HAL del vehículo)
Controla las propiedades personalizadas
Para admitir las necesidades específicas de los socios, el VHAL permite propiedades personalizadas que se limitan a las apps del sistema. Usa los siguientes lineamientos cuando trabajes con propiedades personalizadas:
- El ID de propiedad se debe generar en los siguientes campos:
VehiclePropertyGroup:VENDOR
El grupoVENDOR
solo se usa para propiedades personalizadas.VehicleArea
Selecciona un tipo de área adecuado.VehiclePropertyType
Selecciona el tipo de datos adecuado. El tipoBYTES
permite pasar datos sin procesar, lo que es suficiente en la mayoría de los casos. El envío de macrodatos con frecuencia a través de propiedades personalizadas puede ralentizar el acceso a la red del vehículo. Ten cuidado cuando agregues una carga útil grande.Property ID
Elige un ID de cuatro nibbles para la propiedad personalizada.
- Para evitar la fragmentación del ecosistema, las propiedades personalizadas no deben usarse para replicar las propiedades del vehículo que ya existen en el (SDK de VehiclePropertyIds).
- Completa
VehiclePropConfig.configString
con una breve descripción de la propiedad personalizada. Esto permite que las herramientas de verificación de coherencia marquen la replicación accidental de propiedades de vehículos existentes. Por ejemplo, "estado de las luces de peligro". - Se debe acceder a través de
CarPropertyManager
(para componentes de Java) o de la API de Vehicle Network Service (para componentes nativos). No modifiques otras APIs de vehículos, ya que hacerlo puede generar problemas de compatibilidad en el futuro. - Después de implementar las propiedades del proveedor, selecciona solo la lista de permisos en la enum
VehicleVendorPermission
para las propiedades del proveedor. Si asignas permisos del proveedor a las propiedades del sistema, se incumplirá el CTS y el VTS.
Controla las propiedades de HVAC
Puedes usar el VHAL para controlar el sistema de HVAC configurando propiedades relacionadas con él. La mayoría de las propiedades de HVAC son propiedades con zonas, aunque varias son propiedades sin zonas (globales). Estos son algunos ejemplos de propiedades definidas:
Propiedad | Propósito |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET |
Establece la temperatura por zona. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON |
Controla la recirculación por zona. |
Para ver una lista completa de las propiedades de HVAC, busca VEHICLE_PROPERTY_HVAC_*
en types.hal
. Cuando la propiedad de HVAC usa VehicleAreaSeat
, se aplican reglas adicionales para asignar una propiedad de HVAC con zonas a los IDs de área. Cada asiento disponible en el vehículo debe ser parte de un ID de área en el array de IDs de área.
Ejemplo uno. Un automóvil tiene dos asientos delanteros (ROW_1_LEFT, ROW_1_RIGHT
) y tres asientos traseros (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). El automóvil tiene dos unidades de control de temperatura: el lado del conductor y el lado del pasajero.
- Un conjunto de asignación válido de IDs de área para
HVAC_TEMPERATURE SET
es el siguiente:ROW_1_LEFT | ROW_2_LEFT
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
- Una asignación alternativa para la misma configuración de hardware es la siguiente:
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
ROW_1_RIGHT | ROW_2_RIGHT
Ejemplo 2. Un automóvil tiene tres filas de asientos con dos asientos en la fila delantera (ROW_1_LEFT, ROW_1_RIGHT
), tres asientos en la segunda (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) y tres en la tercera fila (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). El automóvil tiene tres unidades de control de temperatura: lado del conductor, lado del pasajero y parte trasera. Una forma razonable de asignar HVAC_TEMPERATURE_SET
a los IDs de área es con un array de tres elementos:
ROW_1_LEFT
ROW_1_RIGHT
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Controla las propiedades del sensor
Las propiedades del sensor de VHAL representan datos de sensores reales o información de políticas, como el estado de conducción. Cualquier app puede acceder a cierta información del sensor (como el estado de conducción y el modo diurno y nocturno) sin restricción, ya que los datos son obligatorios para compilar una aplicación segura para vehículos. Otra información del sensor (como la velocidad del vehículo) es más sensible y requiere permisos específicos que los usuarios pueden administrar.
Consulta las propiedades de los sensores compatibles (en types.hal
).
Servicio de mapas para vehículos
El Servicio de mapas de vehículos (VMS) proporciona un mecanismo para intercambiar datos de mapas entre clientes a través de una interfaz de Pub/Sub para admitir funciones comunes del vehículo, como los Sistemas avanzados de asistencia al conductor (ADAS). Los clientes pueden incluir sistemas de vehículos que se comunican a través de la propiedad VMS en el VHAL o en aplicaciones de Android con privilegios. Los datos que se comparten en las VMs están diseñados para limitarse a datos de mapas para que los usen los sistemas del vehículo y las apps compatibles.
VMS está diseñado para usarse solo en implementaciones de Android Automotive. AOSP no contiene clientes predeterminados que publiquen o se suscriban a VMS. En el caso de la propiedad VMS en el VHAL, los tipos de mensajes y las estructuras de datos se describen en VHAL 2.0 en la enumeración VmsMessageType
, que enumera los tipos de mensajes de VMS admitidos. Esta enumeración se usa como el primer número entero en el array de números enteros de la propiedad del vehículo y determina cómo se decodifica el resto del mensaje.