Interface VHAL

O AIDL VHAL é definido no android.hardware.automotive.vehicle namespace . A interface VHAL é definida em IVehicle.aidl . A menos que especificado, todos os métodos devem ser implementados.

Método
VehiclePropConfigs getAllPropConfigs()
Retorna uma lista de todas as configurações de propriedade suportadas por este veículo HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Retorna uma lista de configurações de propriedade para determinados IDs de propriedade.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Obtenha valores de propriedades de veículos de forma assíncrona. Lida com um lote de GetValueRequest de forma assíncrona. O resultado é entregue por meio do método de retorno de chamada onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Defina os valores das propriedades do veículo de forma assíncrona. Lida com um lote de SetValueRequest de forma assíncrona. O resultado é entregue através do método onSetValues ​​de retorno de chamada.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Assina eventos de propriedade com opções especificadas. As opções de assinatura incluem ID de propriedade, ID de área de 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 assinatura de eventos de propriedade assinados anteriormente para propriedades especificadas.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Não usado e pode ser implementado como autônomo.

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

Método
oneway void onGetValues(in GetValueResults responses)
Retorno de chamada para a função getValues ​​para fornecer resultados de obtenção de valor. Chamado quando alguns dos valores a serem buscados estão prontos.
oneway void onSetValues(in SetValueResults responses)
Retorno de chamada para a função setValues ​​para fornecer resultados de valor definido. Chamado quando o VHAL termina de lidar com algumas das solicitações de conjunto de propriedades.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Retorno de chamada para relatar eventos de atualização de propriedade.
Propriedade CONTINUOUS , um evento de propriedade ocorre com base na taxa de amostragem de assinatura em Hz ou na frequência de mensagem do barramento do veículo. Um evento de propriedade também poderá ocorrer se o status de uma propriedade for alterado. 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 é alterado.
SharedMemoryFileCount é sempre 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Retorno de chamada para relatar erros de conjunto de propriedades assíncronas que não possuem solicitação de conjunto correspondente. Se soubermos para qual solicitação de conjunto o erro se destina, onSetValues ​​com um resultado de erro deverá ser usado em vez disso.

Para obter mais informações, consulte IVehicle.aidl e IVehicleCallback.aidl .

A implementação do VHAL é validada pelo VHAL VTS em VtsHalAutomotiveVehicle_TargetTest.cpp . O teste verifica se os métodos básicos estão implementados corretamente e se as configurações de propriedades suportadas estão corretas.

Valor da propriedade do veículo

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

Campo Descrição
timestamp O carimbo de data/hora que representa a hora em que o evento aconteceu 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 deve ser uma das áreas suportadas listadas na configuração do ID de á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 dentro deste campo são usados ​​para armazenar o valor real. Por exemplo, o primeiro elemento em value.int32Values ​​é usado para propriedades do tipo Int32. Para obter detalhes, consulte Configurações de propriedade .

getValues ​​e setValues ​​assíncronos

As operações getValues ​​e setValues ​​são executadas de forma assíncrona, o que significa que a função pode retornar antes que a operação get ou set real seja concluída. Os resultados da operação (por exemplo, valor da propriedade para getValues ​​e status de sucesso ou erro para setValues ​​) são entregues por meio de retornos de chamada passados ​​como argumentos.

A implementação não deve bloquear o resultado no encadeamento do fichário que trata a solicitação. Em vez disso, recomendamos que você armazene a solicitação em uma fila de solicitações e use um thread manipulador separado para manipular as solicitações de forma assíncrona. Consulte a Implementação de Referência para obter detalhes.

Figura 1. Processo assíncrono.

Grandes parcelamentos

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

Orientação Descrição
payloads Lista de valores quando o tamanho do valor se ajusta a uma limitação de memória do fichário ou a uma lista vazia.
sharedMemoryFd Descritor de arquivo anulável apontando para um arquivo de memória compartilhada que armazena as cargas serializadas 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 cargas úteis não vazias ou um sharedMemoryFd não nulo.

  • Se payloads não estiverem vazias, ele armazena 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 Parcel.

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

Por exemplo, um cliente nativo que analisa solicitações de getValues ​​recebidas de um fichário é 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 VHAL que envia resultados para getValues ​​por meio do fichário é mostrado abaixo:

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