車輛硬件抽象層 (VHAL)接口定義了 OEM 可以實現的屬性並包含屬性元數據(例如,屬性是否為 int 以及允許哪些更改模式)。 VHAL 接口基於訪問(讀取、寫入、訂閱)屬性,該屬性是特定功能的抽象。
HAL 接口
VHAL 使用以下接口:
-
getAllPropConfigs()
生成(vec<VehiclePropConfig>propConfigs)
列出 VHAL 支持的所有屬性的配置。 CarService 僅使用受支持的屬性。 -
getPropConfigs(vec<int32_t> props)
生成(StatusCode status,vec<VehiclePropConfig> propConfigs);
返回所選屬性的配置。 -
set(VehiclePropValue propValue)
生成(StatusCodestatus);
將值寫入屬性。寫入的結果是按屬性定義的。 -
subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
生成(StatusCode status);
開始監視屬性值更改。對於分區屬性,unsubscribe(IVehicleCallback callback, int32_t propId)
生成(StatusCode status);
VHAL 使用以下回調接口:
-
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
通知車輛屬性的值變化。應該只對訂閱的屬性進行。 -
oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
返回全局 VHAL 級別錯誤或每個屬性的錯誤。全局錯誤會導致 HAL 重新啟動,這可能會導致其他組件(包括應用程序)重新啟動。
車輛屬性
屬性可以是只讀的、只寫的(用於將信息傳遞到 VHAL 級別)或讀寫(對大多數屬性的支持是可選的)。每個屬性都由一個 int32 鍵唯一標識,並具有預定義的類型 ( value_type
):
-
BYTES
-
BOOLEAN
-
EPOCH_TIME
-
FLOAT
-
FLOAT[]
-
INT32
-
INT32[]
-
INT64
-
INT64[]
-
STRING
-
MIXED
分區屬性可能有多個值,具體取決於屬性支持的區域數量。
區域類型
VHAL 定義了多種區域類型:
區域類型 | 描述 |
---|---|
GLOBAL | 該屬性是單例的,沒有多個區域。 |
WINDOW | 基於窗口的區域,使用VehicleAreaWindow 枚舉。 |
MIRROR | 基於鏡像的區域,使用VehicleAreaMirror 枚舉。 |
SEAT | 基於座位的區域,使用VehicleAreaSeat 枚舉。 |
DOOR | 基於門的區域,使用VehicleAreaDoor 枚舉。 |
WHEEL | 基於車輪的區域,使用VehicleAreaWheel 枚舉。 |
每個分區屬性必須使用預定義的區域類型。每個區域類型都有一組在區域類型的枚舉中定義的位標誌。例如, SEAT
區域定義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
分區屬性通過區域 ID 尋址。每個分區屬性可能支持一個或多個區域 ID。區域 ID 由來自其各自枚舉的一個或多個標誌組成。例如,使用VehicleAreaSeat
的屬性可能使用以下區域 ID:
物品 | 描述 |
---|---|
ROW_1_LEFT | ROW_1_RIGHT | 區域 ID 適用於兩個前排座椅。 |
ROW_2_LEFT | 僅適用於左後座椅。 |
ROW_2_RIGHT | 僅適用於右後座。 |
物業狀況
每個屬性值都帶有一個VehiclePropertyStatus
值。這表示屬性的當前狀態:
物品 | 描述 |
---|---|
AVAILABLE | 屬性可用且值有效。 |
UNAVAILABLE | 屬性值當前不可用。用於受支持屬性的暫時禁用功能。 |
ERROR | 此屬性有問題。 |
配置屬性
使用VehiclePropConfig
為每個屬性提供配置信息。信息包括:
多變的 | 描述 |
---|---|
access | r , w , rw |
changeMode | 表示如何監控屬性,無論是變化還是連續。 |
areaConfigs | areaId 、 min 和max 值。 |
configArray | 附加配置參數。 |
configString | 作為字符串傳遞的附加信息。 |
minSampleRate | maxSampleRate |
prop | 屬性 ID,整數 |
處理區域屬性
分區屬性相當於多個屬性的集合,其中每個子屬性都可以使用指定的區域 ID 值訪問。
-
get
分區屬性的調用始終在請求中包含區域 ID。因此,僅返回請求的區域 ID 的當前值。如果屬性是全局屬性,則區域 ID 為 0。 - 對分區屬性的
set
調用始終在請求中包含區域 ID。因此,僅更改請求的區域 ID。 -
subscribe
調用為屬性的所有區域 ID 生成事件。
接聽電話
在初始化期間,該屬性的值可能尚不可用,因為尚未接收到匹配的車輛網絡消息。在這種情況下, get
調用應該返回-EAGAIN
。某些屬性(例如 HVAC)具有單獨的開/關電源屬性。為此類屬性調用get
(關閉電源時)應返回UNAVAILABLE
狀態,而不是返回錯誤。例如,獲取 HVAC 溫度
圖 1 。獲取 HVAC 溫度(CS = CarService,VHAL = Vehicle HAL)
設置通話
set
調用是一種異步操作,涉及在進行請求更改後的事件通知。在典型的操作中, set
調用會導致跨車輛網絡發出更改請求。一些set
調用可能需要準備好初始數據,但在初始化期間,這些數據可能還不可用。在這種情況下, set
調用應該返回-EAGAIN
。某些具有單獨電源開/關的屬性應在屬性關閉且無法完成設置時返回-ESHUTDOWN
。在set
生效之前, get
不一定返回與 set 相同的值。例如, set HVAC Temperature
。
圖 2 。設置 HVAC 溫度(CS = CarService,VHAL = Vehicle HAL)
處理自定義屬性
為了支持特定於合作夥伴的需求,VHAL 允許僅限於系統應用程序的自定義屬性。使用自定義屬性時,請遵循以下準則:
- 應使用以下字段生成屬性 ID:
-
VehiclePropertyGroup:VENDOR
VENDOR
組僅用於自定義屬性。 -
VehicleArea
選擇適當的區域類型。 -
VehiclePropertyType
選擇正確的數據類型。BYTES
類型允許傳遞原始數據,這在大多數情況下就足夠了。通過自定義屬性頻繁發送大數據會減慢整個車輛網絡的訪問速度——添加大負載時要小心。 -
Property ID
為自定義屬性選擇一個四半字節 ID。
-
- 為防止生態系統碎片化,不得使用自定義屬性來複製 ( VehiclePropertyIds SDK) 中已存在的車輛屬性。
- 用自定義屬性的簡短描述填寫
VehiclePropConfig.configString
。這允許完整性檢查工具標記現有車輛屬性的意外複製。例如,“危險燈狀態”。 - 通過
CarPropertyManager
(對於 Java 組件)或通過 Vehicle Network Service API(對於本機)進行訪問。不要修改其他汽車 API,因為這樣做會導致未來的兼容性問題。 - 實施供應商屬性後,僅在
VehicleVendorPermission
枚舉中選擇供應商屬性的權限列表。將供應商權限映射到系統屬性將破壞 CTS 和 VTS。
處理 HVAC 屬性
您可以通過設置 HVAC 相關屬性來使用 VHAL 來控制 HVAC。大多數 HVAC 屬性是分區屬性,儘管有幾個是非分區(全局)屬性。示例定義的屬性包括:
財產 | 目的 |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET | 設置每個區域的溫度。 |
VEHICLE_PROPERTY_HVAC_RECIRC_ON | 控制每個區域的再循環。 |
要查看 HVAC 屬性的完整列表,請在types.hal
中搜索VEHICLE_PROPERTY_HVAC_*
。當 HVAC 屬性使用VehicleAreaSeat
時,用於將分區 HVAC 屬性映射到區域 ID 的附加規則適用。汽車中的每個可用座位都必須是區域 ID 數組中區域 ID 的一部分。
例一。一輛車有兩個前座( ROW_1_LEFT, ROW_1_RIGHT
)和三個後座( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
)。該車有兩個溫度控制單元:駕駛員側和乘客側。
-
HVAC_TEMPERATURE SET
的有效區域 ID 映射集是:-
ROW_1_LEFT | ROW_2_LEFT
-
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
-
- 相同硬件配置的另一種映射是:
-
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
-
ROW_1_RIGHT | ROW_2_RIGHT
-
例二。一輛車有三排座位,前排有兩個座位( ROW_1_LEFT, ROW_1_RIGHT
),第二排有三個座位( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
),第三排有三個座位( ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
)。該車具有三個溫度控制單元:駕駛員側、乘客側和後部。將HVAC_TEMPERATURE_SET
映射到區域 ID 的合理方法是作為三元素數組:
-
ROW_1_LEFT
-
ROW_1_RIGHT
-
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
處理傳感器屬性
VHAL 傳感器屬性代表真實的傳感器數據或策略信息,例如駕駛狀態。任何應用程序都可以不受限制地訪問某些傳感器信息(例如駕駛狀態和日/夜模式),因為這些數據是構建安全車輛應用程序所必需的。其他傳感器信息(如車速)更敏感,需要用戶可以管理的特定權限。
請參閱支持的傳感器屬性(在types.hal
中)。
車輛地圖服務
車輛地圖服務 (VMS) 提供了一種通過發布/訂閱接口在客戶端之間交換地圖數據的機制,以支持常見的車輛功能,例如高級駕駛員輔助系統 (ADAS) 。客戶端可以包括通過 VHAL 或特權 Android 應用程序中的 VMS 屬性連接的車輛系統。在 VMS 上共享的數據旨在僅限於供車輛系統和支持應用程序使用的地圖數據。
VMS 僅適用於 Android Automotive 實現; AOSP 不包含發布或訂閱 VMS 的默認客戶端。對於 VHAL 中的 VMS 屬性,消息類型和數據結構在 VHAL 2.0 中的VmsMessageType
枚舉中進行了描述,其中列出了支持的 VMS 消息的類型。此枚舉用作車輛屬性整數數組中的第一個整數,並確定如何解碼消息的其餘部分。