VHAL ของ AIDL จะกำหนดไว้ใน
android.hardware.automotive.vehicle namespace
อินเทอร์เฟซ VHAL ได้รับการกําหนดไว้ที่
IVehicle.aidl
ต้องใช้วิธีการทั้งหมด เว้นแต่จะระบุไว้เป็นอย่างอื่น
วิธีการ | |
---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest แบบเป็นกลุ่มแบบอะซิงโครนัส ระบบจะแสดงผลลัพธ์ผ่านเมธอด onGetValues ของ Callback |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest หลายรายการแบบอะซิงโครนัส ระบบจะแสดงผลลัพธ์ผ่านเมธอด onSetValues ของ Callback |
|
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)
|
มีการกําหนดการเรียกกลับที่
IVehicleCallback.aidl
และมีวิธีการเหล่านี้
วิธีการ | |
---|---|
oneway void onGetValues(in GetValueResults responses)
getValues เพื่อแสดงผลลัพธ์ของ get value เรียกใช้เมื่อค่าที่จะดึงข้อมูลบางส่วนพร้อมแล้ว |
|
oneway void onSetValues(in SetValueResults responses)
setValues เพื่อแสดงผลลัพธ์ของค่าที่ตั้งไว้ เรียกใช้เมื่อ VHAL จัดการคําขอชุดพร็อพเพอร์ตี้บางส่วนเสร็จแล้ว |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS เหตุการณ์ของพร็อพเพอร์ตี้จะเกิดขึ้นตามอัตราการสุ่มตัวอย่างการสมัครรับข้อมูลใน Hz หรือความถี่ของข้อความบัสของยานพาหนะ เหตุการณ์พร็อพเพอร์ตี้อาจเกิดขึ้นได้หากสถานะของพร็อพเพอร์ตี้มีการเปลี่ยนแปลง เช่น จากไม่พร้อมใช้งานเป็นพร้อมใช้งานON_CHANGE เหตุการณ์ของพร็อพเพอร์ตี้จะเกิดขึ้นเมื่อค่าของพร็อพเพอร์ตี้หรือสถานะของพร็อพเพอร์ตี้มีการเปลี่ยนแปลงSharedMemoryFileCount เป็น 0 เสมอ |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues ที่มีผลลัพธ์ข้อผิดพลาดแทน |
ดูข้อมูลเพิ่มเติมได้ที่ IVehicle.aidl และ IVehicleCallback.aidl
การใช้งาน VHAL ได้รับการตรวจสอบโดย VHAL VTS ที่ VtsHalAutomotiveVehicle_TargetTest.cpp การทดสอบจะยืนยันว่ามีการใช้เมธอดพื้นฐานอย่างถูกต้องและการกำหนดค่าพร็อพเพอร์ตี้ที่รองรับถูกต้อง
ค่าพร็อพเพอร์ตี้ของยานพาหนะ
ใช้โครงสร้าง VehiclePropValue
เพื่ออธิบายค่าของพร็อพเพอร์ตี้แต่ละรายการ ซึ่งมีช่องต่อไปนี้
ช่อง | คำอธิบาย |
---|---|
timestamp
| การประทับเวลาที่แสดงเวลาที่เกิดเหตุการณ์และซิงค์กับนาฬิกา SystemClock.elapsedRealtimeNano() |
prop |
รหัสพร็อพเพอร์ตี้สำหรับค่านี้ |
areaid |
รหัสพื้นที่สำหรับค่านี้ พื้นที่ต้องเป็นหนึ่งในพื้นที่ที่รองรับซึ่งระบุไว้ในการกำหนดค่ารหัสพื้นที่ หรือ 0 สำหรับพร็อพเพอร์ตี้ทั่วโลก |
value |
โครงสร้างข้อมูลที่มีค่าพร็อพเพอร์ตี้จริง ระบบจะใช้ฟิลด์อย่างน้อย 1 ฟิลด์ในช่องนี้เพื่อจัดเก็บค่าจริงตามประเภทพร็อพเพอร์ตี้ เช่น องค์ประกอบแรกใน value.int32Values ใช้สำหรับพร็อพเพอร์ตี้ประเภท Int32 โปรดดูรายละเอียดที่หัวข้อการกําหนดค่าพร็อพเพอร์ตี้ |
getValues และ setValues แบบอะซิงโครนัส
การดำเนินการ getValues
และ setValues
จะดำเนินการแบบไม่พร้อมกัน ซึ่งหมายความว่าฟังก์ชันอาจแสดงผลก่อนการดำเนินการ get หรือ set จริงเสร็จสมบูรณ์
ระบบจะส่งผลลัพธ์การดำเนินการ (เช่น ค่าพร็อพเพอร์ตี้สำหรับ getValues
และสถานะสำเร็จหรือข้อผิดพลาดสำหรับ setValues
) ผ่านคอลแบ็กที่ส่งเป็นอาร์กิวเมนต์
การติดตั้งใช้งานต้องไม่บล็อกผลลัพธ์ในเธรด Binder ที่จัดการคําขอ เราขอแนะนำให้คุณจัดเก็บคําขอไว้ในคิวคําขอ และใช้เธรดแฮนเดิลแยกต่างหากเพื่อจัดการคําขอแบบไม่พร้อมกัน ดูรายละเอียดได้ในการใช้งานอ้างอิง
รูปที่ 1 กระบวนการแบบอะซิงโครนัส
ไฟล์พาร์เซลขนาดใหญ่
โครงสร้างทั้งหมดที่มีชื่อว่า XXXs
เช่น VehiclePropConfigs
, SetValueRequests
และ VehiclePropValues
จะเรียกว่า LargeParcelable
(หรือ StableLargeParcelable
) โดยแต่ละโครงสร้างจะแสดงรายการค่าที่ใช้ส่งข้อมูลขนาดใหญ่ที่อาจเกินขีดจํากัดของ Binder (4KB ในการใช้งานไลบรารี LargeParcelable
) ข้ามขอบเขต Binder แต่ละรายการมีคำจำกัดความโครงสร้างที่คล้ายกันซึ่งมีช่องต่อไปนี้
คำแนะนำ | คำอธิบาย |
---|---|
payloads |
รายการค่าเมื่อขนาดค่าพอดีกับข้อจํากัดของหน่วยความจําของ Binder หรือรายการว่าง |
sharedMemoryFd |
ตัวระบุไฟล์ที่ลบได้ซึ่งชี้ไปยังไฟล์หน่วยความจําที่แชร์ซึ่งจัดเก็บเพย์โหลดที่แปลงเป็นอนุกรมหากรายการค่ามีขนาดใหญ่เกินไป |
เช่น 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
ที่ไม่ใช่ค่า Null
- หาก
payloads
ไม่ว่างเปล่า ระบบจะจัดเก็บรายการข้อมูลจริง ซึ่งเป็นการกำหนดค่าพร็อพเพอร์ตี้ - หาก
sharedMemoryFd
ไม่ใช่ค่า Null แสดงว่ามีไฟล์หน่วยความจำที่ใช้ร่วมกัน ซึ่งจัดเก็บโครงสร้างที่แปลงเป็นอนุกรมของVehiclePropConfigs
โครงสร้างนี้ใช้ฟังก์ชันwriteToParcel
เพื่อจัดรูปแบบพัสดุไปรษณีย์
ในฐานะไคลเอ็นต์ 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. }