เซ็นเซอร์ 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 ใช้ข้อบ่งชี้แรกเพื่อสร้าง Event FMQ ที่ใช้เขียนเหตุการณ์เซ็นเซอร์ไปยังเฟรมเวิร์ก HAL จะใช้ตัวบ่งชี้ที่ 2 เพื่อสร้าง Wake Lock FMQ ที่ใช้เพื่อซิงค์ข้อมูลเมื่อ 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)

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

หลังจากการรีสตาร์ท 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 ของเหตุการณ์

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

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

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

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

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

แชแนลโดยตรง

ช่องทางโดยตรงเป็นวิธีการทํางานที่ระบบจะเขียนเหตุการณ์เซ็นเซอร์ไปยังหน่วยความจําที่เฉพาะเจาะจงแทนที่จะเขียนไปยัง FMQ ของเหตุการณ์โดยข้ามเฟรมเวิร์กเซ็นเซอร์ Android ไคลเอ็นต์ที่ลงทะเบียนช่องทางโดยตรงต้องอ่านเหตุการณ์ของเซ็นเซอร์จากหน่วยความจําที่ใช้สร้างช่องทางโดยตรงโดยตรง และจะไม่รับเหตุการณ์ของเซ็นเซอร์ผ่านเฟรมเวิร์ก ฟังก์ชัน 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 เวอร์ชัน

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

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

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

เหตุการณ์ WAKE_UP

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

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

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

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

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

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

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

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