Interface VHAL

O VHAL do AIDL é definido em android.hardware.automotive.vehicle namespace. A interface VHAL é definida em IVehicle.aidl. A menos que especificado, todos os métodos precisam ser implementados para uma versão específica do VHAL.

Versões

Versão do Android Versão mais recente do VHAL Versão mais recente da propriedade VHAL Versão mínima compatível do VHAL
Android 16 V4 V4 V1
Android 15 V3 V3 V1
Android 14 V2 V2 V1
Android 13 V1 (interface de propriedade VHAL não dividida) V1

É RECOMENDÁVEL implementar a versão mais recente do VHAL para uma versão específica do Android.

Funções e callbacks

As funções VHAL são definidas em IVehicle.aidl.

Método
VehiclePropConfigs getAllPropConfigs()
Retorna uma lista de todas as configurações de propriedade compatíveis com o HAL do veículo.
VehiclePropConfigs getPropConfigs(in int[] props)
Retorna uma lista de configurações de propriedade para IDs de propriedade específicos.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Receba os valores de propriedade do veículo de forma assíncrona. Processa um lote de GetValueRequest de forma assíncrona. O resultado é enviado pelo método onGetValues de callback.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Defina os valores de propriedade do veículo de forma assíncrona. Processa um lote de SetValueRequest de forma assíncrona. O resultado é enviado pelo método onSetValues de callback.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Se inscreve em eventos de propriedade com opções especificadas. As opções de inscrição incluem o ID da propriedade, o ID da área da propriedade e a taxa de amostragem em Hz (para uma propriedade contínua). maxSharedMemoryFileCount não é usado.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Cancela a inscrição em eventos de propriedade que foram assinados anteriormente para propriedades especificadas.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Não é usado e pode ser implementado como no-op.
(Novidades do Android 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Recebe as listas de valores com suporte para os pares de ID de propriedade e ID de área especificados.
Introduzido no VHAL V4.
(Novidade no Android 16)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Recebe os valores mínimo e máximo aceitos para os pares de ID de propriedade e de área especificados.
Introduzido no VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Registra um callback para ser chamado quando os valores compatíveis mudarem.
Introduzido no VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Desregistra o callback de mudança de valor compatível.
Introduzido no VHAL V4.

Os callbacks são definidos em IVehicleCallback.aidl e contêm esses métodos.

Método
oneway void onGetValues(in GetValueResults responses) Callback
para a função getValues para fornecer resultados de valor de recebimento. Chamada quando alguns dos valores a serem buscados estão prontos.
oneway void onSetValues(in SetValueResults responses) Callback
para a função setValues para fornecer resultados de valor definido. Chamada quando a VHAL termina de processar algumas das solicitações de conjunto de propriedades.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Callback para informar eventos de atualização da propriedade.
Propriedade
CONTINUOUS, um evento de propriedade ocorre com base na taxa de amostragem de inscrição em Hz ou na frequência da mensagem do barramento do veículo. Um evento de propriedade também pode ocorrer se o status de uma propriedade mudar. Por exemplo, de indisponível para disponível.
Para a propriedade ON_CHANGE, um evento de propriedade ocorre quando o valor ou o status de uma propriedade muda.
Também é necessário usar isso para enviar eventos de mudança de status da propriedade. Por exemplo, quando a propriedade fica indisponível ou apresenta um erro de leitura, um VehiclePropValue com um status indisponível ou de erro e um valor vazio precisam ser enviados.
SharedMemoryFileCount é sempre 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback para informar erros assíncronos do conjunto de propriedades que não têm uma solicitação correspondente. Se soubermos para qual solicitação de conjunto o erro é, onSetValues com um resultado de erro precisa ser usado em vez disso.
oneway void onSupportedValueChange(in List propIdAreaIds)
Callback para informar mudanças no valor mínimo e máximo ou na lista de valores compatíveis. O autor da chamada precisa chamar getMinMaxSupportedValue ou getSupportedValuesLists para receber os valores atualizados.

A implementação da VHAL é validada pelo VTS da VHAL em VtsHalAutomotiveVehicle_TargetTest.cpp.

O teste verifica se os métodos básicos são implementados corretamente e se as configurações de propriedade com suporte estão corretas. O teste é executado em todas as instâncias do VHAL no dispositivo. No entanto, o AAOS usa apenas a instância padrão (android.hardware.automotive.vehicle.IVehicle/default).

Valor da propriedade do veículo

Use a estrutura VehiclePropValue para descrever o valor de cada propriedade, que tem estes campos:

Campo Descrição
timestamp O carimbo de data/hora que representa a hora em que o evento ocorreu e foi sincronizado com o relógio SystemClock.elapsedRealtimeNano().
prop O ID da propriedade para esse valor.
areaid O ID da área para esse valor. A área precisa ser uma das áreas com suporte listadas na configuração do ID da área ou 0 para propriedades globais.
value Uma estrutura de dados que contém o valor real da propriedade. Com base no tipo de propriedade, um ou mais campos nesse campo são usados para armazenar o valor real. Por exemplo, o primeiro elemento em value.int32Values é usado para propriedades do tipo Int32. Para mais detalhes, consulte Configurações de propriedade.
status O status da propriedade para leitura. Para propriedades de leitura/gravação, isso também pode ser aplicado à gravação, mas não é garantido. Por exemplo, a propriedade pode estar disponível para leitura, mas não para gravação. Nesse caso, o status é AVAILABLE, e o campo de valor contém informações válidas. Para conferir os possíveis status, consulte VehiclePropertyStatus.

getValues e setValues assíncronos

As operações getValues e setValues são realizadas de forma assíncrona, o que significa que a função pode retornar antes que a operação de busca ou definição seja concluída. Os resultados da operação (por exemplo, o valor da propriedade para getValues e o status de sucesso ou de erro para setValues) são enviados pelos callbacks transmitidos como argumentos.

A implementação não pode bloquear o resultado na linha de execução de vinculação que processa a solicitação. Em vez disso, recomendamos armazenar a solicitação em uma fila de solicitações e usar uma linha de execução de gerenciador separada para processar as solicitações de forma assíncrona. Consulte a Implementação de referência para mais detalhes.

Figura 1. Processo assíncrono.

Parcelables grandes

Todas as estruturas com o nome XXXs, como VehiclePropConfigs, SetValueRequests e VehiclePropValues, são chamadas de LargeParcelable (ou StableLargeParcelable). Cada uma representa uma lista de valores usados para transmitir dados grandes que podem exceder as limitações do binder (4 KB na implementação da biblioteca LargeParcelable) em limites de binder. Cada um tem uma definição de estrutura semelhante que contém os seguintes campos.

Orientação Descrição
payloads Lista de valores quando o tamanho do valor se encaixa em uma limitação de memória do vinculador ou uma lista vazia.
sharedMemoryFd Um descritor de arquivo nulo que aponta para um arquivo de memória compartilhada que armazena os payloads serializados se a lista de valores for muito grande.

Por exemplo, VehiclePropConfigs é definido 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 contém payloads não vazios ou um sharedMemoryFd não nulo.

  • Se payloads não estiver vazio, ele vai armazenar uma lista dos dados reais, que é a configuração da propriedade.
  • Se sharedMemoryFd não for nulo, ele conterá um arquivo de memória compartilhada, que armazena a estrutura serializada de VehiclePropConfigs. A estrutura usa a função writeToParcel para serializar um pacote.

Como um cliente Java para VHAL, o Car Service processa a serialização e a desserialização de LargeParcelable. Para implementações de VHAL e clientes nativos, um LargeParcelable precisa ser serializado e desserializado com a biblioteca LargeParcelable ou uma classe de wrapper útil para a biblioteca em ParcelableUtils.h.

Por exemplo, uma análise de cliente nativo de solicitações de getValues recebidas de um vinculador é feita da seguinte maneira:

// '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.
}

Confira abaixo um exemplo de implementação do VHAL que envia resultados para getValues pelo vinculador:

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