อินเทอร์เฟซ 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 |
พื้นที่ตามที่นั่ง ใช้ VehicleAreaSeat enum |
DOOR |
พื้นที่ตามประตู ใช้ VehicleAreaDoor enum |
WHEEL |
พื้นที่ตามล้อ ใช้ VehicleAreaWheel enum |
พร็อพเพอร์ตี้ที่มีการแบ่งเขตแต่ละรายการต้องใช้ประเภทพื้นที่ที่กำหนดไว้ล่วงหน้า พื้นที่แต่ละประเภทมีชุด Flag แบบบิตที่กําหนดไว้ใน Enum สําหรับประเภทพื้นที่ ตัวอย่างเช่น SEAT
area
จะกำหนด 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
- ...
รหัสพื้นที่
พร็อพเพอร์ตี้ที่มีการแบ่งโซนจะระบุผ่านรหัสพื้นที่ พร็อพเพอร์ตี้ที่มีการแบ่งเขตแต่ละรายการอาจรองรับรหัสพื้นที่อย่างน้อย 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
รูปที่ 1 รับอุณหภูมิ HVAC (CS = CarService, VHAL = HAL ของยานพาหนะ)
ตั้งค่าการโทร
โดยทั่วไป การเรียกใช้ set
จะทําให้เกิดคําขอเปลี่ยนแปลงในเครือข่ายยานพาหนะ การเรียกใช้ set
ควรเป็นการดำเนินการแบบไม่พร้อมกันซึ่งแสดงผลโดยเร็วที่สุด แต่ก็เป็นแบบพร้อมกันได้เช่นกัน การเรียกใช้ set
บางรายการอาจต้องใช้ข้อมูลเริ่มต้น แต่ในระหว่างการเริ่มต้นใช้งาน ข้อมูลดังกล่าวอาจยังไม่พร้อมใช้งาน ในกรณีเช่นนี้ การเรียกใช้ set
ควรแสดงผลเป็น StatusCode#TRY_AGAIN
พร็อพเพอร์ตี้บางรายการที่มีการเปิดและปิดแยกกันควรแสดงผลเป็น StatusCode#NOT_AVAILABLE
หรือ StatusCode#NOT_AVAILABLE_DISABLED
เมื่อปิดอยู่และไม่สามารถดำเนินการ set
ได้ จนกว่า set
จะมีผล get
ไม่จำเป็นต้องแสดงผลค่าเดียวกันกับที่ตั้งไว้ เช่น set HVAC Temperature
รูปที่ 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 นี้ใช้เป็นจำนวนเต็มแรกในอาร์เรย์จำนวนเต็มของพร็อพเพอร์ตี้ยานพาหนะ และกำหนดวิธีถอดรหัสข้อความที่เหลือ