Sensors AIDL HAL

Hardware Abstraction Layer (HAL) ของเซ็นเซอร์คืออินเทอร์เฟซระหว่าง เฟรมเวิร์กเซ็นเซอร์ของ Android กับเซ็นเซอร์ของอุปกรณ์ เช่น ตัวตรวจวัดความเร่งหรือ เครื่องวัดการหมุน HAL ของเซ็นเซอร์จะกำหนดฟังก์ชันที่ต้องนำไปใช้เพื่อ อนุญาตให้เฟรมเวิร์กควบคุมเซ็นเซอร์

HAL ของ AIDL เซ็นเซอร์พร้อมใช้งานใน Android 13 ขึ้นไปสำหรับอุปกรณ์ใหม่และอุปกรณ์ที่อัปเกรด HAL ของ AIDL ของเซ็นเซอร์ซึ่งอิงตาม HAL ของเซ็นเซอร์ 2.1 ใช้อินเทอร์เฟซ HAL ของ AIDL และแสดงประเภทเซ็นเซอร์ IMU ของเครื่องมือติดตามศีรษะและแกนที่จำกัด

อินเทอร์เฟซ AIDL HAL

แหล่งข้อมูลหลักสำหรับ HAL ของ AIDL ของเซ็นเซอร์อยู่ในคำจำกัดความ HAL ที่ hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl

ติดตั้งใช้งาน HAL ของ AIDL ของเซ็นเซอร์

หากต้องการใช้ HAL ของ AIDL ของเซ็นเซอร์ ออบเจ็กต์ต้องขยายISensors อินเทอร์เฟซและใช้ฟังก์ชันทั้งหมดที่กำหนดไว้ใน hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl

เริ่มต้น HAL

เฟรมเวิร์กเซ็นเซอร์ของ Android ต้องเริ่มต้น HAL ของเซ็นเซอร์ก่อนจึงจะใช้งานได้ เฟรมเวิร์กจะเรียกใช้ฟังก์ชัน initialize() เพื่อระบุพารามิเตอร์ 3 รายการไปยัง HAL ของเซ็นเซอร์ ได้แก่ ตัวอธิบาย FMQ 2 รายการและตัวชี้ 1 รายการไปยังออบเจ็กต์ ISensorsCallback

HAL ใช้ตัวอธิบายแรกเพื่อสร้าง Event FMQ ที่ใช้เขียนเหตุการณ์เซ็นเซอร์ ไปยังเฟรมเวิร์ก HAL ใช้ตัวอธิบายที่ 2 เพื่อสร้าง FMQ ของ Wake Lock ที่ใช้ในการซิงค์เมื่อ HAL ปลดล็อกการปลุกสำหรับWAKE_UP เหตุการณ์เซ็นเซอร์ HAL ต้องบันทึกพอยน์เตอร์ไปยังออบเจ็กต์ ISensorsCallback เพื่อให้เรียกใช้ฟังก์ชันเรียกกลับที่จำเป็นได้

ฟังก์ชัน initialize() ต้องเป็นฟังก์ชันแรกที่เรียกใช้เมื่อเริ่มต้น HAL ของเซ็นเซอร์

เปิดเผยเซ็นเซอร์ที่พร้อมใช้งาน

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

หากเซ็นเซอร์หลายตัวใช้ประเภทเซ็นเซอร์และพร็อพเพอร์ตี้การปลุกเดียวกัน ระบบจะเรียกเซ็นเซอร์ตัวแรกในรายการว่าเซ็นเซอร์เริ่มต้นและส่งกลับไปยังแอปที่ใช้ฟังก์ชัน getDefaultSensor(int sensorType, bool wakeUp)

ความเสถียรของรายการเซ็นเซอร์

