Propriedades do veículo

A interface Vehicle Hardware Abstraction Layer (VHAL) define as propriedades que os OEMs podem implementar e contém metadados de propriedade (por exemplo, se a propriedade é um int e quais modos de alteração são permitidos). A interface VHAL é baseada no acesso (leitura, gravação, assinatura) de uma propriedade, que é uma abstração para uma função específica.

Interfaces HAL

O VHAL usa as seguintes interfaces:

  • getAllPropConfigs() gera (vec<VehiclePropConfig>propConfigs)
    Liste a configuração de todas as propriedades suportadas pelo VHAL. CarService usa apenas propriedades suportadas.
  • getPropConfigs(vec<int32_t> props) gera (StatusCode status,vec<VehiclePropConfig> propConfigs);
    Retorne a configuração das propriedades selecionadas.
  • set(VehiclePropValue propValue) gera (StatusCodestatus);
    Escreva um valor para a propriedade. O resultado da gravação é definido por propriedade.
  • subscribe(IVehicleCallback callback, vec<SubscribeOptions> options) gera (StatusCode status);
    Comece a monitorar uma alteração no valor de uma propriedade. Para propriedade zoneada, unsubscribe(IVehicleCallback callback, int32_t propId) gera (StatusCode status);

O VHAL usa as seguintes interfaces de retorno de chamada:

  • oneway onPropertyEvent(vec<VehiclePropValue>propValues);
    Notifica a alteração do valor da propriedade do veículo. Deve ser feito apenas para imóveis inscritos.
  • oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
    Retorna erro de nível VHAL global ou erro por propriedade. O erro global faz com que o HAL seja reiniciado, o que pode levar à reinicialização de outros componentes (incluindo aplicativos).

Propriedades do veículo

As propriedades podem ser somente leitura, somente gravação (usadas para passar informações para o nível VHAL) ou leitura e gravação (o suporte da maioria das propriedades é opcional). Cada propriedade é identificada exclusivamente por uma chave int32 e possui um tipo predefinido ( value_type ):

  • BYTES
  • BOOLEAN
  • EPOCH_TIME
  • FLOAT
  • FLOAT[]
  • INT32
  • INT32[]
  • INT64
  • INT64[]
  • STRING
  • MIXED

Uma propriedade zoneada pode ter mais de um valor, com base no número de zonas suportadas pela propriedade.

Tipos de área

O VHAL define vários tipos de área:

Tipo de área Descrição
GLOBAL Este imóvel é singleton e não possui múltiplas áreas.
WINDOW Área baseada em janelas, usa enum VehicleAreaWindow .
MIRROR Área baseada em espelhos, usa enum VehicleAreaMirror .
SEAT Área baseada em assentos, usa enum VehicleAreaSeat .
DOOR Área baseada em portas, usa enum VehicleAreaDoor .
WHEEL Área baseada em rodas, usa enum VehicleAreaWheel .

Cada propriedade zoneada deve usar um tipo de área predefinido. Cada tipo de área possui um conjunto de sinalizadores de bits definidos em uma enumeração para o tipo de área. Por exemplo, a á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

As propriedades zoneadas são endereçadas por meio de IDs de área. Cada propriedade zoneada pode suportar um ou mais IDs de área. Um ID de área é composto por um ou mais sinalizadores de seu respectivo enum. Por exemplo, uma propriedade que usa VehicleAreaSeat pode usar os seguintes IDs de área:

Item Descrição
ROW_1_LEFT | ROW_1_RIGHT O Area ID aplica-se a ambos os bancos dianteiros.
ROW_2_LEFT Aplica-se apenas ao banco traseiro esquerdo.
ROW_2_RIGHT Aplica-se apenas ao banco traseiro direito.

Situação da propriedade

Cada valor de propriedade vem com um valor VehiclePropertyStatus . Isso indica o status atual da propriedade:

