L'interfaccia Vehicle Hardware Abstraction Layer (VHAL) definisce le proprietà che gli OEM possono implementare e contiene metadati della proprietà (ad esempio, se la proprietà è un valore intero e quali modalità di modifica sono consentite). L'interfaccia VHAL si basa sull'accesso (lettura, scrittura, sottoscrizione) a una proprietà, che è un'astrazione per una funzione specifica.
Interfacce HAL
VHAL utilizza le seguenti interfacce:
getAllPropConfigs()
genera(vec<VehiclePropConfig>propConfigs)
Elenca la configurazione di tutte le proprietà supportate dal VHAL. CarService utilizza solo proprietà supportate.getPropConfigs(vec<int32_t> props)
genera(StatusCode status,vec<VehiclePropConfig> propConfigs);
Restituisce la configurazione delle proprietà selezionate.set(VehiclePropValue propValue)
genera(StatusCodestatus);
Scrive un valore nella proprietà. Il risultato della scrittura è definito per proprietà.subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
genera(StatusCode status);
Inizia a monitorare una modifica del valore di una proprietà. Per la proprietà con zone,unsubscribe(IVehicleCallback callback, int32_t propId)
genera(StatusCode status);
Il VHAL utilizza le seguenti interfacce di callback:
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Invia una notifica relativa alla modifica del valore della proprietà del veicolo. Deve essere eseguita solo per le proprietà sottoscritte.oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Restituisce l'errore a livello di VHAL globale o l'errore per proprietà. L'errore globale causa il riavvio dell'HAL, che può comportare il riavvio di altri componenti (incluse le applicazioni).
Proprietà del veicolo
Le proprietà possono essere di sola lettura, di sola scrittura (utilizzate per trasmettere informazioni a livello VHAL) o di lettura e scrittura (il supporto della maggior parte delle proprietà è facoltativo). Ogni proprietà è identificata in modo univoco da una chiave int32 e ha un tipo predefinito (value_type
):
BYTES
BOOLEAN
EPOCH_TIME
FLOAT
FLOAT[]
INT32
INT32[]
INT64
INT64[]
STRING
MIXED
Una proprietà con zone può avere più di un valore in base al numero di zone supportate dalla proprietà.
Tipi di area
VHAL definisce più tipi di area:
Tipo di area | Descrizione |
---|---|
GLOBAL |
Questa proprietà è un singleton e non ha più aree. |
WINDOW |
L'area basata su finestre utilizza l'enumerazione VehicleAreaWindow . |
MIRROR |
L'area basata su specchi utilizza l'enumerazione VehicleAreaMirror . |
SEAT |
L'area basata sui posti utilizza l'enum VehicleAreaSeat . |
DOOR |
Area in base alle porte, utilizza l'enum VehicleAreaDoor . |
WHEEL |
L'area basata sulle ruote utilizza l'enum VehicleAreaWheel . |
Ogni proprietà a zone deve utilizzare un tipo di area predefinito. Ogni tipo di area ha un insieme di bit flag definiti in un enum per il tipo di area. Ad esempio, l'area SEAT
definisce gli enum VehicleAreaSeat
:
ROW_1_LEFT = 0x0001
ROW_1_CENTER = 0x0002
ROW_1_RIGHT = 0x0004
ROW_2_LEFT = 0x0010
ROW_2_CENTER = 0x0020
ROW_2_RIGHT = 0x0040
ROW_3_LEFT = 0x0100
- …
ID area
Le proprietà con zone sono indirizzate tramite ID area. Ogni proprietà con zone può supportare uno o più ID area. Un ID area è composto da uno o più flag della rispettiva enumerazione. Ad esempio, una proprietà che utilizza VehicleAreaSeat
potrebbe utilizzare i seguenti ID area:
Articolo | Descrizione |
---|---|
ROW_1_LEFT | ROW_1_RIGHT |
L'ID area vale per entrambi i posti anteriori. |
ROW_2_LEFT |
Si applica solo al sedile posteriore sinistro. |
ROW_2_RIGHT |
Si applica solo al sedile posteriore destro. |
Stato proprietà
Ogni valore della proprietà è associato a un valore VehiclePropertyStatus
.
Indica lo stato attuale della proprietà:
Articolo | Descrizione |
---|---|
AVAILABLE |
La proprietà è disponibile e il valore è valido. |
UNAVAILABLE |
Il valore della proprietà non è al momento disponibile. Utilizzato per le funzionalità disattivate temporaneamente per una proprietà supportata. |
ERROR |
C'è un problema con questa proprietà. |
Configurazione di una proprietà
Utilizza VehiclePropConfig
per fornire informazioni di configurazione per ogni proprietà. Queste informazioni includono:
Variabile | Descrizione |
---|---|
access |
r , w e rw |
changeMode |
Rappresenta il modo in cui una proprietà viene monitorata, in base al cambiamento e non continuo. |
areaConfigs |
areaId , min e max . |
configArray |
Parametri di configurazione aggiuntivi. |
configString |
Informazioni aggiuntive passate come stringa. |
minSampleRate |
maxSampleRate |
prop |
ID proprietà, int |
Gestione delle proprietà delle zone
Una proprietà suddivisa in zone è equivalente a una raccolta di più proprietà a cui è possibile accedere con il valore ID area specificato.
- La chiamata
get
per la proprietà con zone include sempre l'ID area nella richiesta. Di conseguenza, viene restituito solo il valore corrente per l'ID area richiesto. Se la proprietà è globale, l'ID area è 0. - La chiamata
set
per la proprietà con zone include sempre l'ID area nella richiesta. Pertanto, viene modificato solo l'ID area richiesto. - La chiamata
subscribe
genera eventi per tutti gli ID area della proprietà.
Ricevere chiamate
Durante l'inizializzazione, il valore della proprietà potrebbe non essere ancora disponibile perché
il messaggio della rete del veicolo corrispondente non è stato ancora ricevuto. In questi casi,
la chiamata get
dovrebbe restituire -EAGAIN
. Alcune proprietà (ad esempio l'impianto di climatizzazione) hanno una proprietà di alimentazione on/off separata. La chiamata a get
per una proprietà di questo tipo (quando è spenta) dovrebbe restituire uno stato UNAVAILABLE
anziché un errore. Ad esempio, ottieni la temperatura dell'impianto di climatizzazione
Figura 1. Ottieni temperatura dell'impianto di climatizzazione (CS = CarService, VHAL = HAL veicolo)
Impostare le chiamate
In un'operazione tipica, una chiamata set
comporta l'invio di una richiesta di modifica alla rete del veicolo. Idealmente, una chiamata set
è un'operazione asincrona che restituisce il risultato il più rapidamente possibile, ma può anche essere sincrona. Alcune chiamate set
potrebbero richiedere dati iniziali per
essere pronte, ma durante l'inizializzazione, questi dati potrebbero non essere ancora disponibili. In questi casi, la chiamataset
dovrebbe restituire StatusCode#TRY_AGAIN
. Alcune proprietà con accensione e spegnimento separati dovrebbero restituire StatusCode#NOT_AVAILABLE
o StatusCode#NOT_AVAILABLE_DISABLED
quando la proprietà è spenta e non è possibile eseguire set
. Finché set
non viene applicato, get
non necessariamente
restituisce lo stesso valore impostato. Ad esempio, set HVAC Temperature
.
Figura 2. Imposta la temperatura dell'impianto di climatizzazione (CS = CarService, VHAL = Vehicle HAL)
Gestione delle proprietà personalizzate
Per supportare le esigenze specifiche dei partner, VHAL consente proprietà personalizzate limitate alle app di sistema. Segui queste linee guida quando lavori con le proprietà personalizzate:
- L'ID proprietà deve essere generato utilizzando i seguenti campi:
VehiclePropertyGroup:VENDOR
Il gruppoVENDOR
viene utilizzato solo per le proprietà personalizzate.VehicleArea
Seleziona un tipo di area appropriato.VehiclePropertyType
Seleziona il tipo di dati corretto. Il tipoBYTES
consente il passaggio di dati non elaborati, che è sufficiente nella maggior parte dei casi. L'invio frequente di big data tramite proprietà personalizzate può rallentare l'accesso alla rete dell'intero veicolo. Fai attenzione quando aggiungi un payload di grandi dimensioni.Property ID
Scegli un ID di quattro nibble per la proprietà personalizzata.
- Per evitare la frammentazione dell'ecosistema, le proprietà personalizzate non devono essere utilizzate per replicare le proprietà dei veicoli già esistenti nell'SDK (VehiclePropertyIds).
- Compila
VehiclePropConfig.configString
con una breve descrizione della proprietà personalizzata. In questo modo, gli strumenti di controllo di congruità possono segnalare la replica accidentale delle proprietà dei veicoli esistenti. Ad esempio, "stato delle frecce di emergenza". - Accedi tramite
CarPropertyManager
(per i componenti Java) o tramite l'API Vehicle Network Service (per il formato nativo). Non modificare altre API dell'auto poiché ciò potrebbe portare a problemi di compatibilità futuri. - Dopo aver implementato le proprietà del fornitore, selezionasolo l'elenco delle autorizzazioni nell'enum
VehicleVendorPermission
per le proprietà del fornitore. Mappare le autorizzazioni del fornitore alle proprietà di sistema comporterà l'interruzione di CTS e VTS.
Gestione delle proprietà di climatizzazione
Puoi utilizzare VHAL per controllare l'impianto di climatizzazione impostando le proprietà relative all'impianto. La maggior parte delle proprietà HVAC è suddivisa in zone, anche se alcune non sono suddivise in zone (globali). Ecco alcune proprietà definite di esempio:
Proprietà | Finalità |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET |
Imposta la temperatura per zona. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON |
Controlla la ricircolazione per zona. |
Per visualizzare un elenco completo delle proprietà di climatizzazione, cerca VEHICLE_PROPERTY_HVAC_*
in
types.hal
. Quando la proprietà impianti di climatizzazione utilizza VehicleAreaSeat
, si applicano regole aggiuntive per la mappatura di una proprietà impianti di climatizzazione con zone agli ID area. Ogni posto disponibile nell'auto deve far parte
di un ID area nell'array di ID area.
Esempio 1. Un'auto ha due sedili anteriori (ROW_1_LEFT, ROW_1_RIGHT
)
e tre sedili posteriori (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). L'auto
ha due unità di controllo della temperatura: lato conducente e lato passeggero.
- Un insieme di mappatura valido di ID area per
HVAC_TEMPERATURE SET
è:ROW_1_LEFT | ROW_2_LEFT
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
- Una mappatura alternativa per la stessa configurazione hardware è:
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
ROW_1_RIGHT | ROW_2_RIGHT
Esempio 2. Un'auto ha tre file di sedili con due sedili nella prima fila
(ROW_1_LEFT, ROW_1_RIGHT
), tre sedili nella seconda
(ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) e tre nella terza fila
(ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). L'auto ha tre unità di controllo della temperatura: lato conducente, lato passeggero e posteriore. Un modo ragionevole per mappare HVAC_TEMPERATURE_SET
agli ID area è usare un array di tre elementi:
ROW_1_LEFT
ROW_1_RIGHT
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Gestione delle proprietà del sensore
Le proprietà dei sensori VHAL rappresentano dati reali dei sensori o informazioni sulle norme, ad esempio lo stato di guida. Alcune informazioni dei sensori (ad esempio lo stato di guida e la modalità giorno/notte) sono accessibili a qualsiasi app senza limitazioni, in quanto i dati sono obbligatori per creare un'applicazione per veicoli sicura. Altre informazioni del sensore (ad esempio la velocità del veicolo) sono più sensibili e richiedono autorizzazioni specifiche che gli utenti possono gestire.
Scopri le proprietà dei sensori supportate (in types.hal
).
servizio di mappe per il veicolo
Il servizio di mappe del veicolo (VMS) fornisce un meccanismo per scambiare dati delle mappe tra i clienti tramite un'interfaccia Pub/Sub al fine di supportare funzionalità comuni del veicolo, come gli sistemi avanzati di assistenza alla guida (ADAS). I clienti possono includere sistemi di veicoli che si interfacciano tramite la proprietà VMS nella VHAL o applicazioni per Android privilegiate. I dati condivisi sulle VM sono destinati a essere limitati alla mappatura dei dati affinché possano essere utilizzati dai sistemi dei veicoli e dalle app di supporto.
VMS è destinato all'uso solo nelle implementazioni di Android Automotive; AOSP
non contiene client predefiniti che pubblicano o sottoscrivono VM. Per la proprietà VMS
in VHAL, i tipi di messaggi e le strutture di dati sono descritti in VHAL 2.0 nell'enum
VmsMessageType
, che elenca i tipi di messaggi VMS supportati. Questo
enum viene utilizzato come primo numero intero nell'array di numeri interi delle proprietà del veicolo e determina
come viene decodificato il resto del messaggio.