หลังจากรีสตาร์ท HAL ของเซ็นเซอร์ หากข้อมูลที่ getSensorsList() ส่งกลับมาแสดงให้เห็นถึงการเปลี่ยนแปลงที่สำคัญเมื่อเทียบกับรายการเซ็นเซอร์ที่ดึงข้อมูลมาก่อนการรีสตาร์ท เฟรมเวิร์กจะทริกเกอร์การรีสตาร์ท รันไทม์ของ Android การเปลี่ยนแปลงที่สำคัญในรายการเซ็นเซอร์รวมถึงกรณีที่เซ็นเซอร์ที่มีแฮนเดิลที่กำหนดหายไปหรือมีการเปลี่ยนแปลงแอตทริบิวต์ หรือมีการเพิ่มเซ็นเซอร์ใหม่ แม้ว่าการรีสตาร์ทรันไทม์ของ Android จะรบกวนผู้ใช้ แต่ก็จำเป็นเนื่องจากเฟรมเวิร์กของ Android ไม่สามารถปฏิบัติตามสัญญา API ของ Android ได้อีกต่อไป ซึ่งระบุว่าเซ็นเซอร์แบบคงที่ (ไม่ใช่แบบไดนามิก) จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของแอป การดำเนินการนี้อาจทำให้เฟรมเวิร์กไม่สามารถสร้างคำขอเซ็นเซอร์ที่ใช้งานอยู่ซึ่งแอปส่งมาได้อีกด้วย ดังนั้น เราขอแนะนำให้ผู้ให้บริการ HAL หลีกเลี่ยงการเปลี่ยนแปลงรายการเซ็นเซอร์ที่ไม่จำเป็น

HAL ต้องจับคู่เซ็นเซอร์จริงในอุปกรณ์กับแฮนเดิลของเซ็นเซอร์อย่างแน่นอนเพื่อให้มั่นใจว่าแฮนเดิลของเซ็นเซอร์จะเสถียร แม้ว่าอินเทอร์เฟซ HAL ของเซ็นเซอร์จะไม่ได้กำหนดการติดตั้งใช้งานที่เฉพาะเจาะจง แต่นักพัฒนาแอปก็มีตัวเลือกมากมาย ในการปฏิบัติตามข้อกำหนดนี้

ตัวอย่างเช่น คุณสามารถจัดเรียงรายการเซ็นเซอร์ได้โดยใช้ชุดค่าผสมของแอตทริบิวต์คงที่ของเซ็นเซอร์แต่ละรายการ เช่น ผู้จำหน่าย รุ่น และประเภทเซ็นเซอร์ อีกทางเลือกหนึ่งคือการใช้ประโยชน์จากข้อเท็จจริงที่ว่าชุดเซ็นเซอร์แบบคงที่ของอุปกรณ์ได้รับการแก้ไขในฮาร์ดแวร์ ดังนั้น HAL จึงต้องทราบเมื่อเซ็นเซอร์ที่คาดไว้ทั้งหมดเริ่มต้นเสร็จสมบูรณ์ก่อนที่จะกลับจาก getSensorsList() รายการเซ็นเซอร์ที่คาดไว้นี้สามารถคอมไพล์เป็นไบนารี HAL หรือจัดเก็บไว้ใน ไฟล์กำหนดค่าในระบบไฟล์ และสามารถใช้ลำดับการปรากฏเพื่อ สร้างแฮนเดิลที่เสถียรได้ แม้ว่าวิธีแก้ปัญหาที่ดีที่สุดจะขึ้นอยู่กับรายละเอียดการใช้งานเฉพาะของ HAL แต่ข้อกำหนดที่สำคัญคือแฮนเดิลเซ็นเซอร์ ต้องไม่เปลี่ยนแปลงเมื่อรีสตาร์ท HAL

กำหนดค่าเซ็นเซอร์

ก่อนเปิดใช้งานเซ็นเซอร์ คุณต้องกำหนดค่าเซ็นเซอร์ด้วยช่วงการสุ่มตัวอย่างและความหน่วงเวลาในการรายงานสูงสุดโดยใช้ฟังก์ชัน batch()

ต้องกำหนดค่าเซ็นเซอร์ใหม่ได้ทุกเมื่อโดยใช้ batch() โดยไม่ทำให้ข้อมูลเซ็นเซอร์สูญหาย

ระยะเวลาการสุ่มตัวอย่าง

ระยะเวลาการสุ่มตัวอย่างมีความหมายแตกต่างกันไปตามประเภทเซ็นเซอร์ที่ กําลังกําหนดค่า

  • ต่อเนื่อง: ระบบจะสร้างเหตุการณ์เซ็นเซอร์ในอัตราที่ต่อเนื่อง
  • เมื่อมีการเปลี่ยนแปลง: ระบบจะสร้างเหตุการณ์ไม่เร็วกว่าระยะเวลาการสุ่มตัวอย่าง และอาจ สร้างเหตุการณ์ในอัตราที่ช้ากว่าระยะเวลาการสุ่มตัวอย่างหากค่าที่วัด ไม่มีการเปลี่ยนแปลง
  • ครั้งเดียว: ระบบจะไม่สนใจระยะเวลาการสุ่มตัวอย่าง
  • พิเศษ: ดูรายละเอียดเพิ่มเติมได้ที่ ประเภทเซ็นเซอร์

