Interface VHAL

A VHAL da AIDL é definida na android.hardware.automotive.vehicle namespace: A interface VHAL é definida em IVehicle.aidl: A menos que especificado, todos os métodos precisam ser implementados.

Método
VehiclePropConfigs getAllPropConfigs()
Retorna uma lista de todos os Configurações de propriedade compatíveis pela HAL deste veículo.
VehiclePropConfigs getPropConfigs(in int[] props)
Retorna uma lista de Configurações da propriedade de um determinado IDs de propriedade.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Receba valores de propriedade do veículo de forma assíncrona. Processa um lote de GetValueRequest de forma assíncrona. O resultado é entregue Método de callback onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Defina valores de propriedade do veículo de forma assíncrona. Processa um lote SetValueRequest de forma assíncrona. O resultado é entregue Método de callback onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Assine eventos de propriedade com opções específicas. As opções de assinatura incluem ID da propriedade, ID da área da propriedade e 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 inscritos anteriormente para propriedades especificadas.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Não é usado e pode ser implementado como ambiente autônomo.

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

Método
oneway void onGetValues(in GetValueResults responses)
Callback da função getValues para entregar resultados GET de valor. Ligou para quando alguns dos valores a serem buscados estiverem prontos.
oneway void onSetValues(in SetValueResults responses)
Callback para a função setValues para entregar resultados de valores definidos. Chamado quando A VHAL terminou de processar algumas solicitações de definição de propriedades.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Callback para gerar relatórios de eventos de atualização da propriedade.
. propriedade
CONTINUOUS, um evento de propriedade acontece com base na taxa de amostragem das assinaturas em Hz ou na frequência das mensagens de ônibus do veículo. Um evento de propriedade também poderá acontecer se o atributo mudanças de status. Por exemplo, de indisponível para disponível.
.
Para a propriedade ON_CHANGE, um evento de propriedade acontece quando o valor de uma propriedade ou as mudanças no status de uma propriedade.
.
SharedMemoryFileCount é sempre 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback para relatar erros em conjuntos de propriedades assíncronos que não têm um conjunto correspondente solicitação. Se soubermos a qual solicitação de conjunto o erro se refere, onSetValues com um resultado de erro deve ser usado no lugar deste.

Para mais informações, consulte IVehicle.aidl (link em inglês) e IVehicleCallback.aidl.

A implementação da VHAL é validada pelo VHAL VTS em VtsHalAutomotiveVehicle_TargetTest.cpp. O teste verifica se os métodos básicos foram implementados corretamente e se a propriedade compatível estão corretas.

Valor de propriedade do veículo

Use o 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 aconteceu e sincronizado com o Relógio SystemClock.elapsedRealtimeNano().
prop O ID da propriedade para este valor.
areaid O ID da área para este valor. Precisa ser uma das áreas aceitas listadas Configuração do ID, 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 ou mais campos nesse campo são usados para armazenar o valor real. Por exemplo, o primeiro em value.int32Values é usado para propriedades do tipo Int32. Para mais detalhes, consulte Propriedade Configurações.

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 real get ou set seja concluída. Os resultados da operação, por exemplo, o valor da propriedade getValues e sucesso ou status de erro para setValues) são entregues 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 que você armazene a solicitação em uma fila de solicitações e use um thread de gerenciador separado para processar as solicitações de maneira assíncrona. Consulte a Implementação de referência para detalhes.

Figura 1. Processo assíncrono.

Parcelables grandes

Todas as estruturas chamadas XXXs, como VehiclePropConfigs, SetValueRequests e VehiclePropValues são chamados LargeParcelable (ou StableLargeParcelable). Cada um representa uma lista de valores usados para transmitir dados grandes que podem exceder as limitações do binder (4 KB no implementação da biblioteca LargeParcelable) entre os limites do binder. Cada um tem uma função , que contém os campos a seguir.

Orientação Descrição
payloads Lista de valores quando o tamanho do valor se encaixa em uma limitação de memória do binder ou uma lista vazia.
sharedMemoryFd Descritor de arquivo anulável que aponta para um arquivo de memória compartilhada que armazena o payloads 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 valor não nulo sharedMemoryFd.

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

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

Por exemplo, um cliente nativo analisando solicitações para getValues recebidas de um binder é o seguinte:

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

Um exemplo de implementação da VHAL que envia resultados para getValues pelo binder é mostrados abaixo:

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