車輛屬性

車輛硬件抽象層 (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 areaIdminmax值。
configArray附加配置參數。
configString作為字符串傳遞的附加信息。
minSampleRate maxSampleRate
prop屬性 ID,整數

處理區域屬性

分區屬性相當於多個屬性的集合,其中每個子屬性都可以使用指定的區域 ID 值訪問。

  • get分區屬性的調用始終在請求中包含區域 ID。因此,僅返回請求的區域 ID 的當前值。如果屬性是全局屬性,則區域 ID 為 0。
  • 對分區屬性的set調用始終在請求中包含區域 ID。因此,僅更改請求的區域 ID。
  • subscribe調用為屬性的所有區域 ID 生成事件。

接聽電話

在初始化期間,該屬性的值可能尚不可用,因為尚未接收到匹配的車輛網絡消息。在這種情況下, get調用應該返回-EAGAIN 。某些屬性(例如 HVAC)具有單獨的開/關電源屬性。為此類屬性調用get (關閉電源時)應返回UNAVAILABLE狀態,而不是返回錯誤。例如,獲取 HVAC 溫度

VHAL 獲取 HVAC 示例

圖 1 。獲取 HVAC 溫度(CS = CarService,VHAL = Vehicle HAL)

設置通話

set調用是一種異步操作,涉及在進行請求更改後的事件通知。在典型的操作中, set調用會導致跨車輛網絡發出更改請求。一些set調用可能需要準備好初始數據,但在初始化期間,這些數據可能還不可用。在這種情況下, set調用應該返回-EAGAIN 。某些具有單獨電源開/關的屬性應在屬性關閉且無法完成設置時返回-ESHUTDOWN 。在set生效之前, get不一定返回與 set 相同的值。例如, set HVAC Temperature

VHAL 設置 HVAC 示例

圖 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 消息的類型。此枚舉用作車輛屬性整數數組中的第一個整數,並確定如何解碼消息的其餘部分。