ดูข้อมูลเกี่ยวกับการโต้ตอบระหว่างระยะเวลาการสุ่มตัวอย่างและโหมดการรายงานของเซ็นเซอร์ได้ที่โหมดการรายงาน

เวลาในการตอบสนองสูงสุดของการรายงาน

เวลาในการรายงานสูงสุดจะกำหนดเวลาสูงสุดเป็นหน่วยนาโนวินาทีที่เหตุการณ์สามารถล่าช้าและจัดเก็บไว้ใน FIFO ของฮาร์ดแวร์ก่อนที่จะเขียนไปยัง FMQ ของเหตุการณ์ผ่าน HAL ขณะที่ SoC ทำงานอยู่

ค่า 0 หมายความว่าต้องรายงานเหตุการณ์ทันทีที่วัดได้ ไม่ว่าจะข้าม FIFO ทั้งหมด หรือล้าง FIFO ทันทีที่มีเหตุการณ์จากเซ็นเซอร์อยู่ใน FIFO

ตัวอย่างเช่น มาตรความเร่งที่เปิดใช้งานที่ 50 Hz โดยมีเวลาในการตอบสนองสูงสุด ในการรายงาน เป็น 0 จะทริกเกอร์การขัดจังหวะ 50 ครั้งต่อวินาทีเมื่อ SoC ทำงาน

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

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

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

เปิดใช้งานเซ็นเซอร์

เฟรมเวิร์กจะเปิดและปิดใช้เซ็นเซอร์โดยใช้ฟังก์ชัน activate() ก่อนเปิดใช้งานเซ็นเซอร์ เฟรมเวิร์กต้องกำหนดค่าเซ็นเซอร์ก่อน โดยใช้ batch()

หลังจากปิดใช้งานเซ็นเซอร์แล้ว จะต้องไม่เขียนเหตุการณ์เซ็นเซอร์เพิ่มเติมจากเซ็นเซอร์นั้นลงใน FMQ ของเหตุการณ์

เซ็นเซอร์ชักโครก

หากกำหนดค่าเซ็นเซอร์ให้ประมวลผลข้อมูลเซ็นเซอร์เป็นกลุ่ม เฟรมเวิร์กจะบังคับให้flush()ล้างเหตุการณ์เซ็นเซอร์ที่ประมวลผลเป็นกลุ่มทันทีได้ ซึ่งจะทำให้ระบบเขียนเหตุการณ์เซ็นเซอร์แบบเป็นกลุ่มสำหรับแฮนเดิลเซ็นเซอร์ที่ระบุไปยัง FMQ ของเหตุการณ์ทันที HAL ของเซ็นเซอร์ต้องต่อท้ายเหตุการณ์การล้างข้อมูลเสร็จสมบูรณ์ ที่ท้ายเหตุการณ์ของเซ็นเซอร์ที่เขียนขึ้นอันเป็นผลมาจากการเรียกใช้ flush()

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

หากเซ็นเซอร์ที่ระบุไม่มี FIFO (บัฟเฟอร์ไม่ได้) หรือหาก FIFO ว่างเปล่าในเวลาที่เรียกใช้ flush() จะต้องยังคงสำเร็จและส่งเหตุการณ์การล้างข้อมูลเสร็จสมบูรณ์สำหรับเซ็นเซอร์นั้น การตั้งค่านี้มีผลกับเซ็นเซอร์ทั้งหมด ยกเว้นเซ็นเซอร์แบบครั้งเดียว

หากเรียกใช้ flush() สำหรับเซ็นเซอร์แบบครั้งเดียว flush() ต้องส่งคืน BAD_VALUE และไม่สร้างเหตุการณ์การล้างข้อมูลเสร็จสมบูรณ์

เขียนเหตุการณ์เซ็นเซอร์ไปยัง FMQ

HAL ของเซ็นเซอร์ใช้ FMQ ของเหตุการณ์เพื่อพุชเหตุการณ์เซ็นเซอร์ไปยังเฟรมเวิร์กเซ็นเซอร์ของ Android

