VHAL(Vehicle Hardware Abstraction Layer) 인터페이스는 OEM이 구현할 수 있는 속성을 정의하며 속성 메타데이터(예: 속성이 int인지, 어떤 변경 모드가 허용되는지)를 포함합니다. VHAL 인터페이스는 특정 함수의 추상화인 속성 액세스(읽기, 쓰기, 구독)를 기반으로 합니다.
HAL 인터페이스
VHAL은 다음 인터페이스를 사용합니다.
vehicle_prop_config_t const *(*list_properties)(..., int* num_properties)
VHAL에서 지원하는 모든 속성의 구성을 나열합니다. 지원되는 속성만 차량 네트워크 서비스에서 사용됩니다.(*get)(..., vehicle_prop_value_t *data)
속성의 현재 값을 읽습니다. 구역 분할 속성의 경우 각 구역은 다른 값을 가질 수 있습니다.(*set)(..., const vehicle_prop_value_t *data)
속성에 값을 작성합니다. 쓰기 결과는 속성별로 정의됩니다.(*subscribe)(..., int32_t prop, float sample_rate, int32_t zones)
- 속성 값 변경 모니터링을 시작합니다. 구역 분할 속성의 경우 구독은 요청된 구역에 적용됩니다. 구역 = 0은 지원되는 모든 구역을 요청하는 데 사용됩니다.
- VHAL은 속성의 값이 변경될 때(=변경 시) 또는 일정한 간격으로(=연속 유형) 변경될 때 별도의 콜백을 호출해야 합니다.
(*release_memory_from_get)(struct vehicle_hw_device* device, vehicle_prop_value_t *data)
get 호출에서 할당된 메모리를 해제합니다.
VHAL은 다음 콜백 인터페이스를 사용합니다.
(*vehicle_event_callback_fn)(const vehicle_prop_value_t *event_data)
차량 속성의 값 변경을 알립니다. 구독한 속성에 대해서만 수행되어야 합니다.(*vehicle_error_callback_fn)(int32_t error_code, int32_t property, int32_t operation)
전역 VHAL 수준 오류 또는 속성당 오류를 반환합니다. 전역 오류로 인해 HAL이 다시 시작되어 애플리케이션을 포함한 다른 구성요소를 다시 시작할 수 있습니다.
차량 속성
속성은 읽기 전용, 쓰기 전용(VHAL 수준으로 정보를 전달하는 데 사용됨) 또는 읽기 및 쓰기(대부분의 속성 지원은 선택 사항임)일 수 있습니다. 각 속성은 int32 키로 고유하게 식별되며 사전 정의된 유형(value_type
)을 포함합니다.
BYTES
BOOLEAN
FLOAT
FLOAT[]
INT32
INT32[]
INT64
INT64[]
STRING
구역 분할 속성은 속성에서 지원하는 구역 수에 따라 둘 이상의 값을 가질 수 있습니다.
영역 유형
VHAL은 다음과 같은 여러 영역 유형을 정의합니다.
GLOBAL
이 속성은 싱글톤이며 여러 영역이 없습니다.WINDOW
창을 기준으로 한 영역으로,VehicleAreaWindow
enum을 사용합니다.MIRROR
미러를 기준으로 한 영역으로,VehicleAreaMirror
enum을 사용합니다.SEAT
좌석을 기준으로 한 영역으로,VehicleAreaSeat
enum을 사용합니다.DOOR
도어를 기준으로 한 영역으로,VehicleAreaDoor
enum을 사용합니다.WHEEL
바퀴를 기준으로 한 영역으로,VehicleAreaWheel
enum을 사용합니다.
각 구역 분할 속성은 사전 정의된 영역 유형을 사용해야 합니다. 각 영역 유형에는 영역 유형의 enum에 정의된 일련의 비트 플래그가 있습니다. 예를 들어 SEAT 영역은 VehicleAreaSeat enum을 정의합니다.
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는 개별 enum의 플래그 하나 이상으로 구성됩니다. 예를 들어 VehicleAreaSeat
를 사용하는 속성은 다음 영역 ID를 사용할 수 있습니다.
ROW_1_LEFT | ROW_1_RIGHT
영역 ID가 앞좌석 모두에 적용됩니다.ROW_2_LEFT
왼쪽 뒷좌석에만 적용됩니다.ROW_2_RIGHT
오른쪽 뒷좌석에만 적용됩니다.
속성 상태
모든 속성 값은 VehiclePropertyStatus
값과 함께 제공되고,
이 값은 속성의 현재 상태를 나타냅니다.
AVAILABLE
속성이 사용 가능하며 그 값이 유효합니다.UNAVAILABLE
현재 속성 값을 사용할 수 없습니다. 지원되는 속성에 대해 일시적으로 사용 중지된 기능에 사용됩니다.ERROR
이 속성에 문제가 있습니다.
속성 구성
vehicle_prop_config_t
를 사용하여 각 속성에 대한 구성 정보를 제공합니다. 정보에는 다음이 포함됩니다.
access
(r, w, rw)changeMode
속성이 모니터링되는 방식을 나타냅니다(변경 시 및 연속).areaConfigs
(영역 ID, 최소값 및 최대값)configArray
(추가 구성 매개변수)configString
(추가 정보가 문자열로 전달됨)minSampleRate
,max_sample_rate
prop
(속성 ID, int)
구역 분할 속성 처리
구역 분할 속성은 지정된 영역 ID 값으로 각 하위 속성에 액세스할 수 있는 여러 속성의 컬렉션과 동일합니다.
- 구역 분할 속성에 대한
get
호출은 항상 요청에 영역 ID를 포함하므로 요청된 영역 ID의 현재 값만 반환됩니다. 속성이 전역인 경우 영역 ID는 0입니다. - 구역 분할 속성에 대한
set
호출은 항상 요청에 영역 ID를 포함하므로 요청된 영역 ID만 변경됩니다. subscribe
호출은 구역 분할 속성에 대한 모든 영역 ID에 대해 이벤트를 생성합니다.
Get 호출
일치하는 차량 네트워크 메시지가 아직 수신되지 않았으므로 초기화하는 동안에는 속성 값을 사용하지 못할 수 있습니다. 이러한 경우 get
호출은 -EAGAIN
을 반환해야 합니다. 일부 속성(예: HVAC)에는 별도의 전원 켜짐/꺼짐 속성이 있습니다. (전원이 꺼진 경우) 이러한 속성에 대해 get
을 호출하면 오류를 반환하는 대신 UNAVAILABLE
상태를 반환해야 합니다.
예: HVAC 온도 가져오기
Set 호출
set
호출은 요청된 변경이 수행된 후 이벤트 알림과 관련된 비동기 작업입니다. 일반적인 작업에서 set
호출은 차량 네트워크 전체에서 변경 요청으로 이어집니다.
이 속성을 가진 ECU(전자 제어 장치)가 변경을 수행한 경우 차량 네트워크를 통해 업데이트된 값이 반환되고 차량 HAL은 VNS(차량 네트워크 서비스)에 업데이트된 값을 이벤트로 보냅니다.
일부 set
호출은 초기 데이터를 준비해야 할 수 있지만 초기화 중에는 이러한 데이터를 아직 사용하지 못할 수 있습니다. 이러한 경우 set
호출은 -EAGAIN
을 반환해야 합니다. 별도의 전원 켜짐/꺼짐 기능이 있는 일부 속성의 경우 해당 속성이 꺼져 있고 설정을 수행할 수 없는 경우 -ESHUTDOWN
을 반환해야 합니다.
set
이 유효하게 될 때까지 get
은 설정된 값과 반드시 같은 값을 반환하지 않습니다.
예: HVAC 온도 설정
맞춤 속성 처리
파트너별 요구사항을 지원하기 위해 VHAL은 시스템 앱으로 제한되는 맞춤 속성을 허용합니다. 맞춤 속성을 사용할 때 다음 가이드라인을 따르세요.
- 속성 ID는 다음 필드를 사용하여 생성해야 합니다.
VehiclePropertyGroup:VENDOR
VENDOR
그룹은 사용자 정의 특성에만 사용됩니다.VehicleArea
적절한 영역 유형을 선택합니다.VehiclePropertyType
적절한 데이터 유형을 선택합니다. BYTES 유형은 원시 데이터를 전달을 허용하므로 대부분의 경우 이 정도면 충분합니다. 맞춤 속성을 통해 빅데이터를 자주 전송하면 전체 차량 네트워크 액세스 속도가 느려질 수 있으므로 대용량 페이로드를 추가할 때는 주의해야 합니다.- 속성 ID
맞춤 속성에 4자리 니블 ID를 선택합니다.
CarPropertyManager
(Java 구성 요소의 경우) 또는 차량 네트워크 서비스 API(네이티브의 경우)를 통해 액세스합니다. 다른 자동차 API는 향후 호환성 문제를 일으킬 수 있으므로 수정하지 마세요.
HVAC 속성 처리
VHAL을 사용하여 HVAC 관련 속성을 설정해 HVAC를 제어할 수 있습니다. 대부분의 HVAC 속성은 구역이 분할되지 않은 (전역) 속성입니다. 정의된 속성의 예는 다음과 같습니다.
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET
구역당 온도를 설정합니다.VEHICLE_PROPERTY_HVAC_RECIRC_ON
구역별 재순환을 제어합니다.
HVAC 속성의 전체 목록을 보려면 types.hal
에서 VEHICLE_PROPERTY_HVAC_*
를 검색하세요.
HVAC 속성이 VehicleAreaSeat
를 사용하는 경우 영역 ID에 구역 분할 HVAC 속성을 매핑하기 위한 추가 규칙이 있습니다. 차량에 있는 모든 좌석은 영역 ID 배열에 있는 영역 ID의 일부여야 합니다.
예 1: 자동차에는 앞좌석(ROW_1_LEFT, ROW_1_RIGHT)
및 뒷좌석 3개(ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT)
가 있습니다.
운전자 측과 조수석 측 온도 조절 장치 2개가 있습니다.
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
예 2: 차량에 좌석 3줄이 있는데, 첫 번째 줄에는 좌석 2개(ROW_1_LEFT, ROW_1_RIGHT)
, 두 번째 줄에는 좌석 3개(ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT)
, 세 번째 줄에는 좌석 3개(ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT)
가 있습니다. 이 차양에는 운전석 측, .조수석 측 그리고 뒷자석 측, 이렇게 온동 조절 장치 3개가 있습니다. 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 센서 속성은 운전 상태와 같은 실제 센서 데이터 또는 정책 정보를 나타냅니다. 운전 상태 및 주/야간 모드와 같은 일부 센서 정보는 안전 차량 애플리케이션을 구축하기 위한 필수 데이터이므로 모든 앱에서 제한 없이 액세스할 수 있습니다. 차량 속도와 같은 다른 센서 정보는 더 민감하며 사용자가 관리할 수 있는 구체적인 권한이 필요합니다.
지원되는 센서 속성은 다음과 같습니다.
NIGHT_MODE
지원해야 합니다. 디스플레이의 주/야간 모드를 결정합니다.GEAR_SELECTION/CURRENT_GEAR
운전자가 선택한 기어와 실제 기어를 비교합니다.VEHICLE_SPEED
차량 속도. 권한으로 보호됩니다.ODOMETER
현재 주행 거리계 판독값. 권한으로 보호됩니다.FUEL_LEVEL
현재 남아 있는 연료량(%)FUEL_LEVEL_LOW
연료량이 부족하거나 없음(부울 값)
차량 지도 서비스
VMS(차량 지도 서비스)는 pub/sub 인터페이스를 통해 클라이언트간에 맵 데이터를 교환하여 ADAS(첨단 운전자 보조 시스템)와 같은 차량 기능을 지원하는 메커니즘을 제공합니다. 클라이언트에는 VHAL 또는 권한이 부여된 Android 애플리케이션의 VMS 속성을 통해 접속하는 차량 시스템이 포함될 수 있습니다. VMS에서 공유되는 데이터는 차량 시스템 및 지원 앱에서 사용할 지도 데이터로 제한됩니다.
VMS는 Android Automotive 구현에만 사용됩니다. AOSP에는 VMS에 게시하거나 VMS를 구독하는 기본 클라이언트가 포함되어 있지 않습니다.
VHAL의 VMS 속성, 메시지 유형 및 데이터 구조에 대한 설명은 VHAL 2.0에서 지원되는 VMS 메시지 유형을 나열하는 VmsMessageType에 나와 있습니다. 이 enum은 차량 속성 정수 배열의 첫 번째 정수로 사용되며 나머지 메시지가 디코딩되는 방식을 결정합니다.