อินเตอร์เฟซ VHAL

AIDL VHAL ถูกกำหนดไว้ใน android.hardware.automotive.vehicle namespace อินเทอร์เฟซ VHAL ถูกกำหนดไว้ที่ IVehicle.aidl เว้นแต่จะระบุไว้ จะต้องใช้วิธีการทั้งหมด

วิธี
VehiclePropConfigs getAllPropConfigs()
ส่งคืนรายการ การกำหนดค่าคุณสมบัติ ทั้งหมดที่ HAL รถคันนี้รองรับ
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)
สมัครสมาชิกเหตุการณ์คุณสมบัติพร้อมตัวเลือกที่ระบุ ตัวเลือกการสมัครสมาชิกประกอบด้วยรหัสคุณสมบัติ รหัสพื้นที่คุณสมบัติ และอัตราตัวอย่างในหน่วย Hz (สำหรับคุณสมบัติต่อเนื่อง) ไม่ได้ใช้ maxSharedMemoryFileCount
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
ยกเลิกการสมัครกิจกรรมคุณสมบัติที่สมัครเป็นสมาชิกก่อนหน้านี้สำหรับคุณสมบัติที่ระบุ
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
ไม่ได้ใช้และสามารถนำมาใช้แบบไม่ต้องดำเนินการได้

การเรียกกลับถูกกำหนดไว้ที่ IVehicleCallback.aidl และมีเมธอดเหล่านี้

วิธี
oneway void onGetValues(in GetValueResults responses)
โทรกลับสำหรับฟังก์ชัน getValues ​​เพื่อส่งมอบผลลัพธ์การรับค่า เรียกว่าเมื่อค่าบางค่าที่จะดึงข้อมูลพร้อม
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 โครงสร้างข้อมูลที่มีค่าคุณสมบัติจริง ขึ้นอยู่กับประเภทคุณสมบัติ จะมีการใช้อย่างน้อยหนึ่งฟิลด์ภายในฟิลด์นี้เพื่อจัดเก็บค่าจริง ตัวอย่างเช่น องค์ประกอบแรกใน value.int32Values ​​ใช้สำหรับคุณสมบัติประเภท Int32 สำหรับรายละเอียด โปรดดูที่ การกำหนดค่าคุณสมบัติ

getValues ​​และ setValues ​​แบบอะซิงโครนัส

การดำเนินการ getValues ​​และ setValues ​​จะดำเนินการแบบอะซิงโครนัส ซึ่งหมายความว่าฟังก์ชันอาจส่งคืนก่อนที่การดำเนินการรับหรือตั้งค่าจริงจะเสร็จสมบูรณ์ ผลลัพธ์ของการดำเนินการ (เช่น ค่าคุณสมบัติสำหรับ getValues ​​และสถานะความสำเร็จหรือข้อผิดพลาดสำหรับ setValues ​​) จะถูกส่งผ่านการเรียกกลับที่ส่งผ่านเป็นอาร์กิวเมนต์

การใช้งานต้องไม่บล็อกผลลัพธ์ในเธรด Binder ที่จัดการคำขอ เราขอแนะนำให้คุณจัดเก็บคำขอไว้ในคิวคำขอแทน และใช้เธรดตัวจัดการแยกต่างหากเพื่อจัดการคำขอแบบอะซิงโครนัส ดู การดำเนินการอ้างอิง สำหรับรายละเอียด

รูปที่ 1 กระบวนการอะซิงโครนัส

พัสดุขนาดใหญ่

โครงสร้างทั้งหมดที่ชื่อ XXXs เช่น VehiclePropConfigs , SetValueRequests และ VehiclePropValues ​​เรียกว่า LargeParcelable (หรือ StableLargeParcelable ) แต่ละค่าแสดงถึงรายการค่าที่ใช้ในการส่งข้อมูลขนาดใหญ่ที่อาจเกินขีดจำกัดของตัวผูก (4KB ในการใช้งานไลบรารี LargeParcelable ) ข้ามขอบเขตของตัวผูก แต่ละคำมีคำจำกัดความของโครงสร้างที่คล้ายกันซึ่งประกอบด้วยฟิลด์ต่อไปนี้

คำแนะนำ คำอธิบาย
payloads รายการค่าเมื่อขนาดของค่าพอดีกับขีดจำกัดหน่วยความจำของ Binder หรือรายการว่าง
sharedMemoryFd ตัวอธิบายไฟล์ Nullable ชี้ไปที่ไฟล์หน่วยความจำที่ใช้ร่วมกันซึ่งจัดเก็บเพย์โหลดแบบอนุกรมหากรายการค่ามีขนาดใหญ่เกินไป

ตัวอย่างเช่น 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 เพื่อทำให้พัสดุเป็นอนุกรม

ในฐานะไคลเอ็นต์ Java สำหรับ VHAL Car Service จะจัดการซีเรียลไลซ์และดีซีเรียลไลซ์สำหรับ LargeParcelable สำหรับการใช้งาน VHAL และไคลเอ็นต์แบบเนทีฟ LargeParcelable ควรได้รับการซีเรียลไลซ์และดีซีเรียลไลซ์ด้วยไลบรารี LargeParcelable หรือคลาส wrapper ที่มีประโยชน์สำหรับไลบรารีใน ParcelableUtils.h

ตัวอย่างเช่น คำขอแยกวิเคราะห์ไคลเอ็นต์ดั้งเดิมสำหรับ getValues ​​ที่ได้รับจาก Binder จะเป็นดังนี้:

// 'requests' are from the binder.
GetValueRequests requests;
expected, 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}