Event FMQ เป็น FMQ ที่ซิงค์แล้ว ซึ่งหมายความว่าการพยายามเขียนเหตุการณ์เพิ่มเติมลงใน FMQ มากกว่าที่พื้นที่ว่างอนุญาตจะทำให้การเขียนล้มเหลว ในกรณีดังกล่าว HAL ควรพิจารณาว่าจะเขียนชุดเหตุการณ์ปัจจุบันเป็นกลุ่มเหตุการณ์ 2 กลุ่มที่เล็กลง หรือจะเขียนเหตุการณ์ทั้งหมดพร้อมกันเมื่อมีพื้นที่เพียงพอ

เมื่อ HAL ของเซ็นเซอร์เขียนเหตุการณ์เซ็นเซอร์ตามจำนวนที่ต้องการไปยัง FMQ ของเหตุการณ์แล้ว HAL ของเซ็นเซอร์ต้องแจ้งให้เฟรมเวิร์กทราบว่าเหตุการณ์พร้อมแล้วโดยการเขียนบิต EventQueueFlagBits::READ_AND_PROCESS ไปยังฟังก์ชัน EventFlag::wake ของ FMQ ของเหตุการณ์ คุณสร้าง EventFlag จาก Event FMQ ได้โดยใช้ EventFlag::createEventFlag และฟังก์ชัน getEventFlagWord() ของ Event FMQ

HAL ของ AIDL ของเซ็นเซอร์รองรับทั้ง write และ writeBlocking ใน FMQ ของเหตุการณ์ การติดตั้งใช้งานเริ่มต้นเป็นข้อมูลอ้างอิงสำหรับการใช้ write หากใช้ฟังก์ชัน writeBlocking ต้องตั้งค่าสถานะ readNotification เป็น EventQueueFlagBits::EVENTS_READ ซึ่งเฟรมเวิร์กจะตั้งค่าเมื่ออ่านเหตุการณ์จาก FMQ ของเหตุการณ์ ต้องตั้งค่าสถานะการแจ้งเตือนการเขียนเป็น EventQueueFlagBits::READ_AND_PROCESS ซึ่งจะแจ้งให้เฟรมเวิร์กทราบว่ามีการเขียนเหตุการณ์ ลงใน FMQ ของเหตุการณ์แล้ว

เหตุการณ์ WAKE_UP

WAKE_UP คือเหตุการณ์เซ็นเซอร์ที่ทําให้ Application Processor (AP) ตื่นขึ้นและจัดการเหตุการณ์ทันที เมื่อใดก็ตามที่มีการเขียนเหตุการณ์ WAKE_UP ลงใน FMQ ของเหตุการณ์ HAL ของเซ็นเซอร์ต้องรักษาการล็อกการปลุกเพื่อให้แน่ใจว่า ระบบจะตื่นอยู่จนกว่าเฟรมเวิร์กจะจัดการเหตุการณ์ได้ เมื่อได้รับเหตุการณ์ WAKE_UP เฟรมเวิร์กจะรักษา Wake Lock ของตัวเองเพื่อให้ HAL ของเซ็นเซอร์ปล่อย Wake Lock หากต้องการซิงค์เมื่อ HAL ของเซ็นเซอร์ ปล่อยการล็อกการปลุก ให้ใช้ FMQ ของการล็อกการปลุก

HAL ของเซ็นเซอร์ต้องอ่าน FMQ ของ Wake Lock เพื่อกำหนดจำนวนWAKE_UP เหตุการณ์ที่เฟรมเวิร์กจัดการ HAL ควรปล่อย Wake Lock สำหรับเหตุการณ์ WAKE_UP ก็ต่อเมื่อจำนวนเหตุการณ์ WAKE_UP ที่ไม่ได้จัดการทั้งหมดเป็น 0 หลังจากจัดการเหตุการณ์เซ็นเซอร์แล้ว เฟรมเวิร์กจะนับจํานวนเหตุการณ์ที่ทําเครื่องหมายเป็นWAKE_UPเหตุการณ์ และเขียนตัวเลขนี้กลับไปยัง FMQ ของ Wake Lock

เฟรมเวิร์กจะตั้งค่า WakeLockQueueFlagBits::DATA_WRITTEN write notification ใน FMQ ของ Wake Lock ทุกครั้งที่เขียนข้อมูลลงใน FMQ ของ Wake Lock

เซ็นเซอร์แบบไดนามิก