Item Descrição
AVAILABLE O imóvel está disponível e o valor é válido.
UNAVAILABLE O valor da propriedade não está disponível no momento. Usado para recursos desativados temporariamente para uma propriedade compatível.
ERROR Algo está errado com esta propriedade.

Configurando uma propriedade

Use VehiclePropConfig para fornecer informações de configuração para cada propriedade. As informações incluem:

Variável Descrição
access r , w , rw
changeMode Representa como uma propriedade é monitorada, em mudança versus contínua.
areaConfigs valores areaId , min e max .
configArray Parâmetros de configuração adicionais.
configString Informações adicionais passadas como uma string.
minSampleRate maxSampleRate
prop ID da propriedade, int

Tratamento de propriedades de zona

Uma propriedade zoneada é equivalente a uma coleção de diversas propriedades onde cada subpropriedade pode ser acessada com o valor de ID de área especificado.

  • get call para propriedade zoneada sempre inclui o ID da área na solicitação. Portanto, somente o valor atual do ID de área solicitado é retornado. Se a propriedade for global, o ID da área será 0.
  • set call for zoned property sempre inclui o ID da área na solicitação. Portanto, apenas o ID de área solicitado é alterado.
  • A chamada subscribe gera eventos para todos os IDs de área da propriedade.

Receber chamadas

Durante a inicialização, o valor da propriedade pode ainda não estar disponível, pois a mensagem de rede do veículo correspondente ainda não foi recebida. Nesses casos, a chamada get deve retornar -EAGAIN . Algumas propriedades (como HVAC) possuem propriedade de energia liga/desliga separada. Chamar get para tal propriedade (quando desligado) deve retornar um status UNAVAILABLE em vez de retornar um erro. Por exemplo, obtenha temperatura HVAC

VHAL obtém exemplo de HVAC

Figura 1 . Obtenha a temperatura HVAC (CS = CarService, VHAL = Veículo HAL)

Definir chamadas

Em uma operação típica, uma chamada set leva à realização de uma solicitação de alteração na rede do veículo. Uma chamada set é idealmente uma operação assíncrona que retorna o mais rápido possível, mas também pode ser síncrona. Algumas chamadas set podem exigir que os dados iniciais estejam prontos, mas durante a inicialização, esses dados podem ainda não estar disponíveis. Nesses casos, a chamada set deve retornar StatusCode#TRY_AGAIN . Algumas propriedades com ligação e desligamento separados devem retornar StatusCode#NOT_AVAILABLE ou StatusCode#NOT_AVAILABLE_DISABLED quando a propriedade está desligada e set não pode ser feita. Até que set seja efetivado, get não retorna necessariamente o mesmo valor que foi definido. Por exemplo, set HVAC Temperature .

Exemplo de conjunto HVAC VHAL

Figura 2 . Definir temperatura HVAC (CS = CarService, VHAL = Veículo HAL)

Tratamento de propriedades customizadas

Para atender às necessidades específicas do parceiro, o VHAL permite propriedades personalizadas restritas aos aplicativos do sistema. Use as seguintes diretrizes ao trabalhar com propriedades customizadas:

  • O ID da propriedade deve ser gerado usando os seguintes campos:
    • VehiclePropertyGroup:VENDOR
      O grupo VENDOR é usado somente para propriedades customizadas.
    • VehicleArea
      Selecione um tipo de área apropriado.
    • VehiclePropertyType
      Selecione o tipo de dados adequado. O tipo BYTES permite a passagem de dados brutos, o que é suficiente na maioria dos casos. O envio frequente de big data por meio de propriedades personalizadas pode retardar o acesso à rede de todo o veículo. Tenha cuidado ao adicionar uma grande carga útil.
    • Property ID
      Escolha um ID de quatro nibbles para a propriedade customizada.
  • Para evitar a fragmentação do ecossistema, as propriedades personalizadas não devem ser usadas para replicar propriedades de veículos que já existem no ( VehiclePropertyIds SDK).
  • Preencha VehiclePropConfig.configString com uma breve descrição da propriedade customizada. Isso permite que ferramentas de verificação de integridade sinalizem a replicação acidental de propriedades de veículos existentes. Por exemplo, "estado de luz de perigo".
  • Acesso através CarPropertyManager (para componentes Java) ou através da API Vehicle Network Service (para nativos). Não modifique APIs de outros carros, pois isso pode levar a problemas de compatibilidade futuros.
  • Depois de implementar as propriedades do fornecedor, selecione apenas a lista de permissões na enumeração VehicleVendorPermission para propriedades do fornecedor. Mapear as permissões do fornecedor para as propriedades do sistema quebrará o CTS e o VTS.

