Interfaccia VHAL

L'AIDL VHAL è definito nello android.hardware.automotive.vehicle namespace . L'interfaccia VHAL è definita in IVehicle.aidl . Se non diversamente specificato, tutti i metodi devono essere implementati.

Metodo
VehiclePropConfigs getAllPropConfigs()
Restituisce un elenco di tutte le configurazioni di proprietà supportate da questo HAL del veicolo.
VehiclePropConfigs getPropConfigs(in int[] props)
Restituisce un elenco di configurazioni di proprietà per determinati ID di proprietà.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Ottieni i valori delle proprietà del veicolo in modo asincrono. Gestisce un batch di GetValueRequest in modo asincrono. Il risultato viene fornito tramite il metodo di callback onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Imposta i valori delle proprietà del veicolo in modo asincrono. Gestisce un batch di SetValueRequest in modo asincrono. Il risultato viene fornito tramite il metodo di callback onSetValues .
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Sottoscrive gli eventi della proprietà con le opzioni specificate. Le opzioni di iscrizione includono ID proprietà, ID area proprietà e frequenza di campionamento in Hz (per una proprietà continua). maxSharedMemoryFileCount non viene utilizzato.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Annulla la sottoscrizione degli eventi di proprietà precedentemente sottoscritti per le proprietà specificate.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Non utilizzato e può essere implementato come no-op.

I callback sono definiti in IVehicleCallback.aidl e contiene questi metodi.

Metodo
oneway void onGetValues(in GetValueResults responses)
Callback per la funzione getValues ​​per fornire risultati di recupero valore. Chiamato quando alcuni valori da recuperare sono pronti.
oneway void onSetValues(in SetValueResults responses)
Callback per la funzione setValues ​​per fornire risultati con valori impostati. Chiamato quando VHAL ha terminato di gestire alcune richieste di set di proprietà.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Richiamata per segnalare eventi di aggiornamento della proprietà.
Proprietà CONTINUOUS , un evento di proprietà si verifica in base alla frequenza di campionamento dell'abbonamento in Hz o alla frequenza del messaggio del bus del veicolo. Un evento relativo alla proprietà potrebbe verificarsi anche se lo stato di una proprietà cambia. Ad esempio, da non disponibile a disponibile.
Per la proprietà ON_CHANGE , un evento di proprietà si verifica quando il valore di una proprietà o lo stato di una proprietà cambia.
SharedMemoryFileCount è sempre 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback per segnalare errori di set di proprietà asincroni che non hanno una richiesta di set corrispondente. Se sappiamo a quale richiesta di set si riferisce l'errore, è necessario utilizzare onSetValues ​​con un risultato di errore al posto di this.

Per ulteriori informazioni, vedere IVehicle.aidl e IVehicleCallback.aidl .

L'implementazione VHAL è convalidata da VHAL VTS su VtsHalAutomotiveVehicle_TargetTest.cpp . Il test verifica che i metodi di base siano implementati correttamente e che le configurazioni delle proprietà supportate siano corrette.

Valore di proprietà del veicolo

Utilizza la struttura VehiclePropValue per descrivere il valore di ciascuna proprietà, che ha questi campi:

Campo Descrizione
timestamp Il timestamp che rappresenta l'ora in cui si è verificato l'evento e viene sincronizzato con l'orologio SystemClock.elapsedRealtimeNano() .
prop L'ID della proprietà per questo valore.
areaid L'ID dell'area per questo valore. L'area deve essere una delle aree supportate elencate nella configurazione dell'ID area oppure 0 per le proprietà globali.
value Una struttura dati contenente il valore effettivo della proprietà. In base al tipo di proprietà, uno o più campi all'interno di questo campo vengono utilizzati per memorizzare il valore effettivo. Ad esempio, il primo elemento in value.int32Values ​​viene utilizzato per le proprietà di tipo Int32. Per i dettagli, vedere Configurazioni delle proprietà .

getValues ​​e setValues ​​asincroni

Le operazioni getValues ​​e setValues ​​vengono eseguite in modo asincrono, il che significa che la funzione potrebbe restituire prima che l'operazione get o set effettiva venga completata. I risultati dell'operazione (ad esempio, il valore della proprietà per getValues ​​e lo stato di successo o errore per setValues ​​) vengono forniti tramite i callback passati come argomenti.

L'implementazione non deve bloccare il risultato nel thread del raccoglitore che gestisce la richiesta. Ti consigliamo invece di archiviare la richiesta in una coda di richieste e di utilizzare un thread del gestore separato per gestire le richieste in modo asincrono. Per i dettagli, vedere l' implementazione di riferimento .

Figura 1. Processo asincrono.

Grandi pacchi

Tutte le strutture denominate XXXs , come VehiclePropConfigs , SetValueRequests e VehiclePropValues ​​sono chiamate LargeParcelable (o StableLargeParcelable ). Ciascuno rappresenta un elenco di valori utilizzati per trasferire dati di grandi dimensioni che potrebbero superare i limiti del raccoglitore (4 KB nell'implementazione della libreria LargeParcelable ) oltre i limiti del raccoglitore. Ciascuno ha una definizione di struttura simile che contiene i seguenti campi.

Guida Descrizione
payloads Elenco di valori quando la dimensione del valore rientra in un limite di memoria del raccoglitore o in un elenco vuoto.
sharedMemoryFd Descrittore di file nullable che punta a un file di memoria condivisa che archivia i payload serializzati se l'elenco di valori è troppo grande.

Ad esempio, VehiclePropConfigs è definito come:

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 contiene payload non vuoti o sharedMemoryFd non nullo.

  • Se payloads non è vuoto, memorizza un elenco dei dati effettivi, che è la proprietà config.
  • Se sharedMemoryFd non è null, contiene un file di memoria condivisa, che memorizza la struttura serializzata di VehiclePropConfigs . La struttura utilizza la funzione writeToParcel per serializzare un Parcel.

In quanto client Java per VHAL, Car Service gestisce la serializzazione e la deserializzazione per LargeParcelable . Per le implementazioni VHAL e i client nativi, un LargeParcelable deve essere serializzato e deserializzato con la libreria LargeParcelable o un'utile classe wrapper per la libreria in ParcelableUtils.h .

Ad esempio, un client nativo che analizza le richieste per getValues ​​ricevute da un raccoglitore è il seguente:

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

Di seguito è mostrata un'implementazione VHAL di esempio che invia risultati per getValues ​​tramite il raccoglitore:

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