เซนเซอร์ HAL 2.0

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

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

เซ็นเซอร์ HAL 2.1 พร้อมใช้งานใน Android 11 ขึ้นไปสำหรับอุปกรณ์ใหม่และที่อัปเกรด เซ็นเซอร์ HAL 2.1 เป็นการทำซ้ำของเซ็นเซอร์ 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

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

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

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

เริ่มต้น HAL

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

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

ฟังก์ชัน 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 ไม่สามารถตอบสนองสัญญา Android API ได้อีกต่อไป ซึ่งเซ็นเซอร์แบบคงที่ (ไม่ใช่ไดนามิก) จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของแอป นอกจากนี้ยังอาจป้องกันไม่ให้เฟรมเวิร์กสร้างคำขอเซ็นเซอร์ที่ใช้งานอยู่ที่สร้างโดยแอปอีกครั้ง ดังนั้น ผู้จำหน่าย HAL จึงควรป้องกันการเปลี่ยนแปลงรายการเซ็นเซอร์ที่สามารถหลีกเลี่ยงได้

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

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

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

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

เซ็นเซอร์จะต้องสามารถกำหนดค่าใหม่ได้ตลอดเวลาโดยใช้ batch() โดยไม่สูญเสียข้อมูลเซ็นเซอร์

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

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

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

หากต้องการเรียนรู้เกี่ยวกับปฏิสัมพันธ์ระหว่างช่วงเวลาสุ่มตัวอย่างและโหมดการรายงานของเซ็นเซอร์ โปรดดู โหมดการรายงาน

เวลาแฝงในการรายงานสูงสุด

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

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

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

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

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

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

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

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

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

เซ็นเซอร์ฟลัช

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

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

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

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

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

เหตุการณ์ FMQ ถูกใช้โดยเซ็นเซอร์ HAL เพื่อผลักดันเหตุการณ์เซ็นเซอร์เข้าสู่เฟรมเวิร์กเซ็นเซอร์ Android

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

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

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

กิจกรรม WAKE_UP

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

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

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

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

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

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

ในทำนองเดียวกัน เมื่อตัดการเชื่อมต่อเซ็นเซอร์แบบไดนามิก จะต้องเรียกใช้ฟังก์ชัน onDynamicSensorDisconnected ใน ISensorsCallback เพื่อให้เฟรมเวิร์กสามารถลบเซ็นเซอร์ใดๆ ที่ไม่มีอยู่อีกต่อไปได้

ช่องทางตรง

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

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

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

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

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

การตรวจสอบ

หากต้องการตรวจสอบการใช้งานเซ็นเซอร์ HAL ของคุณ ให้ทำการทดสอบ CTS และ VTS ของเซ็นเซอร์

การทดสอบซีทีเอส

การทดสอบเซ็นเซอร์ 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 สำหรับเซ็นเซอร์ HAL 2.0 อยู่ใน hardware/interfaces/sensors/2.0/vts การทดสอบ VTS สำหรับเซ็นเซอร์ 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 ก่อนหน้า ดังนั้น 2.1 HAL จึงต้องรองรับการเริ่มต้นเป็น 2.0 HAL เพื่อหลีกเลี่ยงความซับซ้อนในการรองรับ HAL ทั้งสองเวอร์ชัน ขอแนะนำให้ใช้ Multi-HAL 2.1

สำหรับตัวอย่างวิธีใช้งาน Sensors 2.1 HAL ของคุณเอง โปรดดู Sensors.h

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

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

เริ่มต้น HAL

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

เปิดเผยเซ็นเซอร์ที่มีอยู่

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

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

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

กิจกรรม WAKE_UP

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

ในเซ็นเซอร์ HAL 2.0 การล็อคปลุกที่ปลอดภัยโดยเซ็นเซอร์ HAL สำหรับเหตุการณ์ WAKE_UP จะต้องเริ่มต้นด้วย SensorsHAL_WAKEUP

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

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

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

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

รองรับหลาย HAL

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