Lidando com propriedades HVAC

Você pode usar o VHAL para controlar o HVAC definindo propriedades relacionadas ao HVAC. A maioria das propriedades HVAC são propriedades zoneadas, embora várias sejam propriedades não zoneadas (globais). As propriedades definidas por exemplo incluem:

Propriedade Propósito
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET Defina a temperatura por zona.
VEHICLE_PROPERTY_HVAC_RECIRC_ON Controlar a recirculação por zona.

Para ver uma lista completa de propriedades HVAC, pesquise VEHICLE_PROPERTY_HVAC_* em types.hal . Quando a propriedade HVAC usa VehicleAreaSeat , aplicam-se regras adicionais para mapear uma propriedade HVAC zoneada para IDs de área. Cada assento disponível no carro deve fazer parte de um Area ID na matriz Area ID.

Exemplo Um. Um carro tem dois assentos dianteiros ( ROW_1_LEFT, ROW_1_RIGHT ) e três assentos traseiros ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT ). O carro possui duas unidades de controle de temperatura: lado do motorista e lado do passageiro.

  • Um conjunto de mapeamento válido de IDs de área para HVAC_TEMPERATURE SET é:
    • ROW_1_LEFT | ROW_2_LEFT
    • ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
  • Um mapeamento alternativo para a mesma configuração de hardware é:
    • ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
    • ROW_1_RIGHT | ROW_2_RIGHT

Exemplo dois. Um carro tem três filas de assentos com dois assentos na primeira fila ( ROW_1_LEFT, ROW_1_RIGHT ), três assentos na segunda ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT ) e três na terceira fila ( ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT ). O carro possui três unidades de controle de temperatura: lado do motorista, lado do passageiro e traseira. Uma maneira razoável de mapear HVAC_TEMPERATURE_SET para IDs de área é como uma matriz de três 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

Manipulando propriedades do sensor

As propriedades do sensor VHAL representam dados reais do sensor ou informações de política, como status de direção. Algumas informações do sensor (como status de direção e modo dia/noite) podem ser acessadas por qualquer aplicativo sem restrições, pois os dados são obrigatórios para construir um aplicativo de veículo seguro. Outras informações do sensor (como a velocidade do veículo) são mais confidenciais e requerem permissões específicas que os usuários podem gerenciar.

Veja as propriedades do sensor suportadas (em types.hal ).

Serviço de mapas de veículos

O Vehicle Map Service (VMS) fornece um mecanismo para trocar dados de mapas entre clientes por meio de uma interface pub/sub para oferecer suporte a recursos comuns de veículos, como Sistemas Avançados de Assistência ao Motorista (ADAS) . Os clientes podem incluir sistemas de veículos fazendo interface por meio da propriedade VMS no VHAL ou em aplicativos Android privilegiados. Os dados compartilhados no VMS destinam-se a ser limitados a dados de mapas para uso por sistemas de veículos e aplicativos de suporte.

O VMS destina-se ao uso somente em implementações do Android Automotive; O AOSP não contém clientes padrão que publicam ou assinam VMS. Para a propriedade VMS no VHAL, os tipos de mensagens e estruturas de dados são descritos no VHAL 2.0 no enum VmsMessageType , que lista os tipos de mensagens VMS suportadas. Este enum é usado como o primeiro inteiro na matriz de inteiros da propriedade do veículo e determina como o restante da mensagem é decodificado.