Interfaccia VHAL

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

Metodo
VehiclePropConfigs getAllPropConfigs()
Restituisci un elenco di tutti Configurazioni della proprietà supportate da questo veicolo HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Restituisci un elenco di Configurazioni delle proprietà per una data specifica gli ID proprietà.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Ottieni valori delle proprietà dei veicoli in modo asincrono. Gestisce un batch di GetValueRequest in modo asincrono. Il risultato viene fornito tramite Metodo di callback onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Imposta i valori delle proprietà del veicolo in modo asincrono. Gestisce un gruppo di SetValueRequest in modo asincrono. Il risultato viene fornito tramite Metodo di callback onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Sottoscrive gli eventi della proprietà con opzioni specificate. Le opzioni di iscrizione includono ID proprietà, ID area della proprietà e frequenza di campionamento in Hz (per una proprietà continua). maxSharedMemoryFileCount non è in uso.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Annulla l'iscrizione agli eventi delle proprietà a cui è stata effettuata l'iscrizione in precedenza per le proprietà specificate.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Non viene utilizzato e può essere implementato in modalità autonoma.

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

Metodo
oneway void onGetValues(in GetValueResults responses)
Callback per la funzione getValues per ottenere risultati di valore. Hai chiamato quando alcuni dei valori da recuperare sono pronti.
oneway void onSetValues(in SetValueResults responses)
Richiama la funzione setValues per ottenere i risultati del valore impostato. Chiamata quando VHAL ha terminato di gestire alcune richieste di insiemi di proprietà.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Richiamato per i report sugli eventi di aggiornamento della proprietà.
di Gemini Advanced.
CONTINUOUS, un evento della proprietà si verifica in base al tasso di campionamento delle iscrizioni in Hz o la frequenza dei messaggi del bus del veicolo. Un evento proprietà può verificarsi anche se la proprietà modifiche dello stato. ad esempio da "Non disponibile" a "Disponibile".
di Gemini Advanced.
Per la proprietà ON_CHANGE, un evento proprietà si verifica quando il valore di una proprietà o lo stato di una proprietà cambia.
di Gemini Advanced.
SharedMemoryFileCount è sempre 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Richiamato per la segnalazione di errori di insiemi di proprietà asincroni che non hanno un insieme corrispondente richiesta. Se sappiamo a quale insieme appartiene l'errore, onSetValues con un al posto di questo deve essere usato il risultato dell'errore.

Per ulteriori informazioni, vedi IVeicoli.aidl e IVeicoliCallback.aidl.

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

Valore proprietà veicolo

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

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

getValue e setValue asincroni

Le operazioni getValues e setValues vengono eseguite in modo asincrono. il che significa che la funzione potrebbe restituire prima del completamento dell'operazione get o set effettiva. I risultati dell'operazione (ad esempio, valore della proprietà per getValues e operazione riuscita o per setValues) vengono pubblicate tramite i callback passati come argomenti.

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

Figura 1. Processo asincrono.

Lotti di grandi dimensioni

Tutte le strutture denominate XXXs, ad esempio VehiclePropConfigs, SetValueRequests e VehiclePropValues vengono chiamati LargeParcelable (o StableLargeParcelable). Ciascuno rappresenta un elenco utilizzati per passare grandi dati che potrebbero superare i limiti di binder (4 KB nel implementazione della libreria LargeParcelable) oltre i limiti di binder. Ciascuno di loro ha un della struttura che contiene i seguenti campi.

Assistenza Descrizione
payloads Elenco di valori quando la dimensione del valore rientra in un limite di memoria del binder o in un elenco vuoto.
sharedMemoryFd Descrittore di file nullo che punta a un file di memoria condivisa in cui è archiviato il 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 non null sharedMemoryFd.

  • Se payloads non è vuoto, memorizza un elenco dei dati effettivi, ovvero della proprietà.
  • Se sharedMemoryFd non è null, contiene un file di memoria condivisa in cui è archiviato il valore struttura serializzata di VehiclePropConfigs. La struttura utilizza writeToParcel per serializzare un Parcel.

In qualità di client Java per VHAL, Car Service gestisce la serializzazione e la deserializzazione per LargeParcelable. Per le implementazioni VHAL e i client nativi, LargeParcelable deve essere serializzato e deserializzato con LargeParcelable libreria o un'utile classe wrapper per la libreria 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.
}

Un'implementazione VHAL di esempio che invia risultati per getValues tramite il raccoglitore è come mostrato di seguito:

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