เซ็นเซอร์แบบไดนามิกคือเซ็นเซอร์ที่ไม่ได้เป็นส่วนหนึ่งของอุปกรณ์ แต่สามารถ ใช้เป็นอินพุตของอุปกรณ์ได้ เช่น เกมแพดที่มีตัวตรวจวัดความเร่ง

เมื่อเชื่อมต่อเซ็นเซอร์แบบไดนามิก จะต้องเรียกใช้ฟังก์ชัน onDynamicSensorConnected ใน ISensorsCallback จาก HAL ของเซ็นเซอร์ ซึ่งจะแจ้งให้เฟรมเวิร์กทราบถึงเซ็นเซอร์แบบไดนามิกใหม่ และอนุญาตให้ควบคุมเซ็นเซอร์ผ่านเฟรมเวิร์ก รวมถึงให้ไคลเอ็นต์ใช้เหตุการณ์ของเซ็นเซอร์ได้

ในทำนองเดียวกัน เมื่อยกเลิกการเชื่อมต่อเซ็นเซอร์แบบไดนามิก คุณต้องเรียกใช้ฟังก์ชัน onDynamicSensorDisconnected ใน ISensorsCallback เพื่อให้เฟรมเวิร์กนำเซ็นเซอร์ที่ใช้ไม่ได้อีกต่อไปออก

แชแนลโดยตรง

ช่องทางโดยตรงเป็นวิธีการทำงานที่เขียนเหตุการณ์เซ็นเซอร์ไปยังหน่วยความจำที่เฉพาะเจาะจงแทนที่จะเขียนไปยัง FMQ ของเหตุการณ์โดยข้ามเฟรมเวิร์กเซ็นเซอร์ของ Android ไคลเอ็นต์ที่ลงทะเบียนช่องทางโดยตรงต้องอ่านเหตุการณ์เซ็นเซอร์ จากหน่วยความจำที่ใช้สร้างช่องทางโดยตรง และจะไม่ รับเหตุการณ์เซ็นเซอร์ผ่านเฟรมเวิร์ก ฟังก์ชัน configDirectReport() จะคล้ายกับ batch() สำหรับการทำงานปกติและกำหนดค่าช่องรายงานโดยตรง

ฟังก์ชัน registerDirectChannel() และ unregisterDirectChannel() จะสร้าง หรือทำลายช่องทางใหม่โดยตรง

โหมดการทำงาน

setOperationMode()ฟังก์ชันช่วยให้เฟรมเวิร์กกำหนดค่าเซ็นเซอร์ได้ เพื่อให้เฟรมเวิร์กแทรกข้อมูลเซ็นเซอร์ลงในเซ็นเซอร์ได้ ซึ่งมีประโยชน์สำหรับการทดสอบ โดยเฉพาะอย่างยิ่งสำหรับอัลกอริทึมที่อยู่ใต้เฟรมเวิร์ก

โดยปกติแล้วจะใช้ฟังก์ชัน injectSensorData() เพื่อส่งพารามิเตอร์การทำงาน ไปยัง HAL ของเซ็นเซอร์ นอกจากนี้ยังใช้ฟังก์ชันนี้เพื่อแทรกเหตุการณ์เซ็นเซอร์ ลงในเซ็นเซอร์ที่เฉพาะเจาะจงได้ด้วย

การตรวจสอบความถูกต้อง

หากต้องการตรวจสอบการติดตั้ง HAL ของเซ็นเซอร์ ให้เรียกใช้การทดสอบ CTS และ VTS ของเซ็นเซอร์

การทดสอบ CTS

การทดสอบ CTS ของเซ็นเซอร์มีอยู่ทั้งในการทดสอบ CTS อัตโนมัติและแอป CTS Verifier ที่ต้องดำเนินการด้วยตนเอง

การทดสอบอัตโนมัติจะอยู่ใน cts/tests/sensor/src/android/hardware/cts การทดสอบเหล่านี้จะยืนยันฟังก์ชันการทำงานมาตรฐานของเซ็นเซอร์ เช่น การเปิดใช้งาน เซ็นเซอร์ การจัดกลุ่ม และอัตราเหตุการณ์ของเซ็นเซอร์

การทดสอบ CTS Verifier อยู่ใน cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors การทดสอบเหล่านี้ต้องมีการป้อนข้อมูลด้วยตนเองจากผู้ปฏิบัติงานทดสอบ และตรวจสอบว่าเซ็นเซอร์ รายงานค่าที่ถูกต้อง

