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