อินเทอร์เฟซ 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)
ไม่ได้ใช้และสามารถนำไปใช้ได้โดยไม่ต้องดำเนินการ

Callback จะกำหนดที่ 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 จะดำเนินการไม่พร้อมกัน ซึ่งหมายความว่าฟังก์ชันอาจแสดงผลก่อนที่การดำเนินการ get หรือ set จริงจะเสร็จสมบูรณ์ ผลการดำเนินการ (เช่น ค่าพร็อพเพอร์ตี้สำหรับ getValues และความสำเร็จหรือ สถานะข้อผิดพลาดของ setValues) จะส่งผ่าน Callback ที่ส่งผ่านเป็นอาร์กิวเมนต์

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

รูปที่ 1 กระบวนการแบบไม่พร้อมกัน

แพ็กเกจขนาดใหญ่

โครงสร้างทั้งหมดที่ชื่อ XXXs เช่น VehiclePropConfigs จะเรียก SetValueRequests และ VehiclePropValues LargeParcelable (หรือ StableLargeParcelable) แต่ละแชแนลแสดงรายชื่อ ค่าที่ใช้ในการส่งข้อมูลขนาดใหญ่ที่อาจเกินข้อจำกัดของ Binder (4 KB ในไฟล์ การใช้ไลบรารี 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

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

ในฐานะไคลเอ็นต์ Java สำหรับ VHAL บริการรถยนต์จะจัดการการทำให้เป็นอนุกรมและดีซีเรียลไลซ์สำหรับ LargeParcelable สำหรับการใช้งาน VHAL และ Native Client 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 ผ่านแฟ้ม แสดงอยู่ด้านล่าง

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}