सेंसर हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल), Android सेंसर फ़्रेमवर्क और डिवाइस के सेंसर, जैसे कि एक्सलरोमीटर या जाइरोस्कोप के बीच का इंटरफ़ेस होता है. Sensors HAL उन फ़ंक्शन के बारे में बताता है जिन्हें लागू करना ज़रूरी है, ताकि फ़्रेमवर्क से सेंसर को कंट्रोल किया जा सके.
नए और अपग्रेड किए गए डिवाइसों के लिए, Sensors AIDL HAL, Android 13 और उसके बाद के वर्शन में उपलब्ध है. Sensors AIDL HAL, Sensors HAL 2.1 पर आधारित है. यह AIDL HAL इंटरफ़ेस का इस्तेमाल करता है और हेड ट्रैकर और सीमित ऐक्सिस वाले IMU सेंसर टाइप को दिखाता है.
एआईडीएल HAL इंटरफ़ेस
Sensors AIDL HAL के दस्तावेज़ का मुख्य सोर्स, hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl में HAL की परिभाषा में मौजूद है.
सेंसर एआईडीएल एचएएल लागू करें
सेंसर AIDL HAL को लागू करने के लिए, किसी ऑब्जेक्ट को ISensors
इंटरफ़ेस को बढ़ाना होगा और hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl में बताए गए सभी फ़ंक्शन लागू करने होंगे.
HAL को शुरू करना
सेंसर एचएएल का इस्तेमाल करने से पहले, उसे Android सेंसर फ़्रेमवर्क की मदद से शुरू करना ज़रूरी है. फ़्रेमवर्क, Sensors HAL को तीन पैरामीटर देने के लिए initialize()
फ़ंक्शन को कॉल करता है: दो एफ़एमक्यू डिस्क्रिप्टर और ISensorsCallback
ऑब्जेक्ट का एक पॉइंटर.
एचएएल, पहले डिस्क्रिप्टर का इस्तेमाल करके इवेंट एफ़एमक्यू बनाता है. इसका इस्तेमाल, फ़्रेमवर्क में सेंसर इवेंट लिखने के लिए किया जाता है. एचएएल, दूसरे डिस्क्रिप्टर का इस्तेमाल करके, वॉकी-लॉक एफएमक्यू बनाता है. इसका इस्तेमाल, WAKE_UP
सेंसर इवेंट के लिए एचएएल के वॉकी-लॉक को रिलीज़ करने पर सिंक करने के लिए किया जाता है. एचएएल को ISensorsCallback
ऑब्जेक्ट का पॉइंटर सेव करना होगा, ताकि ज़रूरी कॉलबैक फ़ंक्शन को कॉल किया जा सके.
Sensors HAL को शुरू करते समय, initialize()
फ़ंक्शन को पहले फ़ंक्शन के तौर पर कॉल किया जाना चाहिए.
उपलब्ध सेंसर दिखाना
डिवाइस में मौजूद सभी स्टैटिक सेंसर की सूची पाने के लिए, getSensorsList()
फ़ंक्शन का इस्तेमाल करें. यह फ़ंक्शन सेंसर की सूची दिखाता है. हर सेंसर को उसके हैंडल से अलग पहचाना जाता है. जब Sensors HAL को होस्ट करने वाली प्रोसेस फिर से शुरू हो, तो किसी सेंसर का हैंडल नहीं बदलना चाहिए. डिवाइस के रीबूट होने और सिस्टम सर्वर के रीस्टार्ट होने पर, हैंडल बदल सकते हैं.
अगर कई सेंसर एक ही सेंसर टाइप और वेक-अप प्रॉपर्टी शेयर करते हैं, तो सूची में पहले सेंसर को डिफ़ॉल्ट सेंसर कहा जाता है. साथ ही, इसे उन ऐप्लिकेशन को दिखाया जाता है जो getDefaultSensor(int sensorType, bool wakeUp)
फ़ंक्शन का इस्तेमाल करते हैं.
सेंसर की सूची में बदलाव न होना
सेंसर एचएएल के रीस्टार्ट होने के बाद, अगर getSensorsList()
से मिले डेटा में, रीस्टार्ट होने से पहले मिली सेंसर सूची की तुलना में कोई अहम बदलाव दिखता है, तो फ़्रेमवर्क Android रनटाइम को रीस्टार्ट करता है. सेंसर की सूची में हुए अहम बदलावों में, ऐसे मामले शामिल हैं जहां किसी हैंडल वाले सेंसर की जानकारी मौजूद नहीं है या उसके एट्रिब्यूट बदल गए हैं. इसके अलावा, इसमें ऐसे मामले भी शामिल हैं जहां नए सेंसर जोड़े गए हैं. हालांकि, Android रनटाइम को रीस्टार्ट करने से उपयोगकर्ता को परेशानी होती है, लेकिन यह ज़रूरी है. ऐसा इसलिए ज़रूरी है, क्योंकि Android फ़्रेमवर्क, Android API के उस अनुबंध को पूरा नहीं कर सकता जिसमें किसी ऐप्लिकेशन के चालू रहने के दौरान स्टैटिक (नॉनडाइनैमिक) सेंसर नहीं बदलते. इसकी वजह से, हो सकता है कि ऐप्लिकेशन की ओर से किए गए ऐक्टिव सेंसर वाले अनुरोधों को फिर से इंस्टॉल न किया जा सके. इसलिए, एचएएल के वेंडर को सलाह दी जाती है कि वे सेंसर की सूची में ऐसे बदलाव न करें जो ज़रूरी न हों.
यह पक्का करने के लिए कि सेंसर ठीक से हैंडल करें, एचएएल को डिवाइस में दिए गए फ़िज़िकल सेंसर को तय तरीके से मैप करना होगा. हालांकि, सेंसर एचएएल इंटरफ़ेस के लिए कोई खास तरीका लागू करना ज़रूरी नहीं है. इन शर्तों को पूरा करने के लिए, डेवलपर के पास कई विकल्प होते हैं.
उदाहरण के लिए, सेंसर की सूची को हर सेंसर के तय एट्रिब्यूट के कॉम्बिनेशन का इस्तेमाल करके क्रम से लगाया जा सकता है. जैसे, वेंडर, मॉडल, और सेंसर टाइप. एक और विकल्प इस बात पर निर्भर करता है कि डिवाइस के स्टैटिक सेंसर का सेट, हार्डवेयर में तय होता है. इसलिए, getSensorsList()
से वापस आने से पहले, एचएएल को यह पता होना चाहिए कि सभी सेंसर के शुरू होने की प्रोसेस पूरी हो गई है या नहीं. काम करने वाले सेंसर की इस सूची को एचएएल बाइनरी में कंपाइल किया जा सकता है या फ़ाइल सिस्टम में कॉन्फ़िगरेशन फ़ाइल में सेव किया जा सकता है. साथ ही, दिखने के क्रम का इस्तेमाल, स्थिर हैंडल पाने के लिए किया जा सकता है. सबसे अच्छा समाधान, आपके एचएएल के लागू करने से जुड़ी खास जानकारी पर निर्भर करता है. हालांकि, मुख्य ज़रूरत यह है कि एचएएल के रीस्टार्ट होने पर, सेंसर हैंडल में बदलाव न हो.
सेंसर कॉन्फ़िगर करना
किसी सेंसर को चालू करने से पहले, उसे batch()
फ़ंक्शन का इस्तेमाल करके, सैंपलिंग पीरियड और रिपोर्टिंग में लगने वाले ज़्यादा से ज़्यादा समय के साथ कॉन्फ़िगर करना होगा.
सेंसर के डेटा को खोए बिना, batch()
का इस्तेमाल करके किसी भी समय सेंसर को फिर से कॉन्फ़िगर किया जा सकता है.
सैंपलिंग की अवधि
कॉन्फ़िगर किए जा रहे सेंसर के टाइप के आधार पर, सैंपलिंग पीरियड का मतलब अलग-अलग होता है:
- लगातार: सेंसर इवेंट लगातार जनरेट होते रहते हैं.
- बदलाव होने पर: इवेंट, सैंपलिंग की अवधि से ज़्यादा तेज़ी से जनरेट नहीं होते हैं. अगर मेज़र की गई वैल्यू में बदलाव नहीं होता है, तो इन इवेंट को सैंपलिंग की अवधि से धीमी दर पर जनरेट किया जा सकता है.
- वन-शॉट: सैंपलिंग की अवधि को अनदेखा कर दिया जाता है.
- खास: ज़्यादा जानकारी के लिए, सेंसर के टाइप देखें.
सैंपलिंग पीरियड और सेंसर के रिपोर्टिंग मोड के बीच के इंटरैक्शन के बारे में जानने के लिए, रिपोर्टिंग मोड देखें.
रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय
रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय, नैनोसेकंड में तय करता है कि इवेंट को SoC के चालू होने पर, एचएएल के ज़रिए इवेंट एफ़एमक्यू में लिखे जाने से पहले, हार्डवेयर एफ़आईओ में कितनी देरी से सेव किया जा सकता है.
शून्य की वैल्यू का मतलब है कि इवेंट को मेज़र करने के तुरंत बाद, उनकी रिपोर्ट की जानी चाहिए. इसके लिए, FIFO को पूरी तरह से स्किप किया जा सकता है या सेंसर से एक इवेंट के FIFO में मौजूद होने पर, FIFO को खाली किया जा सकता है.
उदाहरण के लिए, अगर सोसी चालू होने पर, 50 Hz पर चालू किया गया ऐक्सीलेरोमीटर, ज़्यादा से ज़्यादा रिपोर्टिंग में लगने वाले समय के तौर पर शून्य ट्रिगर करता है, तो हर सेकंड में 50 बार रुकावट आती है.
अगर रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय शून्य से ज़्यादा है, तो सेंसर इवेंट का पता चलने के तुरंत बाद उन्हें रिपोर्ट करने की ज़रूरत नहीं होती. इवेंट को कुछ समय के लिए, हार्डवेयर FIFO में सेव किया जा सकता है और एक साथ कई इवेंट की रिपोर्ट की जा सकती है. हालांकि, ऐसा तब तक ही किया जा सकता है, जब तक किसी भी इवेंट को रिपोर्ट करने में लगने वाला समय, रिपोर्टिंग में लगने वाले ज़्यादा से ज़्यादा समय से ज़्यादा न हो. पिछले बैच के बाद से सभी इवेंट रिकॉर्ड किए जाते हैं और एक साथ दिखाए जाते हैं. इससे, SoC को भेजी जाने वाली रुकावटों की संख्या कम हो जाती है. साथ ही, सेंसर डेटा को कैप्चर और बैच करने के दौरान, SoC को कम पावर मोड पर स्विच कर पाता है.
हर इवेंट का एक टाइमस्टैंप होता है. इवेंट की रिपोर्ट में समय बदलने से, इवेंट के टाइमस्टैंप पर असर नहीं पड़ना चाहिए. टाइमस्टैंप सटीक होना चाहिए और वह उस समय से मेल खाना चाहिए जब इवेंट हुआ था, न कि उस समय से जब उसकी शिकायत की गई थी.
सेंसर इवेंट की रिपोर्टिंग के लिए, ज़्यादा जानकारी और ज़रूरी शर्तें पाने के लिए, बैच में भेजना देखें.
सेंसर चालू करना
फ़्रेमवर्क, activate()
फ़ंक्शन का इस्तेमाल करके सेंसर को चालू और बंद करता है.
सेंसर को चालू करने से पहले, फ़्रेमवर्क को पहले batch()
का इस्तेमाल करके, सेंसर को कॉन्फ़िगर करना होगा.
किसी सेंसर को बंद करने के बाद, उस सेंसर से मिलने वाले अन्य सेंसर इवेंट को इवेंट एफ़एमक्यू में नहीं लिखा जाना चाहिए.
सेंसर फ़्लश करें
अगर किसी सेंसर को सेंसर डेटा को बैच में भेजने के लिए कॉन्फ़िगर किया गया है, तो फ़्रेमवर्क flush()
को कॉल करके, बैच में भेजे गए सेंसर इवेंट को तुरंत फ़्लश कर सकता है. इससे, चुने गए सेंसर हैंडल के लिए, एक साथ भेजे गए सेंसर इवेंट, इवेंट एफएमक्यू में तुरंत लिखे जाते हैं. सेंसर HAL को flush()
को कॉल करने के नतीजे के तौर पर लिखे गए सेंसर इवेंट के आखिर में, फ़्लश पूरा होने का इवेंट जोड़ना होगा.
फ़्लश एसिंक्रोनस रूप से होता है (यानी, यह फ़ंक्शन तुरंत लौटना चाहिए). अगर लागू करने के लिए, कई सेंसर के लिए एक फ़्लो इन फ़्लो आउट (FIFO) का इस्तेमाल किया जाता है, तो उस FIFO को फ़्लश किया जाता है और फ़्लश पूरा होने का इवेंट सिर्फ़ तय किए गए सेंसर के लिए जोड़ा जाता है.
अगर चुने गए सेंसर में कोई FIFO नहीं है (बफ़रिंग नहीं की जा सकती) या कॉल के समय FIFO खाली था, तो भी flush()
को काम करना चाहिए और उस सेंसर के लिए 'फ़्लश पूरा हो गया' इवेंट भेजना चाहिए. यह एक बार में डेटा इकट्ठा करने वाले सेंसर के अलावा, सभी सेंसर पर लागू होता है.
अगर flush()
को एक बार में काम करने वाले सेंसर के लिए कॉल किया जाता है, तो flush()
को BAD_VALUE
दिखाना चाहिए और फ़्लश पूरा होने का इवेंट जनरेट नहीं करना चाहिए.
एफ़एमक्यू पर सेंसर इवेंट लिखो
Android सेंसर फ़्रेमवर्क में सेंसर इवेंट को पुश करने के लिए, सेंसर एचएएल इवेंट एफ़एमक्यू का इस्तेमाल करता है.
इवेंट एफ़एमक्यू, सिंक किया गया एफ़एमक्यू होता है. इसका मतलब है कि उपलब्ध जगह से ज़्यादा इवेंट को एफ़एमक्यू में लिखने की कोशिश करने पर, लिखने की प्रोसेस पूरी नहीं हो पाती. ऐसे मामले में, एचएएल को यह तय करना चाहिए कि इवेंट के मौजूदा सेट को इवेंट के दो छोटे ग्रुप के तौर पर लिखना है या ज़रूरत के हिसाब से जगह होने पर सभी इवेंट को एक साथ लिखना है.
जब सेंसर एचएएल ने इवेंट एफ़एमक्यू में ज़रूरत के मुताबिक सेंसर इवेंट लिख दिए हैं, तो सेंसर एचएएल को फ़्रेमवर्क को सूचना देनी चाहिए कि इवेंट तैयार हैं. इसके लिए, इवेंट एफ़एमक्यू के EventFlag::wake
फ़ंक्शन में EventQueueFlagBits::READ_AND_PROCESS
बिट लिखना होगा. EventFlag को Event FMQ से बनाया जा सकता है. इसके लिए, EventFlag::createEventFlag
और Event FMQ के getEventFlagWord()
फ़ंक्शन का इस्तेमाल करें.
Sensors AIDL HAL, इवेंट एफ़एमक्यू पर write
और writeBlocking
, दोनों के साथ काम करता है.
डिफ़ॉल्ट तौर पर लागू होने वाले तरीके से, write
के इस्तेमाल के लिए रेफ़रंस मिलता है. अगर writeBlocking
फ़ंक्शन का इस्तेमाल किया जाता है, तो readNotification
फ़्लैग को EventQueueFlagBits::EVENTS_READ
पर सेट करना होगा. यह फ़्लैग, फ़्रेमवर्क तब सेट करता है, जब वह इवेंट एफ़एमक्यू से इवेंट पढ़ता है. सूचना लिखने के लिए इस्तेमाल होने वाले फ़्लैग को EventQueueFlagBits::READ_AND_PROCESS
पर सेट करना ज़रूरी है. इससे उस फ़्रेमवर्क को सूचना मिलती है कि इवेंट एफ़एमक्यू पर इवेंट लिखे गए हैं.
WAKE_UP इवेंट
WAKE_UP
इवेंट, सेंसर इवेंट होते हैं. इनकी वजह से ऐप्लिकेशन प्रोसेसर (एपी) तुरंत चालू हो जाता है और इवेंट को मैनेज करता है. जब भी इवेंट एफ़एमक्यू में कोई WAKE_UP
इवेंट लिखा जाता है, तो सेंसर एचएएल को वेक लॉक सुरक्षित करना होगा. इससे यह पक्का होता है कि फ़्रेमवर्क इवेंट को हैंडल करने तक सिस्टम चालू रहे. WAKE_UP
इवेंट मिलने पर, फ़्रेमवर्क अपना वेक लॉक सुरक्षित करता है. इससे सेंसर एचएएल को अपना वेक लॉक हटाने की अनुमति मिल जाती है. जब सेंसर HAL अपना वेक लॉक रिलीज़ करता है, तब सिंक करने के लिए वेक लॉक FMQ का इस्तेमाल करें.
Sensors HAL को वेक लॉक एफ़एमक्यू को पढ़ना होगा, ताकि यह पता लगाया जा सके कि फ़्रेमवर्क ने WAKE_UP
इवेंट की कितनी संख्या को मैनेज किया है. एचएएल को WAKE_UP
इवेंट के लिए अपना वेक लॉक सिर्फ़ तब हटाना चाहिए, जब मैनेज नहीं किए गए WAKE_UP
इवेंट की कुल संख्या शून्य हो.
सेंसर इवेंट को हैंडल करने के बाद, फ़्रेमवर्क उन इवेंट की संख्या की गिनती करता है जिन्हें WAKE_UP
इवेंट के तौर पर मार्क किया गया है. साथ ही, इस संख्या को वेक लॉक एफ़एमक्यू पर वापस भेजता है.
यह फ़्रेमवर्क, जब भी वेक लॉक एफ़एमक्यू पर डेटा लिखता है, तो यह फ़्रेमवर्क वेक लॉक एफ़एमक्यू पर WakeLockQueueFlagBits::DATA_WRITTEN
लिखने की सूचना सेट करता है.
डाइनैमिक सेंसर
डाइनैमिक सेंसर, ऐसे सेंसर होते हैं जो डिवाइस का हिस्सा नहीं होते. हालांकि, इनका इस्तेमाल डिवाइस के इनपुट के तौर पर किया जा सकता है. जैसे, एक्सलरोमीटर वाला गेमपैड.
डाइनैमिक सेंसर कनेक्ट होने पर, ISensorsCallback
में मौजूद onDynamicSensorConnected
फ़ंक्शन को Sensors HAL से कॉल किया जाना चाहिए. इससे, फ़्रेमवर्क को नए डाइनैमिक सेंसर के बारे में सूचना मिलती है. साथ ही, फ़्रेमवर्क की मदद से सेंसर को कंट्रोल किया जा सकता है और क्लाइंट से सेंसर के इवेंट का इस्तेमाल किया जा सकता है.
इसी तरह, जब कोई डाइनैमिक सेंसर डिसकनेक्ट हो जाता है, तो ISensorsCallback
में onDynamicSensorDisconnected
फ़ंक्शन को कॉल किया जाना चाहिए, ताकि फ़्रेमवर्क ऐसे किसी भी सेंसर को हटा सके जो अब उपलब्ध नहीं है.
डायरेक्ट चैनल
डायरेक्ट चैनल, कार्रवाई का एक तरीका है. इसमें सेंसर इवेंट को किसी खास मेमोरी में लिखा जाता है, न कि इवेंट एफ़एमक्यू के लिए, Android सेंसर फ़्रेमवर्क को बायपास किया जाता है. डायरेक्ट चैनल रजिस्टर करने वाले क्लाइंट को सेंसर इवेंट को सीधे उस मेमोरी से पढ़ना होगा जिसका इस्तेमाल डायरेक्ट चैनल बनाने के लिए किया गया था. साथ ही, उसे फ़्रेमवर्क के ज़रिए सेंसर इवेंट नहीं मिलेंगे. सामान्य ऑपरेशन के लिए configDirectReport()
फ़ंक्शन, batch()
की तरह ही होता है और डायरेक्ट रिपोर्ट चैनल को कॉन्फ़िगर करता है.
registerDirectChannel()
और unregisterDirectChannel()
फ़ंक्शन, नया डायरेक्ट चैनल बनाते हैं या मौजूदा चैनल को मिटा देते हैं.
ऑपरेशन मोड
setOperationMode()
फ़ंक्शन, फ़्रेमवर्क को सेंसर कॉन्फ़िगर करने की अनुमति देता है, ताकि
फ़्रेमवर्क सेंसर डेटा को सेंसर में इंजेक्ट कर सके. यह टेस्टिंग के लिए मददगार है
खास तौर पर, उन एल्गोरिदम के लिए जो फ़्रेमवर्क के नीचे मौजूद होते हैं.
injectSensorData()
फ़ंक्शन का इस्तेमाल आम तौर पर, सेंसर एचएएल में ऑपरेशनल पैरामीटर को पुश करने के लिए किया जाता है. इस फ़ंक्शन का इस्तेमाल, किसी खास सेंसर में सेंसर इवेंट इंजेक्ट करने के लिए भी किया जा सकता है.
पुष्टि करें
सेंसर एचएएल के लागू होने की पुष्टि करने के लिए, सेंसर सीटीएस और वीटीएस के टेस्ट चलाएं.
सीटीएस टेस्ट
सेंसर सीटीएस जांच, ऑटोमेटेड सीटीएस जांच और मैन्युअल सीटीएस पुष्टिकर्ता ऐप्लिकेशन, दोनों में मौजूद हैं.
ऑटोमेटेड टेस्ट, cts/tests/sensor/src/android/hardware/cts में मौजूद होते हैं. इन टेस्ट से सेंसर के स्टैंडर्ड फ़ंक्शन की पुष्टि की जाती है. जैसे, सेंसर चालू करना, बैच बनाना, और सेंसर इवेंट रेट.
CTS Verifier के टेस्ट, cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors में मौजूद हैं. इन टेस्ट के लिए, टेस्ट ऑपरेटर को मैन्युअल इनपुट देना होता है. साथ ही, यह पक्का करना होता है कि सेंसर सटीक वैल्यू दिखा रहे हों.
सीटीएस टेस्ट पास करना ज़रूरी है, ताकि यह पक्का किया जा सके कि जांचा जा रहा डिवाइस, सीडीडी की सभी ज़रूरी शर्तों को पूरा करता है.
वीटीएस टेस्ट
सेंसर एआईडीएल एचएएल के लिए वीटीएस की जांच hardware/interfaces/sensors/aidl/vts/ में मौजूद होती हैं.
इन जांचों से यह पक्का होता है कि Sensors HAL सही तरीके से लागू किया गया है और ISensors.aidl
और ISensorsCallback.aidl
में बताई गई सभी ज़रूरी शर्तें पूरी की गई हैं.
HAL को शुरू करना
फ़्रेमवर्क और एचएएल के बीच एफ़एमक्यू सेट अप करने के लिए, initialize()
फ़ंक्शन का इस्तेमाल किया जाना चाहिए.
उपलब्ध सेंसर दिखाना
Sensors AIDL HAL में, getSensorsList()
फ़ंक्शन को डिवाइस के एक बार बूट होने के दौरान एक ही वैल्यू दिखानी चाहिए. ऐसा तब भी होना चाहिए, जब Sensors HAL को फिर से शुरू किया गया हो. getSensorsList()
फ़ंक्शन के लिए एक नई ज़रूरी शर्त यह है कि किसी डिवाइस के एक बार बूट होने के दौरान, यह एक ही वैल्यू दिखाए. ऐसा, Sensors HAL के रीस्टार्ट होने के दौरान भी होना चाहिए. इससे, सिस्टम सर्वर के फिर से शुरू होने पर, फ़्रेमवर्क को सेंसर कनेक्शन फिर से सेट अप करने की कोशिश करने की अनुमति मिलती है. getSensorsList()
से मिलने वाली वैल्यू, डिवाइस को फिर से चालू करने के बाद बदल सकती है.
एफएमक्यू में सेंसर इवेंट लिखना
Sensors AIDL HAL में, poll()
के कॉल होने का इंतज़ार करने के बजाय, सेंसर इवेंट उपलब्ध होने पर, सेंसर इवेंट को इवेंट एफ़एमक्यू में पहले से लिखना चाहिए. फ़्रेमवर्क में एफ़एमक्यू को पढ़ने के लिए, EventFlag
में सही बिट लिखने की ज़िम्मेदारी भी एचएएल की होती है.
WAKE_UP इवेंट
Sensors HAL 1.0 में, WAKE_UP
को poll()
पर पोस्ट करने के बाद, poll()
को किए जाने वाले किसी भी बाद के कॉल पर, HAL किसी भी WAKE_UP
इवेंट के लिए अपना वेक लॉक रिलीज़ कर सकता था. इसकी वजह यह थी कि इससे पता चलता था कि फ़्रेमवर्क ने सभी सेंसर इवेंट को प्रोसेस कर लिया है और ज़रूरत पड़ने पर, वेक लॉक भी हासिल कर लिया है. ऐसा इसलिए है, क्योंकि Sensors AIDL HAL में, जब फ़्रेमवर्क, एफ़एमक्यू में लिखे गए इवेंट को प्रोसेस कर लेता है, तब एचएएल को इसकी सूचना नहीं दी जाती. हालांकि, वेक लॉक एफ़एमक्यू की मदद से, फ़्रेमवर्क WAKE_UP
इवेंट को हैंडल करने के बाद, एचएएल से संपर्क कर सकता है.
Sensors AIDL HAL में, WAKE_UP
इवेंट के लिए Sensors HAL से सुरक्षित किया गया वेक लॉक, SensorsHAL_WAKEUP
से शुरू होना चाहिए.
डाइनैमिक सेंसर
सेंसर HAL 1.0 में poll()
फ़ंक्शन का इस्तेमाल करके, डाइनैमिक सेंसर दिखाए गए.
सेंसर AIDL HAL के लिए ज़रूरी है कि डाइनैमिक सेंसर के कनेक्शन बदलने पर, ISensorsCallback
में मौजूद onDynamicSensorsConnected
और onDynamicSensorsDisconnected
को कॉल किया जाए. ये कॉलबैक, initialize()
फ़ंक्शन के ज़रिए दिए गए ISensorsCallback
पॉइंटर के हिस्से के तौर पर उपलब्ध होते हैं.
ऑपरेशन मोड
WAKE_UP
सेंसर के लिए DATA_INJECTION
मोड काम करना चाहिए.
कई एचएएल के साथ काम करने की सुविधा
सेंसर के लिए एआईडीएल एचएएल, सेंसर के लिए मल्टी-एचएएल फ़्रेमवर्क का इस्तेमाल करके, मल्टी-एचएएल के साथ काम करता है. लागू करने के बारे में जानकारी के लिए, Sensors HAL 2.1 से पोर्ट करना लेख पढ़ें.