Sensors HAL 2.0

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

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

HAL 2.1 ของเซ็นเซอร์พร้อมใช้งานใน Android 11 ขึ้นไป สำหรับอุปกรณ์ใหม่และอุปกรณ์ที่อัปเกรดแล้ว Sensors HAL 2.1 เป็นการทำซ้ำของ Sensors HAL 2.0 ที่แสดงประเภทเซ็นเซอร์ HINGE_ANGLE และอัปเดตวิธีการต่างๆ เพื่อยอมรับประเภท HINGE_ANGLE

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

แหล่งข้อมูลหลักสำหรับ Sensors HAL 2.1 อยู่ในคำจำกัดความ HAL ที่ hardware/interfaces/sensors/2.1/ISensors.hal หากข้อกำหนดในหน้านี้ขัดแย้งกับข้อกำหนดใน ISensors.hal ให้ใช้ข้อกำหนดใน ISensors.hal

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

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

ใช้ HAL 2.0 และ HAL 2.1 ของเซ็นเซอร์

หากต้องการใช้ HAL 2.0 หรือ 2.1 ของเซ็นเซอร์ ออบเจ็กต์ต้องขยายISensors อินเทอร์เฟซและใช้ฟังก์ชันทั้งหมดที่กำหนดไว้ใน 2.0/ISensors.hal หรือ 2.1/ISensors.hal

เริ่มต้น HAL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Event FMQ ใช้โดย HAL ของเซ็นเซอร์เพื่อพุชเหตุการณ์เซ็นเซอร์ไปยังเฟรมเวิร์กเซ็นเซอร์ของ 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 2.0/2.1 ของเซ็นเซอร์รองรับทั้ง 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 Lock เพื่อให้มั่นใจว่า ระบบจะยังคงทำงานอยู่จนกว่าเฟรมเวิร์กจะจัดการเหตุการณ์ได้ เมื่อได้รับเหตุการณ์ WAKE_UP เฟรมเวิร์กจะรักษา Wake Lock ของตัวเองเพื่อให้ Sensors HAL ปล่อย Wake Lock หากต้องการซิงค์เมื่อ HAL ของเซ็นเซอร์ปล่อย Wake Lock ให้ใช้ Wake Lock 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 Sensors Framework ไคลเอ็นต์ที่ลงทะเบียนช่องทางโดยตรงต้องอ่านเหตุการณ์เซ็นเซอร์ จากหน่วยความจำที่ใช้สร้างช่องทางโดยตรง และจะไม่ รับเหตุการณ์เซ็นเซอร์ผ่านเฟรมเวิร์ก ฟังก์ชัน configDirectReport() จะคล้ายกับ batch() สำหรับการทำงานปกติและกำหนดค่าช่องรายงานโดยตรง

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

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

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

โดยปกติแล้ว ฟังก์ชัน injectSensorData() ใน HAL 2.0 และฟังก์ชัน injectSensorsData_2_1() ใน HAL 2.0 จะใช้เพื่อส่งพารามิเตอร์การทำงานไปยัง Sensors 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 สำหรับ Sensors HAL 2.0 อยู่ใน hardware/interfaces/sensors/2.0/vts การทดสอบ VTS สำหรับ Sensors HAL 2.1 จะอยู่ใน hardware/interfaces/sensors/2.1/vts การทดสอบเหล่านี้ช่วยให้มั่นใจได้ว่ามีการใช้งาน HAL ของเซ็นเซอร์อย่างเหมาะสม และเป็นไปตามข้อกำหนดทั้งหมดภายใน ISensors.hal และ ISensorsCallback.hal อย่างถูกต้อง

อัปเกรดเป็น HAL 2.1 ของเซ็นเซอร์จาก 2.0

เมื่ออัปเกรดเป็น Sensors HAL 2.1 จาก 2.0 การติดตั้งใช้งาน HAL ต้องมีเมธอด initialize_2_1(), getSensorsList_2_1() และ injectSensorsData_2_1() พร้อมกับประเภท HAL 2.1 วิธีการเหล่านี้ต้องเป็นไปตาม ข้อกำหนดเดียวกันที่ระบุไว้สำหรับ HAL 2.0 ด้านบน

เนื่องจาก HAL เวอร์ชันย่อยต้องรองรับฟังก์ชันทั้งหมดจาก HAL ก่อนหน้า HAL 2.1 จึงต้องรองรับการเริ่มต้นเป็น HAL 2.0 ขอแนะนำอย่างยิ่งให้ใช้ Multi-HAL 2.1 เพื่อหลีกเลี่ยงความซับซ้อนในการรองรับ HAL ทั้ง 2 เวอร์ชัน

ดูตัวอย่างวิธีติดตั้งใช้งาน HAL ของเซ็นเซอร์ 2.1 ของคุณเองได้ที่ Sensors.h

อัปเกรดเป็น HAL 2.0 ของเซ็นเซอร์จาก 1.0

เมื่ออัปเกรดเป็น HAL 2.0 ของเซ็นเซอร์จาก 1.0 โปรดตรวจสอบว่าการใช้งาน HAL เป็นไปตามข้อกำหนดต่อไปนี้

เริ่มต้น HAL

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

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

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

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

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

เหตุการณ์ WAKE_UP

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

ใน Sensors HAL 2.0 Wake Lock ที่ Sensors HAL รักษาไว้สำหรับเหตุการณ์ WAKE_UP ต้องเริ่มต้นด้วย SensorsHAL_WAKEUP

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

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

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

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

การรองรับ Multi-HAL

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