การผ่านการทดสอบ CTS เป็นสิ่งสำคัญอย่างยิ่งในการตรวจสอบว่าอุปกรณ์ที่อยู่ระหว่างการทดสอบเป็นไปตาม ข้อกำหนด CDD ทั้งหมด

การทดสอบ VTS

การทดสอบ VTS สำหรับ AIDL HAL ของเซ็นเซอร์จะอยู่ใน hardware/interfaces/sensors/aidl/vts/ การทดสอบเหล่านี้ช่วยให้มั่นใจได้ว่ามีการใช้งาน HAL ของเซ็นเซอร์อย่างถูกต้อง และเป็นไปตามข้อกำหนดทั้งหมดภายใน ISensors.aidl และ ISensorsCallback.aidl อย่างเหมาะสม

เริ่มต้น HAL

ต้องรองรับฟังก์ชัน initialize() เพื่อสร้าง FMQ ระหว่างเฟรมเวิร์กกับ HAL

เปิดเผยเซ็นเซอร์ที่พร้อมใช้งาน

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

เขียนเหตุการณ์เซ็นเซอร์ไปยัง FMQ

ใน HAL ของ AIDL ของเซ็นเซอร์ HAL ของเซ็นเซอร์ต้องเขียนเหตุการณ์ของเซ็นเซอร์ไปยัง FMQ ของเหตุการณ์อย่างรวดเร็วทุกครั้งที่มีเหตุการณ์ของเซ็นเซอร์ แทนที่จะรอให้มีการเรียกใช้ poll() นอกจากนี้ HAL ยังมีหน้าที่เขียนบิตที่ถูกต้องไปยัง EventFlag เพื่อทําให้เกิดการอ่าน FMQ ภายในเฟรมเวิร์ก

เหตุการณ์ WAKE_UP

ใน Sensors HAL 1.0 นั้น HAL สามารถปล่อย Wake Lock สำหรับWAKE_UP เหตุการณ์ในการเรียกใช้ poll() ครั้งต่อๆ ไปหลังจากที่WAKE_UPโพสต์ไปยัง poll() เนื่องจากสิ่งนี้บ่งชี้ว่าเฟรมเวิร์กได้ประมวลผลเหตุการณ์เซ็นเซอร์ทั้งหมดแล้ว และได้รับ Wake Lock หากจำเป็น เนื่องจากใน HAL ของ AIDL เซ็นเซอร์ ระบบจะไม่แจ้ง HAL อีกต่อไปเมื่อเฟรมเวิร์กประมวลผลเหตุการณ์ที่เขียนลงใน FMQ ดังนั้น FMQ ของ Wake Lock จึงช่วยให้เฟรมเวิร์กสื่อสารกับ HAL ได้เมื่อจัดการเหตุการณ์ WAKE_UP แล้ว

ใน AIDL HAL ของเซ็นเซอร์ Wake Lock ที่ HAL ของเซ็นเซอร์รักษาความปลอดภัยไว้สำหรับเหตุการณ์ WAKE_UP ต้องขึ้นต้นด้วย SensorsHAL_WAKEUP

เซ็นเซอร์แบบไดนามิก

ระบบจะแสดงเซ็นเซอร์แบบไดนามิกโดยใช้ฟังก์ชัน poll() ใน Sensors HAL 1.0 HAL ของ AIDL ของเซ็นเซอร์กำหนดให้ต้องเรียกใช้ onDynamicSensorsConnected และ onDynamicSensorsDisconnected ใน ISensorsCallback ทุกครั้งที่การเชื่อมต่อเซ็นเซอร์แบบไดนามิกมีการเปลี่ยนแปลง โดยการเรียกกลับเหล่านี้จะพร้อมใช้งานเป็นส่วนหนึ่งของพอยน์เตอร์ ISensorsCallback ที่ระบุผ่านฟังก์ชัน initialize()

โหมดการทำงาน

ต้องรองรับDATA_INJECTIONโหมดสำหรับเซ็นเซอร์ WAKE_UP

การรองรับ HAL หลายรายการ

HAL ของ AIDL ของเซ็นเซอร์รองรับ Multi-HAL โดยใช้ เฟรมเวิร์ก Multi-HAL ของเซ็นเซอร์ ดูรายละเอียดการใช้งานได้ที่การพอร์ตจาก HAL 2.1 ของเซ็นเซอร์