차량 하드웨어 추상화 계층(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 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 |
이 속성에 문제가 있습니다. |
속성 구성
VehiclePropConfig
를 사용하여 각 속성의 구성 정보를 제공합니다. 정보에는 다음이 포함됩니다.
변수 | 설명 |
---|---|
access |
r , w , rw |
changeMode |
속성이 모니터링되는 방식을 나타냅니다(변경 시 및 연속). |
areaConfigs |
areaId , min , max 값입니다. |
configArray |
추가 구성 매개변수입니다. |
configString |
문자열로 전달되는 추가 정보입니다. |
minSampleRate |
maxSampleRate |
prop |
속성 ID, int |
구역 분할 속성 처리
구역 분할 속성은 지정된 영역 ID 값으로 각 하위 속성에 액세스할 수 있는 여러 속성의 컬렉션과 동일합니다.
- 구역 분할 속성에 관한
get
호출은 항상 요청에 영역 ID를 포함합니다. 따라서 요청된 영역 ID의 현재 값만 반환됩니다. 속성이 전역 속성이면 영역 ID는 0입니다. - 구역 분할 속성에 관한
set
호출은 항상 요청에 영역 ID를 포함합니다. 따라서 요청된 영역 ID만 변경됩니다. subscribe
호출은 속성의 모든 영역 ID에 관한 이벤트를 생성합니다.
Get 호출
일치하는 차량 네트워크 메시지가 아직 수신되지 않았으므로 초기화하는 동안에는 속성 값을 사용하지 못할 수도 있습니다. 이러한 경우 get
호출은 -EAGAIN
을 반환해야 합니다. 일부 속성(예: HVAC)에는 별도의 전원 켜기/끄기 속성이 있습니다. (전원이 꺼진 경우) 이러한 속성에 관해 get
을 호출하면 오류를 반환하는 대신 UNAVAILABLE
상태를 반환해야 합니다. HVAC 온도 가져오기를 예로 들겠습니다.
그림 1. HVAC 온도 가져오기(CS = CarService, VHAL = 차량 HAL)
Set 호출
일반적인 작업에서 set
호출은 차량 네트워크 전체에서 변경 요청으로 이어집니다. set
호출은 최대한 빨리 반환되는 비동기 작업이지만 동기식일 때도 있습니다. 일부 set
호출을 위해서는 초기 데이터를 준비해야 할 수도 있지만, 초기화 중에는 이러한 데이터를 아직 사용하지 못할 수 있습니다. 이러한 경우 set
호출은 StatusCode#TRY_AGAIN
을 반환해야 합니다. 별도의 전원이 켜져 있거나 꺼져 있는 일부 속성의 경우 해당 속성이 꺼져 있고 set
을 완료할 수 없을 때 StatusCode#NOT_AVAILABLE
또는 StatusCode#NOT_AVAILABLE_DISABLED
를 반환해야 합니다. set
이 유효하게 될 때까지 get
은 설정된 값과 반드시 같은 값을 반환하지는 않습니다. 예: set HVAC Temperature
그림 2. HVAC 온도 설정(CS = CarService, VHAL = 차량 HAL)
맞춤 속성 처리
파트너별 요구사항을 지원하기 위해 VHAL은 시스템 앱으로 제한되는 맞춤 속성을 허용합니다. 맞춤 속성을 사용할 때 다음 가이드라인을 따르세요.
- 속성 ID는 다음 필드를 사용하여 생성해야 합니다.
VehiclePropertyGroup:VENDOR
VENDOR
그룹은 맞춤 속성에만 사용됩니다.VehicleArea
적절한 영역 유형을 선택합니다.VehiclePropertyType
적절한 데이터 유형을 선택합니다.BYTES
유형을 사용하면 대부분의 경우 충분한 원시 데이터를 전달할 수 있습니다. 맞춤 속성을 통해 빅데이터를 자주 전송하면 전체 차량 네트워크 액세스 속도가 떨어질 수 있으므로 대용량 페이로드를 추가할 때는 주의해야 합니다.Property ID
맞춤 속성에 4자리 니블 ID를 선택합니다.
- 생태계 단편화를 방지하려면 VehiclePropertyIds SDK에 이미 있는 차량 속성을 복제할 때 맞춤 속성을 사용해서는 안 됩니다.
VehiclePropConfig.configString
에 맞춤 속성에 관한 간략한 설명을 입력합니다. 그러면 상태 확인 도구에서 기존 차량 속성이 실수로 복제된 사항을 신고할 수 있습니다. 예로 들어 '경고등 상태'가 있습니다.CarPropertyManager
(자바 구성요소의 경우) 또는 차량 네트워크 서비스 API(네이티브의 경우)를 통해 액세스합니다. 다른 자동차 API는 향후 호환성 문제를 일으킬 수 있으므로 수정하지 마세요.- 공급업체 속성을 구현한 후에는 공급업체 속성의
VehicleVendorPermission
enum에 있는 권한 목록만 선택합니다. 공급업체 권한을 시스템 속성에 매핑하면 CTS 및 VTS가 제대로 작동하지 않습니다.
HVAC 속성 처리
VHAL을 사용하여 HVAC 관련 속성을 설정해 HVAC를 제어할 수 있습니다. 대부분의 HVAC 속성은 구역 분할 속성이지만 일부는 구역이 분할되지 않은(전역) 속성입니다. 샘플에서 정의된 속성은 다음과 같습니다.
속성 | 목적 |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET |
구역당 온도를 설정합니다. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON |
구역별 재순환을 제어합니다. |
HVAC 속성의 전체 목록을 보려면 types.hal
에서 VEHICLE_PROPERTY_HVAC_*
를 검색하세요. HVAC 속성이 VehicleAreaSeat
를 사용하는 경우 구역 분할 HVAC 속성을 영역 ID에 매핑하기 위한 추가 규칙이 적용됩니다. 차량에서 사용할 수 있는 각 좌석은 영역 ID 배열에 있는 영역 ID의 일부여야 합니다.
예 1. 차량에 앞좌석 2개(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 센서 속성은 운전 상태와 같은 실제 센서 데이터 또는 정책 정보를 나타냅니다. 운전 상태 및 주/야간 모드와 같은 일부 센서 정보는 안전 차량 애플리케이션을 빌드하기 위한 필수 데이터이므로 모든 앱에서 제한 없이 액세스할 수 있습니다. 차량 속도와 같은 다른 센서 정보는 더 민감하며 사용자가 관리할 수 있는 구체적인 권한이 필요합니다.
types.hal
에서 지원되는 센서 속성을 참고하세요.
차량 지도 서비스
차량 지도 서비스(VMS)는 Pub/Sub 인터페이스를 통해 클라이언트 사이에 맵 데이터를 교환하여 첨단 운전자 지원 시스템(ADAS)과 같은 일반적인 차량 기능을 지원합니다. 클라이언트에는 VHAL 또는 권한이 있는 Android 애플리케이션의 VMS 속성을 통해 접속하는 차량 시스템이 포함될 수 있습니다. VMS에서 공유되는 데이터는 차량 시스템 및 지원 앱에서 사용할 지도 데이터로 제한됩니다.
VMS는 Android Automotive 구현에만 사용됩니다. AOSP에는 VMS에 게시하거나 VMS를 구독하는 기본 클라이언트가 포함되어 있지 않습니다. VHAL의 VMS 속성, 메시지 유형, 데이터 구조에 관한 설명은 VHAL 2.0의 VmsMessageType
enum(지원되는 VMS 메시지 유형을 나열함)에 나와 있습니다. 이 enum은 차량 속성 정수 배열의 첫 번째 정수로 사용되며 나머지 메시지가 디코딩되는 방식을 결정합니다.