차량 속성

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 온도 가져오기

VHAL get HVAC의 예

그림 1. HVAC 온도 가져오기(CS = CarService, VNS = VehicleNetworkService, VHAL = 차량 HAL)

Set 호출

set 호출은 요청된 변경이 수행된 후 이벤트 알림과 관련된 비동기 작업입니다. 일반적인 작업에서 set 호출은 차량 네트워크 전체에서 변경 요청으로 이어집니다. 이 속성을 가진 ECU(전자 제어 장치)가 변경을 수행한 경우 차량 네트워크를 통해 업데이트된 값이 반환되고 차량 HAL은 VNS(차량 네트워크 서비스)에 업데이트된 값을 이벤트로 보냅니다.

일부 set 호출은 초기 데이터를 준비해야 할 수 있지만 초기화 중에는 이러한 데이터를 아직 사용하지 못할 수 있습니다. 이러한 경우 set 호출은 -EAGAIN을 반환해야 합니다. 별도의 전원 켜짐/꺼짐 기능이 있는 일부 속성의 경우 해당 속성이 꺼져 있고 설정을 수행할 수 없는 경우 -ESHUTDOWN을 반환해야 합니다.

set이 유효하게 될 때까지 get은 설정된 값과 반드시 같은 값을 반환하지 않습니다.

예: HVAC 온도 설정

VHAL set HVAC의 예

그림 2. HVAC 온도 설정(CS = CarService, VNS = VehicleNetworkService, VHAL = 차량 HAL)

맞춤 속성 처리

파트너별 요구사항을 지원하기 위해 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은 차량 속성 정수 배열의 첫 번째 정수로 사용되며 나머지 메시지가 디코딩되는 방식을 결정합니다.