VHAL ของ AIDL มีการกำหนดไว้ใน
android.hardware.automotive.vehicle namespace
อินเทอร์เฟซ VHAL กำหนดไว้ที่
IVehicle.aidl
เว้นแต่จะระบุไว้เป็นอย่างอื่น วิธีการทั้งหมดต้องได้รับการติดตั้งใช้งานสำหรับ VHAL เวอร์ชันที่เฉพาะเจาะจง
เวอร์ชัน
| เวอร์ชัน Android | เวอร์ชัน VHAL ล่าสุด | เวอร์ชันล่าสุดของพร็อพเพอร์ตี้ VHAL | เวอร์ชัน VHAL ขั้นต่ำที่เข้ากันได้ |
|---|---|---|---|
| Android 16 | V4 | V4 | V1 |
| Android 15 | V3 | V3 | V1 |
| Android 14 | V2 | V2 | V1 |
| Android 13 | V1 | (ไม่ได้แยกอินเทอร์เฟซพร็อพเพอร์ตี้ VHAL) | V1 |
เราขอแนะนำให้ใช้ VHAL เวอร์ชันล่าสุดสำหรับ Android เวอร์ชันที่เฉพาะเจาะจง
ฟังก์ชันและ Callback
ฟังก์ชัน VHAL มีคำจำกัดความอยู่ที่
IVehicle.aidl
| วิธีการ | |
|---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest แบบไม่พร้อมกัน ระบบจะส่งผลลัพธ์ผ่าน
onGetValues ของการเรียกกลับ |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest แบบไม่พร้อมกัน ระบบจะส่งผลลัพธ์ผ่าน
onSetValues ของการเรียกกลับ |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
|
(ใหม่ใน Android 16)SupportedValuesListResults getSupportedValuesLists(in List
|
|
(ใหม่ใน Android 16)MinMaxSupportedValueResults getMinMaxSupportedValue(in List
|
|
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
โดยจะกำหนดการเรียกกลับที่
IVehicleCallback.aidl
และมีเมธอดต่อไปนี้
| วิธีการ | |
|---|---|
oneway void onGetValues(in GetValueResults responses)
getValues เพื่อแสดงผลลัพธ์ของฟังก์ชัน get value เรียกใช้
เมื่อค่าบางค่าที่จะดึงข้อมูลพร้อมใช้งาน |
|
oneway void onSetValues(in SetValueResults responses)
setValues function to deliver set value results. เรียกใช้เมื่อ
VHAL จัดการคำขอตั้งค่าพร็อพเพอร์ตี้บางรายการเสร็จแล้ว |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS เหตุการณ์พร็อพเพอร์ตี้จะเกิดขึ้นตามอัตราการสุ่มตัวอย่างการติดตาม
ใน Hz หรือความถี่ของข้อความบัสของยานพาหนะ นอกจากนี้ เหตุการณ์พร็อพเพอร์ตี้อาจเกิดขึ้นหากสถานะของพร็อพเพอร์ตี้มีการเปลี่ยนแปลง
ด้วย เช่น จากไม่พร้อมใช้งานเป็นพร้อมใช้งานON_CHANGE เหตุการณ์พร็อพเพอร์ตี้จะเกิดขึ้นเมื่อค่าของพร็อพเพอร์ตี้
หรือสถานะของพร็อพเพอร์ตี้เปลี่ยนแปลงVehiclePropValue ที่มีสถานะไม่พร้อมใช้งานหรือข้อผิดพลาด
และค่าว่างSharedMemoryFileCount จะเป็น 0 เสมอ |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues ที่มีผลลัพธ์ข้อผิดพลาดแทน |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue หรือ
getSupportedValuesLists เพื่อรับค่าที่อัปเดต |
|
VHAL VTS จะตรวจสอบความถูกต้องของการใช้งาน VHAL ที่
VtsHalAutomotiveVehicle_TargetTest.cpp
การทดสอบจะยืนยันว่าได้ใช้เมธอดพื้นฐานอย่างถูกต้องและการกำหนดค่าพร็อพเพอร์ตี้ที่รองรับถูกต้อง การทดสอบจะทำงานกับอินสแตนซ์ VHAL ทั้งหมดในอุปกรณ์ แต่ AAOS จะใช้อินสแตนซ์เริ่มต้น (android.hardware.automotive.vehicle.IVehicle/default) เท่านั้น
มูลค่าพร็อพเพอร์ตี้ยานพาหนะ
ใช้โครงสร้าง
VehiclePropValue
เพื่ออธิบายค่าของแต่ละพร็อพเพอร์ตี้ ซึ่งมีช่องต่อไปนี้
| ช่อง | คำอธิบาย |
|---|---|
timestamp
| การประทับเวลาที่แสดงเวลาที่เกิดเหตุการณ์และซิงค์กับ
SystemClock.elapsedRealtimeNano() นาฬิกา |
prop |
รหัสพร็อพเพอร์ตี้สำหรับค่านี้ |
areaid |
รหัสพื้นที่สำหรับค่านี้ พื้นที่ต้องเป็นหนึ่งในพื้นที่ที่รองรับซึ่งระบุไว้ในการกำหนดค่ารหัสพื้นที่ หรือ 0 สำหรับพร็อพเพอร์ตี้ทั่วโลก |
value |
โครงสร้างข้อมูลที่มีค่าพร็อพเพอร์ตี้จริง ระบบจะใช้ฟิลด์อย่างน้อย 1 รายการภายในฟิลด์นี้เพื่อจัดเก็บค่าจริงตามประเภทพร็อพเพอร์ตี้ เช่น องค์ประกอบแรกใน value.int32Values ใช้สำหรับพร็อพเพอร์ตี้ประเภท Int32 โปรดดูรายละเอียดที่
การกำหนดค่า
พร็อพเพอร์ตี้ |
status |
สถานะของพร็อพเพอร์ตี้สำหรับการอ่าน สำหรับพร็อพเพอร์ตี้แบบอ่าน/เขียน อาจใช้ได้กับการเขียนด้วย แต่ไม่รับประกัน เช่น พร็อพเพอร์ตี้อาจพร้อมใช้งานสำหรับการอ่าน แต่ไม่พร้อมใช้งานสำหรับการเขียน ในกรณีดังกล่าว สถานะจะเป็น AVAILABLE และช่องค่าจะมีข้อมูลที่ถูกต้อง
ดูสถานะที่เป็นไปได้ได้ที่
VehiclePropertyStatus |
getValues และ setValues แบบอะซิงโครนัส
การดำเนินการ getValues และ setValues จะดำเนินการแบบไม่พร้อมกัน
ซึ่งหมายความว่าฟังก์ชันอาจแสดงผลก่อนที่การดำเนินการรับหรือตั้งค่าจริงจะเสร็จสมบูรณ์
ผลลัพธ์ของการดำเนินการ (เช่น มูลค่าพร็อพเพอร์ตี้สำหรับ getValues และสถานะสำเร็จหรือข้อผิดพลาดสำหรับ setValues) จะแสดงผ่านการเรียกกลับที่ส่งเป็นอาร์กิวเมนต์
การติดตั้งใช้งานต้องไม่บล็อกผลลัพธ์ในเธรด Binder ที่จัดการคำขอ แต่เราขอแนะนำให้คุณจัดเก็บคำขอในคิวคำขอและใช้เธรดตัวแฮนเดิลแยกต่างหาก เพื่อจัดการคำขอแบบอะซิงโครนัส ดูรายละเอียดได้ที่ การติดตั้งใช้งานอ้างอิง
รูปที่ 1 กระบวนการแบบอะซิงโครนัส
ไฟล์พาร์เซลขนาดใหญ่
โครงสร้างทั้งหมดที่ชื่อ XXXs เช่น VehiclePropConfigs, SetValueRequests และ VehiclePropValues เรียกว่า LargeParcelable (หรือ StableLargeParcelable) แต่ละโครงสร้างแสดงรายการค่าที่ใช้ในการส่งข้อมูลขนาดใหญ่ซึ่งอาจเกินขีดจำกัดของ Binder (4 KB ในการติดตั้งใช้งานไลบรารี LargeParcelable) ข้ามขอบเขตของ Binder แต่ละรายการมีคำจำกัดความโครงสร้างที่คล้ายกัน
ซึ่งมีฟิลด์ต่อไปนี้
| คำแนะนำ | คำอธิบาย |
|---|---|
payloads |
รายการค่าเมื่อขนาดค่าอยู่ในขีดจำกัดหน่วยความจำของ Binder หรือรายการว่าง |
sharedMemoryFd |
ตัวอธิบายไฟล์ที่อนุญาตให้เป็น Null ซึ่งชี้ไปยังไฟล์หน่วยความจำที่แชร์ซึ่งจัดเก็บเพย์โหลดที่ซีเรียลไลซ์แล้ว หากรายการค่ามีขนาดใหญ่เกินไป |
เช่น VehiclePropConfigs จะกำหนดเป็น
parcelable VehiclePropConfigs { // The list of vehicle property configs if they fit the binder memory // limitation. VehiclePropConfig[] payloads; // Shared memory file to store configs if they exceed binder memory // limitation. Created by VHAL, readable only at client. Client could keep // the fd opened or keep the FD mapped to access configs. @nullable ParcelFileDescriptor sharedMemoryFd; }
VehiclePropConfigs มีทั้งเพย์โหลดที่ไม่ว่างเปล่าหรือ sharedMemoryFd ที่ไม่ใช่ค่าว่าง
- หาก
payloadsไม่ว่างเปล่า ระบบจะจัดเก็บรายการข้อมูลจริง ซึ่งก็คือ การกำหนดค่าพร็อพเพอร์ตี้ - หาก
sharedMemoryFdไม่ใช่ค่าว่าง แสดงว่ามีไฟล์หน่วยความจำที่ใช้ร่วมกันซึ่งจัดเก็บโครงสร้างที่ซีเรียลไลซ์ของVehiclePropConfigsโครงสร้างใช้ฟังก์ชันwriteToParcelเพื่อจัดลำดับออบเจ็กต์ Parcel
ในฐานะไคลเอ็นต์ Java สำหรับ VHAL บริการรถยนต์จะจัดการการซีเรียลไลซ์และการดีซีเรียลไลซ์สำหรับ
LargeParcelable สำหรับการติดตั้งใช้งาน VHAL และไคลเอ็นต์ดั้งเดิม คุณควรซีเรียลไลซ์และดีซีเรียลไลซ์
LargeParcelable ด้วยไลบรารี
LargeParcelable
หรือคลาส Wrapper ที่มีประโยชน์สำหรับไลบรารีใน
ParcelableUtils.h
ตัวอย่างเช่น ไคลเอ็นต์เนทีฟที่แยกวิเคราะห์คำขอสำหรับ getValues ที่ได้รับจาก Binder
มีดังนี้
// 'requests' are from the binder. GetValueRequests requests; expected<LargeParcelableBase::BorrowedOwnedObject, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests); if (deserializedResults.ok()) { const std::vector & getValueRequests = deserializedResults.value().getObject()->payloads; // Use the getValueRequests. } else { // handle error. }
ตัวอย่างการติดตั้งใช้งาน VHAL ที่ส่งผลลัพธ์สำหรับ getValues ผ่าน Binder จะแสดงอยู่ด้านล่าง
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }