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. }