Sensors HAL 2.0

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

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

Sensors 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

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

ใช้ Sensors HAL 2.0 และ HAL 2.1

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

เริ่มต้น HAL

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

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

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

แสดงเซ็นเซอร์ที่ใช้ได้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

เขียนเหตุการณ์เซ็นเซอร์ลงใน FMQ

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

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

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

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

เหตุการณ์ WAKE_UP

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

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

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

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

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

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

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

แชแนลโดยตรง

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

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

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

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

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

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

หากต้องการตรวจสอบการติดตั้งใช้งาน Sensors 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 การทดสอบเหล่านี้ช่วยให้มั่นใจได้ว่ามีการใช้ Sensors HAL อย่างถูกต้องและเป็นไปตามข้อกำหนดทั้งหมดใน ISensors.hal และ ISensorsCallback.hal

อัปเกรดจาก Sensors HAL 2.0 เป็น 2.1

เมื่ออัปเกรดจาก Sensors HAL 2.0 เป็น 2.1 การใช้งาน 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 เวอร์ชัน

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

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

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

เริ่มต้น HAL

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

แสดงเซ็นเซอร์ที่ใช้ได้

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

เขียนเหตุการณ์เซ็นเซอร์ลงใน FMQ

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

เหตุการณ์ WAKE_UP

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

ใน Sensors HAL 2.0 ล็อกการปลุกที่ปลอดภัยโดย Sensors HAL สำหรับWAKE_UP เหตุการณ์ต้องขึ้นต้นด้วย SensorsHAL_WAKEUP

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

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

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

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

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

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