VHAL 介面

AIDL VHAL 的定義見 android.hardware.automotive.vehicle namespace。 VHAL 介面定義於 IVehicle.aidl。 除非另有指定,否則必須實作所有方法。

方法
VehiclePropConfigs getAllPropConfigs()
傳回所有清單 支援資源設定 這輛車的 HAL
VehiclePropConfigs getPropConfigs(in int[] props)
傳回 層級指定的資源設定 資源編號
void getValues(IVehicleCallback callback, in GetValueRequests requests)
以非同步方式取得車輛屬性值。處理批次 GetValueRequest 以非同步方式載入。結果會透過 回呼的 onGetValues 方法。
void setValues(IVehicleCallback callback, in SetValueRequests requests)
以非同步方式設定車輛屬性值。處理批次 SetValueRequest。結果會透過 回呼的 onSetValues 方法。
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
以指定選項訂閱屬性事件。訂閱選項包括 物業 ID、物業區域 ID 和取樣率 (以 Hz 為單位) (連續資源)。 maxSharedMemoryFileCount並未使用。
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
為特定資源取消訂閱先前訂閱的資源事件。
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
不使用,且可實作為免人工管理。

回呼的定義是在 IVehicleCallback.aidl敬上 且包含這些方法

方法
oneway void onGetValues(in GetValueResults responses)
用於提供值結果的 getValues 函式回呼。已致電 當部分要擷取的值準備就緒時。
oneway void onSetValues(in SetValueResults responses)
setValues 函式的回呼,用於提供固定值結果。呼叫時機 VHAL 已完成處理部分屬性集要求。
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
回報房源更新事件的回呼。
,瞭解如何調查及移除這項存取權。
CONTINUOUS 屬性,根據訂閱取樣率發生房源事件 。如果資源的 狀態變更。例如從無法使用。
,瞭解如何調查及移除這項存取權。
針對 ON_CHANGE 屬性,當屬性值時,就會發生屬性事件 或是房源狀態變更
,瞭解如何調查及移除這項存取權。
SharedMemoryFileCount 一律為 0
oneway void onPropertySetError(in VehiclePropErrors errors)
報表非同步資源設定錯誤,沒有相應組合的回呼 請求。如果系統知道錯誤是發生在哪個組合要求中,onSetValues 及 必須改用錯誤結果

若需更多資訊,請參閲 IVehicle.aidlIVehicleCallback.aidl

VHAL 實作經過 VHAL VTS 驗證: VtsHalAutomotiveVehicle_TargetTest.cpp。 測試會驗證基本方法是否已正確導入,以及支援的屬性 設定正確。

車輛屬性值

使用 VehiclePropValue敬上 說明每個屬性的值,其中包含以下欄位:

欄位 說明
timestamp 代表事件發生時間並與 SystemClock.elapsedRealtimeNano()的時鐘。
prop 此值的資源 ID。
areaid 此值的區域 ID。區域必須是該區域中列出的任一支援區域 ID 設定,或為全域屬性使用 0
value 包含實際屬性值的資料結構。視資源類型而定 系統就會透過這個欄位中的更多欄位儲存實際值。舉例來說 value.int32Values 中的元素用於 Int32 類型屬性。詳情請參閱 屬性 設定

非同步 getValues 和 setValues

getValuessetValues 作業會以非同步方式執行。 代表該函式可能會在實際的 get 或 set 作業完成前傳回。 作業結果 (例如 getValues 的屬性值,以及成功或 setValues 的錯誤狀態) 會透過做為引數傳遞的回呼傳遞。

導入作業不得封鎖處理要求的繫結器執行緒結果。 建議您將要求儲存在要求佇列中,並使用另一個處理常式執行緒 以非同步方式處理要求詳情請參閱 參考資料導入 詳細資料。

圖 1. 非同步程序。

大型 parcelable

所有名為 XXXs 的結構,例如 VehiclePropConfigs 系統已呼叫 SetValueRequestsVehiclePropValues LargeParcelable (或 StableLargeParcelable)。每個都代表 值傳遞,這類資料可能會超過繫結器限制 (在 LargeParcelable 程式庫實作)。兩者都 結構定義,其中包含下列欄位。

指南 說明
payloads 當值大小符合繫結器記憶體限制時的值清單,或是空白清單。
sharedMemoryFd 可為空值的檔案描述元,指向用於儲存序列化的共用記憶體檔案 如果值清單太大,則會產生酬載。

例如,VehiclePropConfigs 定義為:

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 包含非空白酬載或非空值 sharedMemoryFd

  • 如果 payloads 不是空白,就會儲存實際資料的清單,也就是 屬性設定。
  • 如果 sharedMemoryFd 不是空值,則其中含有共用記憶體檔案,用來儲存 VehiclePropConfigs 的序列化結構。這個結構會使用 writeToParcel 函式,將 Parcel 序列化。

作為 VHAL 的 Java 用戶端,車輛服務會處理以下項目的序列化和去序列化作業 LargeParcelable。對於 VHAL 實作項目和原生用戶端, LargeParcelable 應使用 LargeParcelable 程式庫或是實用的程式庫包裝函式類別 ParcelableUtils.h

例如,從繫結器收到 getValues 的原生用戶端剖析要求 如下:

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

透過繫結器傳送 getValues 結果的範例 VHAL 實作範例如下: 如下所示:

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