คุณสมบัติของยานพาหนะ

อินเทอร์เฟซ Vehicle Hardware Abstraction Layer (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

พร็อพเพอร์ตี้ที่มีการแบ่งโซนอาจมีค่ามากกว่า 1 ค่า โดยขึ้นอยู่กับจำนวนโซนที่พร็อพเพอร์ตี้รองรับ

ประเภทพื้นที่

VHAL กำหนดพื้นที่หลายประเภท ดังนี้

ประเภทพื้นที่ คำอธิบาย
GLOBAL พร็อพเพอร์ตี้นี้เป็นแบบ Singleton และไม่มีหลายๆ พื้นที่
WINDOW พื้นที่ตามกรอบเวลา ใช้ VehicleAreaWindow enum
MIRROR พื้นที่ตามมิเรอร์ ใช้ VehicleAreaMirror enum
SEAT พื้นที่ที่อิงตามที่นั่ง ใช้ enum VehicleAreaSeat
DOOR พื้นที่อิงตามประตู ใช้ enum VehicleAreaDoor
WHEEL พื้นที่ตามล้อ ใช้ VehicleAreaWheel enum

พร็อพเพอร์ตี้ที่มีการแบ่งเขตแต่ละรายการต้องใช้ประเภทพื้นที่ที่กำหนดไว้ล่วงหน้า พื้นที่แต่ละประเภทมีชุด Flag แบบบิตที่กําหนดไว้ใน Enum สําหรับประเภทพื้นที่ เช่น พื้นที่ SEAT จะกำหนด Enum 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
  • ...

รหัสพื้นที่

พร็อพเพอร์ตี้ที่มีการแบ่งโซนจะระบุผ่านรหัสพื้นที่ พร็อพเพอร์ตี้ที่มีการแบ่งเขตแต่ละรายการอาจรองรับรหัสพื้นที่อย่างน้อย 1 รหัส รหัสพื้นที่ประกอบด้วย Flag อย่างน้อย 1 รายการจาก Enum ที่เกี่ยวข้อง เช่น พร็อพเพอร์ตี้ที่ใช้ VehicleAreaSeat อาจใช้รหัสพื้นที่ต่อไปนี้

รายการ คำอธิบาย
ROW_1_LEFT | ROW_1_RIGHT รหัสพื้นที่จะมีผลกับทั้ง 2 ที่นั่งด้านหน้า
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 รหัสพร็อพเพอร์ตี้, int

พร็อพเพอร์ตี้ของโซนการจัดการ

พร็อพเพอร์ตี้ที่มีการแบ่งโซนเทียบเท่ากับคอลเล็กชันพร็อพเพอร์ตี้หลายรายการที่เข้าถึงพร็อพเพอร์ตี้ย่อยแต่ละรายการได้โดยใช้ค่ารหัสพื้นที่ที่ระบุ

  • get การเรียกใช้พร็อพเพอร์ตี้ที่มีการแบ่งเขตจะมีรหัสพื้นที่อยู่ในคำขอเสมอ ดังนั้น ระบบจะแสดงเฉพาะค่าปัจจุบันของรหัสพื้นที่ที่ขอ หากพร็อพเพอร์ตี้เป็นแบบทั่วโลก รหัสพื้นที่จะเป็น 0
  • การเรียกใช้ set สำหรับพร็อพเพอร์ตี้ที่มีการแบ่งเขตจะมีรหัสพื้นที่ในคำขอเสมอ ดังนั้น ระบบจะเปลี่ยนเฉพาะรหัสพื้นที่ที่ขอเท่านั้น
  • การเรียก subscribe จะสร้างเหตุการณ์สำหรับรหัสพื้นที่ทั้งหมดในพร็อพเพอร์ตี้

รับสาย

ในระหว่างการเริ่มต้น ค่าของพร็อพเพอร์ตี้อาจยังไม่พร้อมใช้งานเนื่องจากยังไม่ได้รับข้อความเครือข่ายยานพาหนะที่ตรงกัน ในกรณีเช่นนี้ การเรียกใช้ get ควรแสดงผลเป็น -EAGAIN ที่พักบางแห่ง (เช่น HVAC) มีคุณสมบัติเปิด/ปิดแยกกัน การเรียก get สำหรับพร็อพเพอร์ตี้ดังกล่าว (เมื่อปิดเครื่อง) ควรแสดงสถานะ UNAVAILABLE แทนที่จะแสดงข้อผิดพลาด เช่น รับอุณหภูมิ HVAC

VHAL get HVAC example

รูปที่ 1 รับอุณหภูมิ HVAC (CS = CarService, VHAL = HAL ของยานพาหนะ)

ตั้งค่าการโทร

โดยทั่วไป การเรียกใช้ set จะทําให้เกิดคําขอเปลี่ยนแปลงในเครือข่ายยานยนต์ การเรียกใช้ set ควรเป็นการดำเนินการแบบไม่พร้อมกันซึ่งแสดงผลโดยเร็วที่สุด แต่ก็สามารถเป็นแบบพร้อมกันได้เช่นกัน การเรียกใช้ set บางรายการอาจต้องใช้ข้อมูลเริ่มต้น แต่ในระหว่างการเริ่มต้นใช้งาน ข้อมูลดังกล่าวอาจยังไม่พร้อมใช้งาน ในกรณีเช่นนี้ การเรียกใช้ set ควรแสดงผลเป็น StatusCode#TRY_AGAIN พร็อพเพอร์ตี้บางรายการที่มีการเปิดและปิดแยกกันควรแสดงผลเป็น StatusCode#NOT_AVAILABLE หรือ StatusCode#NOT_AVAILABLE_DISABLED เมื่อปิดอยู่และไม่สามารถดำเนินการ set ได้ get ไม่จำเป็นต้องแสดงผลเป็นค่าเดียวกันกับที่ตั้งไว้จนกว่า set จะมีผล เช่น set HVAC Temperature

ตัวอย่าง HVAC ของชุด VHAL

รูปที่ 2 ตั้งอุณหภูมิ HVAC (CS = CarService, VHAL = HAL ยานพาหนะ)

การจัดการพร็อพเพอร์ตี้ที่กำหนดเอง

VHAL อนุญาตให้ใช้พร็อพเพอร์ตี้ที่กำหนดเองซึ่งจํากัดไว้สําหรับแอประบบ เพื่อรองรับความต้องการเฉพาะของพาร์ทเนอร์ ใช้หลักเกณฑ์ต่อไปนี้เมื่อทํางานกับพร็อพเพอร์ตี้ที่กําหนดเอง

  • คุณควรสร้างรหัสพร็อพเพอร์ตี้โดยใช้ช่องต่อไปนี้
    • VehiclePropertyGroup:VENDOR
      กลุ่ม VENDOR ใช้สำหรับพร็อพเพอร์ตี้ที่กำหนดเองเท่านั้น
    • VehicleArea
      เลือกประเภทพื้นที่ที่เหมาะสม
    • VehiclePropertyType
      เลือกประเภทข้อมูลที่เหมาะสม ประเภท BYTES อนุญาตให้ส่งข้อมูลดิบ ซึ่งเพียงพอในกรณีส่วนใหญ่ การส่งข้อมูลขนาดใหญ่บ่อยครั้งผ่านพร็อพเพอร์ตี้ที่กำหนดเองอาจทำให้การเข้าถึงเครือข่ายของยานพาหนะทั้งหมดช้าลง ดังนั้นโปรดระมัดระวังเมื่อเพิ่มเพย์โหลดขนาดใหญ่
    • Property ID
      เลือกรหัสสำหรับพร็อพเพอร์ตี้ที่กำหนดเอง 4 รหัส
  • คุณต้องไม่ใช้พร็อพเพอร์ตี้ที่กำหนดเองเพื่อจำลองพร็อพเพอร์ตี้ยานพาหนะที่อยู่แล้วใน (VehiclePropertyIds SDK) เพื่อป้องกันไม่ให้ระบบนิเวศแตกแยก
  • กรอก VehiclePropConfig.configString ด้วยคำอธิบายสั้นๆ เกี่ยวกับพร็อพเพอร์ตี้ที่กำหนดเอง ซึ่งจะช่วยให้เครื่องมือตรวจสอบความถูกต้องสามารถแจ้งว่ามีการทําซ้ำที่พักรถที่มีอยู่โดยไม่ตั้งใจ เช่น "สถานะไฟฉุกเฉิน"
  • เข้าถึงผ่าน CarPropertyManager (สำหรับคอมโพเนนต์ Java) หรือผ่าน Vehicle Network Service API (สำหรับเวอร์ชันเนทีฟ) อย่าดัดแปลง API สำหรับรถยนต์อื่นๆ เพราะอาจทำให้เกิดปัญหาความเข้ากันได้ในอนาคต
  • หลังจากติดตั้งใช้งานพร็อพเพอร์ตี้ของผู้ให้บริการแล้ว ให้เลือกเฉพาะ รายการสิทธิ์ใน VehicleVendorPermission enum สำหรับพร็อพเพอร์ตี้ของผู้ให้บริการ การแมปสิทธิ์ของผู้ให้บริการกับพร็อพเพอร์ตี้ของระบบจะทำให้ CTS และ VTS ใช้งานไม่ได้

การจัดการพร็อพเพอร์ตี้ HVAC

คุณใช้ VHAL เพื่อควบคุมระบบปรับอากาศ (HVAC) ได้โดยการตั้งค่าคุณสมบัติที่เกี่ยวข้องกับระบบปรับอากาศ (HVAC) พร็อพเพอร์ตี้ HVAC ส่วนใหญ่เป็นพร็อพเพอร์ตี้ที่มีการแบ่งโซน แม้ว่าหลายรายการจะเป็นพร็อพเพอร์ตี้ที่ไม่มีการแบ่งโซน (ส่วนกลาง) ตัวอย่างพร็อพเพอร์ตี้ที่กําหนดมีดังนี้

พร็อพเพอร์ตี้ วัตถุประสงค์
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET ตั้งอุณหภูมิตามโซน
VEHICLE_PROPERTY_HVAC_RECIRC_ON ควบคุมการหมุนเวียนต่อโซน

หากต้องการดูรายการที่พักที่มีระบบปรับอากาศ (HVAC) ทั้งหมด ให้ค้นหา VEHICLE_PROPERTY_HVAC_* ใน types.hal เมื่อพร็อพเพอร์ตี้ HVAC ใช้ VehicleAreaSeat ระบบจะใช้กฎเพิ่มเติมสำหรับการแมปพร็อพเพอร์ตี้ HVAC แบบแบ่งโซนกับรหัสพื้นที่ ที่นั่งแต่ละที่นั่งในรถต้องเป็นส่วนหนึ่งของ รหัสพื้นที่ในอาร์เรย์รหัสพื้นที่

ตัวอย่างที่ 1 รถมีเบาะหน้า 2 ที่นั่ง (ROW_1_LEFT, ROW_1_RIGHT) และเบาะหลัง 3 ที่นั่ง (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT) โดยมีตัวควบคุมอุณหภูมิ 2 ตัว ได้แก่ ฝั่งคนขับและฝั่งผู้โดยสาร

  • ชุดการแมปรหัสพื้นที่ที่ถูกต้องสำหรับ HVAC_TEMPERATURE SET มีดังนี้
    • 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) แถวที่ 2 มี 3 ที่นั่ง (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT) และแถวที่ 3 มี 3 ที่นั่ง (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT) รถมีตัวควบคุมอุณหภูมิ 3 ตัว ได้แก่ ฝั่งคนขับ ฝั่งผู้โดยสาร และด้านหลัง วิธีที่เหมาะสมในการแมป HVAC_TEMPERATURE_SET กับรหัสพื้นที่คือการใช้อาร์เรย์องค์ประกอบ 3 รายการดังนี้

  • 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) ลูกค้าสามารถรวมระบบยานพาหนะที่ติดต่อผ่านพร็อพเพอร์ตี้ VMS ไว้ใน VHAL หรือแอปพลิเคชัน Android ที่มีสิทธิ์ ข้อมูลที่มีการแชร์ใน VMS มีไว้เพื่อจำกัดไว้ที่ข้อมูลแผนที่สำหรับใช้โดยระบบของยานพาหนะและแอปที่รองรับ

VMS มีไว้เพื่อใช้ในการติดตั้งใช้งาน Android Automotive เท่านั้น AOSP ไม่มีไคลเอ็นต์เริ่มต้นที่เผยแพร่หรือสมัครใช้บริการ VMS สําหรับพร็อพเพอร์ตี้ VMS ใน VHAL ประเภทข้อความและโครงสร้างข้อมูลจะอธิบายไว้ใน VHAL 2.0 ใน VmsMessageType enum ซึ่งแสดงรายการประเภทข้อความ VMS ที่รองรับ Enumerator นี้ใช้เป็นจำนวนเต็มแรกในอาร์เรย์จำนวนเต็มของพร็อพเพอร์ตี้ยานพาหนะ และกำหนดวิธีถอดรหัสข้อความที่เหลือ