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() | |
VehiclePropConfigs getPropConfigs(in int[] props) | |
void getValues(IVehicleCallback callback, in GetValueRequests requests) 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) 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) maxSharedMemoryFileCount não é usado. | |
void unsubscribe(in IVehicleCallback callback, in int[] propIds) | |
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId) |
Os retornos de chamada são definidos em IVehicleCallback.aidl
e contêm esses métodos.
Método | |
---|---|
oneway void onGetValues(in GetValueResults responses) 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) 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) 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.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) 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
úteis 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 deVehiclePropConfigs
. A estrutura usa a funçãowriteToParcel
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
Um exemplo de implementação VHAL que envia resultados para getValues
por meio do fichário é mostrado abaixo:
std::vector