Hardware Abstraction Layer (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 รายการให้กับ Sensors HAL ได้แก่ ตัวอธิบาย FMQ 2 รายการและตัวชี้ 1 รายการไปยังออบเจ็กต์ ISensorsCallback
HAL ใช้ตัวอธิบายแรกเพื่อสร้าง Event FMQ ที่ใช้เขียนเหตุการณ์เซ็นเซอร์
ไปยังเฟรมเวิร์ก HAL ใช้ตัวอธิบายที่ 2 เพื่อสร้าง FMQ ของ Wake
Lock ที่ใช้ในการซิงค์เมื่อ HAL ปลดล็อกการปลุกสำหรับ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 ไม่สามารถปฏิบัติตามสัญญา API ของ Android ได้อีกต่อไป ซึ่งระบุว่าเซ็นเซอร์แบบคงที่ (ไม่ใช่แบบไดนามิก) จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของแอป การดำเนินการนี้อาจทำให้เฟรมเวิร์กไม่สามารถสร้างคำขอเซ็นเซอร์ที่ใช้งานอยู่ซึ่งแอปส่งมาได้อีกด้วย ดังนั้น เราขอแนะนำให้ผู้ให้บริการ HAL
หลีกเลี่ยงการเปลี่ยนแปลงรายการเซ็นเซอร์ที่ไม่จำเป็น
HAL ต้องจับคู่เซ็นเซอร์จริงในอุปกรณ์กับแฮนเดิลของเซ็นเซอร์อย่างแน่นอนเพื่อให้มั่นใจว่าแฮนเดิลของเซ็นเซอร์จะเสถียร แม้ว่าอินเทอร์เฟซ HAL ของเซ็นเซอร์จะไม่ได้กำหนดการติดตั้งใช้งานที่เฉพาะเจาะจง แต่นักพัฒนาแอปก็มีตัวเลือกมากมาย ในการปฏิบัติตามข้อกำหนดนี้
ตัวอย่างเช่น คุณสามารถจัดเรียงรายการเซ็นเซอร์ได้โดยใช้ชุดค่าผสมของแอตทริบิวต์คงที่ของเซ็นเซอร์แต่ละรายการ เช่น ผู้จำหน่าย รุ่น และประเภทเซ็นเซอร์ อีกตัวเลือกหนึ่งขึ้นอยู่กับข้อเท็จจริงที่ว่าชุดเซ็นเซอร์แบบคงที่ของอุปกรณ์ได้รับการแก้ไขในฮาร์ดแวร์ ดังนั้น HAL จึงต้องทราบเมื่อเซ็นเซอร์ที่คาดไว้ทั้งหมดเริ่มต้นเสร็จสมบูรณ์ก่อนที่จะกลับจาก getSensorsList()
หรือ getSensorsList_2_1()
รายการเซ็นเซอร์ที่คาดไว้นี้สามารถคอมไพล์เป็นไบนารี 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 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_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 2.0 และฟังก์ชัน injectSensorsData_2_1()
ใน HAL 2.0 จะใช้เพื่อส่งพารามิเตอร์การทำงานไปยัง
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 การล็อกการปลุกที่ Sensors HAL รักษาความปลอดภัยไว้สำหรับเหตุการณ์ WAKE_UP
ต้องเริ่มต้นด้วย SensorsHAL_WAKEUP
เซ็นเซอร์แบบไดนามิก
ระบบจะแสดงเซ็นเซอร์แบบไดนามิกโดยใช้ฟังก์ชัน poll()
ใน Sensors HAL 1.0
HAL 2.0 ของเซ็นเซอร์กำหนดให้เรียกใช้ onDynamicSensorsConnected
และ
onDynamicSensorsDisconnected
ใน ISensorsCallback
ทุกครั้งที่การเชื่อมต่อเซ็นเซอร์แบบไดนามิกมีการเปลี่ยนแปลง โดยการเรียกกลับเหล่านี้จะพร้อมใช้งานเป็นส่วนหนึ่งของพอยน์เตอร์ ISensorsCallback
ที่ระบุผ่านฟังก์ชัน initialize()
โหมดการทำงาน
ต้องรองรับDATA_INJECTION
โหมดสำหรับเซ็นเซอร์WAKE_UP
ใน Sensors HAL
2.0
การรองรับ HAL หลายรายการ
HAL 2.0 และ 2.1 ของเซ็นเซอร์รองรับ Multi-HAL โดยใช้เฟรมเวิร์ก Multi-HAL ของเซ็นเซอร์ ดูรายละเอียดการ ติดตั้งใช้งานได้ที่ การพอร์ตจาก HAL 1.0 ของเซ็นเซอร์