Sensors HAL 2.0

सेंसर हार्डवेयर ऐब्स्ट्रैक्शन लेयर (एचएएल), Android सेंसर फ़्रेमवर्क और डिवाइस के सेंसर के बीच का इंटरफ़ेस है. जैसे, एक्सलरोमीटर या जाइरोस्कोप. सेंसर एचएएल, उन फ़ंक्शन को तय करता है जिन्हें लागू करना ज़रूरी है, ताकि फ़्रेमवर्क सेंसर को कंट्रोल कर सके.

सेंसर एचएएल 2.0, Android 10 और इसके बाद के वर्शन वाले नए और अपग्रेड किए गए डिवाइसों के लिए उपलब्ध है. सेंसर एचएएल 2.0, सेंसर एचएएल 1.0 पर आधारित है. हालांकि, इसमें कई अहम अंतर हैं. इस वजह से, यह पुराने वर्शन के साथ काम नहीं करता. सेंसर एचएएल 2.0, फ़ास्ट मैसेज क्यू (एफ़एमक्यू) का इस्तेमाल करके, सेंसर इवेंट को एचएएल से Android सेंसर फ़्रेमवर्क में भेजता है.

सेंसर एचएएल 2.1, Android 11 और इसके बाद के वर्शन वाले नए और अपग्रेड किए गए डिवाइसों के लिए उपलब्ध है. सेंसर एचएएल 2.1, सेंसर एचएएल 2.0 का एक वर्शन है. इसमें HINGE_ANGLE सेंसर टाइप की सुविधा मिलती है. साथ ही, HINGE_ANGLE टाइप को स्वीकार करने के लिए, अलग-अलग तरीकों को अपडेट किया गया है.

एचएएल 2.1 इंटरफ़ेस

सेंसर एचएएल 2.1 के लिए दस्तावेज़ का मुख्य सोर्स, एचएएल डेफ़िनिशन में है, जो यहां मौजूद है: hardware/interfaces/sensors/2.1/ISensors.hal. अगर इस पेज और ISensors.hal में ज़रूरी शर्तों के बीच कोई टकराव होता है, तो ISensors.hal में मौजूद ज़रूरी शर्त का इस्तेमाल करें.

एचएएल 2.0 इंटरफ़ेस

सेंसर एचएएल 2.0 के लिए दस्तावेज़ का मुख्य सोर्स, एचएएल डेफ़िनिशन में है: hardware/interfaces/sensors/2.0/ISensors.hal. अगर इस पेज और ISensors.hal में ज़रूरी शर्तों के बीच कोई टकराव होता है, तो ISensors.hal में मौजूद ज़रूरी शर्त का इस्तेमाल करें.

सेंसर एचएएल 2.0 और एचएएल 2.1 लागू करना

सेंसर एचएएल 2.0 या 2.1 को लागू करने के लिए, किसी ऑब्जेक्ट को ISensors इंटरफ़ेस को बढ़ाना होगा. साथ ही, 2.0/ISensors.hal या 2.1/ISensors.hal में तय किए गए सभी फ़ंक्शन को लागू करना होगा.

एचएएल को शुरू करना

सेंसर एचएएल का इस्तेमाल करने से पहले, Android सेंसर फ़्रेमवर्क को इसे शुरू करना होगा. फ़्रेमवर्क, सेंसर एचएएल को तीन पैरामीटर देने के लिए, एचएएल 2.0 के लिए initialize() फ़ंक्शन और एचएएल 2.1 के लिए initialize_2_1() फ़ंक्शन को कॉल करता है. ये तीन पैरामीटर हैं: दो एफ़एमक्यू डिस्क्रिप्टर और ISensorsCallback ऑब्जेक्ट का एक पॉइंटर.

एचएएल, पहले डिस्क्रिप्टर का इस्तेमाल करके, इवेंट एफ़एमक्यू बनाता है. इसका इस्तेमाल, सेंसर इवेंट को फ़्रेमवर्क में लिखने के लिए किया जाता है. एचएएल, दूसरे डिस्क्रिप्टर का इस्तेमाल करके, वेक लॉक एफ़एमक्यू बनाता है. इसका इस्तेमाल, WAKE_UP सेंसर इवेंट के लिए, एचएएल के वेक लॉक रिलीज़ होने के समय को सिंक करने के लिए किया जाता है. एचएएल को ISensorsCallback ऑब्जेक्ट का पॉइंटर सेव करना होगा, ताकि ज़रूरी कॉलबैक फ़ंक्शन को लागू किया जा सके.

सेंसर एचएएल को शुरू करते समय, initialize() या initialize_2_1() फ़ंक्शन को सबसे पहले कॉल करना होगा.

उपलब्ध सेंसर दिखाना

डिवाइस में उपलब्ध सभी स्टैटिक सेंसर की सूची पाने के लिए, एचएएल 2.0 पर getSensorsList() फ़ंक्शन और एचएएल 2.1 पर getSensorsList_2_1() फ़ंक्शन का इस्तेमाल करें. यह फ़ंक्शन, सेंसर की सूची दिखाता है. हर सेंसर की पहचान, उसके हैंडल से होती है. सेंसर एचएएल को होस्ट करने वाली प्रोसेस के रीस्टार्ट होने पर, किसी सेंसर का हैंडल नहीं बदलना चाहिए. डिवाइस के रीबूट होने और सिस्टम सर्वर के रीस्टार्ट होने पर, हैंडल बदल सकते हैं.

अगर कई सेंसर, एक ही सेंसर टाइप और वेक-अप प्रॉपर्टी शेयर करते हैं, तो सूची में मौजूद पहले सेंसर को डिफ़ॉल्ट सेंसर कहा जाता है. साथ ही, यह उन ऐप्लिकेशन को लौटाया जाता है जो getDefaultSensor(int sensorType, bool wakeUp) फ़ंक्शन का इस्तेमाल करते हैं.

सेंसर की सूची की स्थिरता

सेंसर एचएएल के रीस्टार्ट होने के बाद, अगर getSensorsList() या getSensorsList_2_1() से मिले डेटा में, रीस्टार्ट से पहले हासिल की गई सेंसर की सूची के मुकाबले कोई अहम बदलाव दिखता है, तो फ़्रेमवर्क, Android रनटाइम को रीस्टार्ट करता है. सेंसर की सूची में अहम बदलाव तब होते हैं, जब किसी दिए गए हैंडल वाला सेंसर मौजूद न हो या उसके एट्रिब्यूट बदल गए हों या जब नए सेंसर जोड़े गए हों. Android रनटाइम को रीस्टार्ट करने से उपयोगकर्ता को परेशानी हो सकती है. हालांकि, यह ज़रूरी है, क्योंकि Android फ़्रेमवर्क अब Android API के उस कॉन्ट्रैक्ट को पूरा नहीं कर सकता जिसमें स्टैटिक (नॉन-डाइनैमिक) सेंसर, किसी ऐप्लिकेशन के लाइफ़टाइम के दौरान नहीं बदलते. इससे, फ़्रेमवर्क, ऐप्लिकेशन के चालू सेंसर के अनुरोधों को फिर से लागू नहीं कर पाएगा. इसलिए, एचएएल के वेंडर को सलाह दी जाती है कि वे सेंसर की सूची में होने वाले ऐसे बदलावों को रोकें जिन्हें टाला जा सकता है.

सेंसर के हैंडल को स्थिर रखने के लिए, एचएएल को डिवाइस में मौजूद किसी सेंसर को उसके हैंडल से मैप करना होगा. सेंसर एचएएल इंटरफ़ेस में, किसी खास तरीके से लागू करने की ज़रूरी शर्त नहीं है. हालांकि, डेवलपर के पास इस ज़रूरी शर्त को पूरा करने के लिए कई विकल्प मौजूद हैं.

उदाहरण के लिए, सेंसर की सूची को हर सेंसर के तय एट्रिब्यूट के कॉम्बिनेशन का इस्तेमाल करके क्रम से लगाया जा सकता है. जैसे, वेंडर, मॉडल, और सेंसर टाइप. एक और विकल्प इस बात पर निर्भर करता है कि डिवाइस में मौजूद स्टैटिक सेंसर का सेट हार्डवेयर में तय होता है. इसलिए, एचएएल को यह पता होना चाहिए कि getSensorsList() या getSensorsList_2_1() से वापस आने से पहले, सभी ज़रूरी सेंसर शुरू हो गए हैं. ज़रूरी सेंसर की इस सूची को एचएएल बाइनरी में कंपाइल किया जा सकता है या फ़ाइल सिस्टम में किसी कॉन्फ़िगरेशन फ़ाइल में सेव किया जा सकता है. साथ ही, दिखने के क्रम का इस्तेमाल करके, स्थिर हैंडल हासिल किए जा सकते हैं. हालांकि, सबसे सही तरीका, आपके एचएएल के लागू करने के तरीके की खास जानकारी पर निर्भर करता है. हालांकि, अहम ज़रूरी शर्त यह है कि एचएएल के रीस्टार्ट होने पर, सेंसर के हैंडल नहीं बदलने चाहिए.

सेंसर कॉन्फ़िगर करना

किसी सेंसर को चालू करने से पहले, उसे batch() फ़ंक्शन का इस्तेमाल करके, सैंपलिंग की अवधि और रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी के साथ कॉन्फ़िगर करना होगा.

सेंसर के डेटा को खोए बिना, batch() का इस्तेमाल करके, किसी सेंसर को किसी भी समय फिर से कॉन्फ़िगर किया जा सकता है.

सैंपलिंग की अवधि

सैंपलिंग की अवधि का मतलब, कॉन्फ़िगर किए जा रहे सेंसर टाइप के आधार पर अलग-अलग होता है:

  • लगातार: सेंसर इवेंट, लगातार जनरेट होते हैं.
  • बदलाव होने पर: इवेंट, सैंपलिंग की अवधि से ज़्यादा तेज़ी से जनरेट नहीं होते. अगर मेज़र की गई वैल्यू नहीं बदलती है, तो इवेंट, सैंपलिंग की अवधि से कम दर पर जनरेट हो सकते हैं.
  • वन-शॉट: सैंपलिंग की अवधि को अनदेखा किया जाता है.
  • खास: ज़्यादा जानकारी के लिए, सेंसर के टाइप देखें.

सैंपलिंग की अवधि और सेंसर के रिपोर्टिंग मोड के बीच इंटरैक्शन के बारे में जानने के लिए, रिपोर्टिंग मोड देखें.

रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी

रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी, नैनोसेकंड में वह ज़्यादा से ज़्यादा समय तय करती है जिसके लिए इवेंट को डिले किया जा सकता है और हार्डवेयर FIFO में सेव किया जा सकता है. ऐसा तब तक किया जा सकता है, जब तक SoC चालू हो और एचएएल के ज़रिए, इवेंट एफ़एमक्यू में इवेंट न लिखा जाए.

शून्य वैल्यू का मतलब है कि इवेंट को मेज़र किए जाने के तुरंत बाद रिपोर्ट किया जाना चाहिए. इसके लिए, या तो FIFO को पूरी तरह से छोड़ दिया जाता है या सेंसर से कोई इवेंट FIFO में मौजूद होने पर, FIFO को खाली कर दिया जाता है.

उदाहरण के लिए, 50 हर्ट्ज़ पर चालू किया गया एक्सलरोमीटर, SoC के चालू होने पर, हर सेकंड 50 बार इंटरप्ट ट्रिगर करता है. इसके लिए, रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी की वैल्यू शून्य होती है.

जब रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी की वैल्यू शून्य से ज़्यादा होती है, तो सेंसर इवेंट को पता लगने के तुरंत बाद रिपोर्ट करने की ज़रूरत नहीं होती. इवेंट को अस्थायी तौर पर हार्डवेयर FIFO में सेव किया जा सकता है और बैच में रिपोर्ट किया जा सकता है. हालांकि, यह ज़रूरी है कि किसी भी इवेंट को रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी से ज़्यादा समय के लिए डिले न किया जाए. पिछले बैच के बाद के सभी इवेंट रिकॉर्ड किए जाते हैं और एक साथ लौटाए जाते हैं. इससे, SoC को भेजे जाने वाले इंटरप्ट की संख्या कम हो जाती है. साथ ही, सेंसर के डेटा कैप्चर और बैचिंग के दौरान, SoC को कम पावर वाले मोड पर स्विच करने की अनुमति मिलती है.

हर इवेंट से एक टाइमस्टैंप जुड़ा होता है. किसी इवेंट को रिपोर्ट करने में लगने वाले समय को डिले करने से, इवेंट के टाइमस्टैंप पर कोई असर नहीं पड़ना चाहिए. टाइमस्टैंप सटीक होना चाहिए और उस समय के मुताबिक होना चाहिए जब इवेंट असल में हुआ था. न कि उस समय के मुताबिक जब उसे रिपोर्ट किया गया था.

रिपोर्टिंग की ज़्यादा से ज़्यादा लेटेंसी की वैल्यू शून्य से ज़्यादा होने पर, सेंसर इवेंट की रिपोर्टिंग से जुड़ी ज़्यादा जानकारी और ज़रूरी शर्तें जानने के लिए, बैचिंग देखें.

सेंसर चालू करना

फ़्रेमवर्क, activate() फ़ंक्शन का इस्तेमाल करके, सेंसर को चालू और बंद करता है. किसी सेंसर को चालू करने से पहले, फ़्रेमवर्क को सबसे पहले batch() का इस्तेमाल करके, सेंसर को कॉन्फ़िगर करना होगा.

किसी सेंसर के बंद होने के बाद, उस सेंसर से जुड़े अन्य सेंसर इवेंट को इवेंट एफ़एमक्यू में नहीं लिखा जाना चाहिए.

सेंसर फ़्लश करना

अगर किसी सेंसर को सेंसर डेटा बैच करने के लिए कॉन्फ़िगर किया गया है, तो फ़्रेमवर्क, flush() को कॉल करके, बैच किए गए सेंसर इवेंट को तुरंत फ़्लश कर सकता है. इससे, तय किए गए सेंसर हैंडल के लिए बैच किए गए सेंसर इवेंट को तुरंत इवेंट एफ़एमक्यू में लिखा जाता है. सेंसर एचएएल को, flush() को कॉल करने के बाद लिखे गए सेंसर इवेंट के आखिर में, फ़्लश पूरा होने का इवेंट जोड़ना होगा.

फ़्लश एसिंक्रोनस तरीके से होता है. इसका मतलब है कि इस फ़ंक्शन को तुरंत वापस आना चाहिए. अगर लागू करने के तरीके में, कई सेंसर के लिए एक ही FIFO का इस्तेमाल किया जाता है, तो उस FIFO को फ़्लश किया जाता है. साथ ही, फ़्लश पूरा होने का इवेंट सिर्फ़ तय किए गए सेंसर के लिए जोड़ा जाता है.

अगर तय किए गए सेंसर में FIFO नहीं है (बफ़रिंग की सुविधा उपलब्ध नहीं है) या कॉल के समय FIFO खाली था, तो भी flush() को काम करना चाहिए और उस सेंसर के लिए, फ़्लश पूरा होने का इवेंट भेजना चाहिए. यह शर्त, वन-शॉट सेंसर को छोड़कर, सभी सेंसर पर लागू होती है.

अगर किसी वन-शॉट सेंसर के लिए flush() को कॉल किया जाता है, तो flush() को BAD_VALUE लौटाना होगा. साथ ही, फ़्लश पूरा होने का इवेंट जनरेट नहीं करना होगा.

एफ़एमक्यू में सेंसर इवेंट लिखना

सेंसर एचएएल, सेंसर इवेंट को Android सेंसर फ़्रेमवर्क में पुश करने के लिए, इवेंट एफ़एमक्यू का इस्तेमाल करता है.

इवेंट एफ़एमक्यू, सिंक किया गया एफ़एमक्यू है. इसका मतलब है कि एफ़एमक्यू में उपलब्ध जगह से ज़्यादा इवेंट लिखने की कोशिश करने पर, लिखने की प्रोसेस फ़ेल हो जाती है. ऐसे में, एचएएल को यह तय करना चाहिए कि इवेंट के मौजूदा सेट को इवेंट के दो छोटे ग्रुप के तौर पर लिखा जाए या पर्याप्त जगह उपलब्ध होने पर, सभी इवेंट को एक साथ लिखा जाए.

जब सेंसर एचएएल, इवेंट एफ़एमक्यू में सेंसर इवेंट की ज़रूरी संख्या लिख लेता है, तो सेंसर एचएएल को फ़्रेमवर्क को यह सूचना देनी होगी कि इवेंट तैयार हैं. इसके लिए, इवेंट एफ़एमक्यू के EventFlag::wake फ़ंक्शन में EventQueueFlagBits::READ_AND_PROCESS बिट लिखना होगा. EventFlag::createEventFlag और इवेंट एफ़एमक्यू के getEventFlagWord() फ़ंक्शन का इस्तेमाल करके, इवेंट एफ़एमक्यू से EventFlag बनाया जा सकता है.

सेंसर एचएएल 2.0/2.1, इवेंट एफ़एमक्यू पर write और writeBlocking दोनों के साथ काम करता है. डिफ़ॉल्ट तरीके से लागू करने पर, write का इस्तेमाल करने के लिए रेफ़रंस मिलता है. अगर writeBlocking फ़ंक्शन का इस्तेमाल किया जाता है, तो readNotification फ़्लैग को EventQueueFlagBits::EVENTS_READ पर सेट करना होगा. यह फ़्लैग, फ़्रेमवर्क तब सेट करता है, जब वह इवेंट एफ़एमक्यू से इवेंट पढ़ता है. राइट नोटिफ़िकेशन फ़्लैग को EventQueueFlagBits::READ_AND_PROCESS पर सेट करना होगा. इससे फ़्रेमवर्क को यह सूचना मिलती है कि इवेंट एफ़एमक्यू में इवेंट लिखे गए हैं.

WAKE_UP इवेंट

WAKE_UP इवेंट, सेंसर इवेंट होते हैं. इनकी वजह से, ऐप्लिकेशन प्रोसेसर (एपी) चालू हो जाता है और इवेंट को तुरंत हैंडल किया जाता है. जब भी कोई WAKE_UP इवेंट, इवेंट एफ़एमक्यू में लिखा जाता है, तो सेंसर एचएएल को वेक लॉक सुरक्षित करना होगा, ताकि यह पक्का किया जा सके कि फ़्रेमवर्क के इवेंट को हैंडल करने तक, सिस्टम चालू रहे. WAKE_UP इवेंट मिलने पर, फ़्रेमवर्क अपना वेक लॉक सुरक्षित करता है. इससे सेंसर एचएएल को अपना वेक लॉक रिलीज़ करने की अनुमति मिलती है. सेंसर एचएएल के वेक लॉक रिलीज़ होने के समय को सिंक करने के लिए, वेक लॉक एफ़एमक्यू का इस्तेमाल करें.

सेंसर एचएएल को वेक लॉक एफ़एमक्यू को पढ़ना होगा, ताकि यह पता चल सके कि फ़्रेमवर्क ने कितने WAKE_UP इवेंट हैंडल किए हैं. एचएएल को WAKE_UP इवेंट के लिए अपना वेक लॉक सिर्फ़ तब रिलीज़ करना चाहिए, जब हैंडल न किए गए WAKE_UP इवेंट की कुल संख्या शून्य हो. सेंसर इवेंट को हैंडल करने के बाद, फ़्रेमवर्क उन इवेंट की संख्या गिनता है जिन्हें WAKE_UP इवेंट के तौर पर मार्क किया गया है. साथ ही, इस संख्या को वेक लॉक एफ़एमक्यू में वापस लिखता है.

फ़्रेमवर्क, वेक लॉक एफ़एमक्यू में डेटा लिखने पर, वेक लॉक एफ़एमक्यू पर WakeLockQueueFlagBits::DATA_WRITTEN राइट नोटिफ़िकेशन सेट करता है.

डाइनैमिक सेंसर

डाइनैमिक सेंसर, ऐसे सेंसर होते हैं जो असल में डिवाइस का हिस्सा नहीं होते. हालांकि, इनका इस्तेमाल डिवाइस के लिए इनपुट के तौर पर किया जा सकता है. जैसे, एक्सलरोमीटर वाला गेमपैड.

डाइनैमिक सेंसर के कनेक्ट होने पर, सेंसर एचएएल से ISensorsCallback में मौजूद onDynamicSensorConnected फ़ंक्शन को कॉल करना होगा. इससे फ़्रेमवर्क को नए डाइनैमिक सेंसर की सूचना मिलती है. साथ ही, सेंसर को फ़्रेमवर्क के ज़रिए कंट्रोल किया जा सकता है और क्लाइंट, सेंसर के इवेंट का इस्तेमाल कर सकते हैं.

इसी तरह, डाइनैमिक सेंसर के डिसकनेक्ट होने पर, ISensorsCallback में मौजूद onDynamicSensorDisconnected फ़ंक्शन को कॉल करना होगा, ताकि फ़्रेमवर्क, ऐसे सेंसर को हटा सके जो अब उपलब्ध नहीं है.

डायरेक्ट चैनल

डायरेक्ट चैनल, ऑपरेशन का एक ऐसा तरीका है जिसमें सेंसर इवेंट को इवेंट एफ़एमक्यू के बजाय, खास मेमोरी में लिखा जाता है. इससे Android सेंसर फ़्रेमवर्क को बायपास किया जाता है. डायरेक्ट चैनल रजिस्टर करने वाले क्लाइंट को, सेंसर इवेंट को सीधे उस मेमोरी से पढ़ना होगा जिसका इस्तेमाल डायरेक्ट चैनल बनाने के लिए किया गया था. साथ ही, उसे फ़्रेमवर्क के ज़रिए सेंसर इवेंट नहीं मिलेंगे. configDirectReport() फ़ंक्शन, सामान्य ऑपरेशन के लिए batch() जैसा ही होता है और डायरेक्ट रिपोर्ट चैनल को कॉन्फ़िगर करता है.

registerDirectChannel() और unregisterDirectChannel() फ़ंक्शन, नया डायरेक्ट चैनल बनाते या मिटाते हैं.

ऑपरेशन मोड

setOperationMode() फ़ंक्शन की मदद से, फ़्रेमवर्क किसी सेंसर को कॉन्फ़िगर कर सकता है, ताकि फ़्रेमवर्क, सेंसर में सेंसर डेटा इंजेक्ट कर सके. यह सुविधा, टेस्टिंग के लिए काम की है. खास तौर पर, उन एल्गोरिदम के लिए जो फ़्रेमवर्क के नीचे मौजूद हैं.

एचएएल 2.0 में injectSensorData() फ़ंक्शन और एचएएल 2.0 में injectSensorsData_2_1() फ़ंक्शन का इस्तेमाल, आम तौर पर ऑपरेशनल पैरामीटर को सेंसर एचएएल में पुश करने के लिए किया जाता है. इस फ़ंक्शन का इस्तेमाल, किसी खास सेंसर में सेंसर इवेंट इंजेक्ट करने के लिए भी किया जा सकता है.

सत्यापन

सेंसर एचएएल को लागू करने के तरीके की पुष्टि करने के लिए, सेंसर सीटीएस और वीटीएस टेस्ट चलाएं.

सीटीएस टेस्ट

सेंसर सीटीएस टेस्ट, ऑटोमेटेड सीटीएस टेस्ट और मैन्युअल सीटीएस वेरिफ़ायर ऐप्लिकेशन, दोनों में मौजूद हैं.

ऑटोमेटेड टेस्ट, cts/tests/sensor/src/android/hardware/cts में मौजूद हैं. इन टेस्ट से, सेंसर की स्टैंडर्ड सुविधाओं की पुष्टि की जाती है. जैसे, सेंसर चालू करना, बैचिंग, और सेंसर इवेंट की दरें.

सीटीएस वेरिफ़ायर टेस्ट, cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors में मौजूद हैं. इन टेस्ट के लिए, टेस्ट ऑपरेटर से मैन्युअल इनपुट की ज़रूरत होती है. साथ ही, इनसे यह पक्का किया जाता है कि सेंसर सटीक वैल्यू रिपोर्ट करें.

सीटीएस टेस्ट पास करना, यह पक्का करने के लिए ज़रूरी है कि टेस्ट किया जा रहा डिवाइस, सीडीडी की सभी ज़रूरी शर्तों को पूरा करता हो.

वीटीएस टेस्ट

सेंसर एचएएल 2.0 के लिए वीटीएस टेस्ट, hardware/interfaces/sensors/2.0/vts में मौजूद हैं. सेंसर एचएएल 2.1 के लिए वीटीएस टेस्ट, hardware/interfaces/sensors/2.1/vts में मौजूद हैं. इन टेस्ट से यह पक्का किया जाता है कि सेंसर एचएएल को सही तरीके से लागू किया गया हो और ISensors.hal और ISensorsCallback.hal में मौजूद सभी ज़रूरी शर्तों को सही तरीके से पूरा किया गया हो.

सेंसर एचएएल 2.0 से 2.1 पर अपग्रेड करना

सेंसर एचएएल 2.0 से 2.1 पर अपग्रेड करने पर, आपके एचएएल को लागू करने के तरीके में, एचएएल 2.1 के टाइप के साथ-साथ initialize_2_1(), getSensorsList_2_1(), और injectSensorsData_2_1() तरीके शामिल होने चाहिए. इन तरीकों को, ऊपर बताए गए एचएएल 2.0 के लिए तय की गई ज़रूरी शर्तों को पूरा करना होगा.

माइनर वर्शन वाले एचएएल को, पिछले एचएएल के सभी फ़ंक्शन के साथ काम करना होगा. इसलिए, 2.1 एचएएल को 2.0 एचएएल के तौर पर शुरू किया जाना चाहिए. दोनों एचएएल वर्शन के साथ काम करने की जटिलता से बचने के लिए, हमारा सुझाव है कि मल्टी-एचएएल 2.1 का इस्तेमाल करें.

सेंसर 2.1 एचएएल को लागू करने के तरीके का उदाहरण देखने के लिए, Sensors.h देखें.

सेंसर एचएएल 1.0 से 2.0 पर अपग्रेड करना

सेंसर एचएएल 1.0 से 2.0 पर अपग्रेड करने पर, पक्का करें कि आपके एचएएल को लागू करने का तरीका, इन ज़रूरी शर्तों को पूरा करता हो.

एचएएल को शुरू करना

फ़्रेमवर्क और एचएएल के बीच एफ़एमक्यू बनाने के लिए, initialize() फ़ंक्शन के साथ काम करना ज़रूरी है.

उपलब्ध सेंसर दिखाना

सेंसर एचएएल 2.0 में, getSensorsList() फ़ंक्शन को डिवाइस के एक बार बूट होने के दौरान, एक ही वैल्यू लौटानी होगी. भले ही, सेंसर एचएएल रीस्टार्ट हो. getSensorsList() फ़ंक्शन के लिए एक नई ज़रूरी शर्त यह है कि इसे डिवाइस के एक बार बूट होने के दौरान, एक ही वैल्यू लौटानी होगी. भले ही, सेंसर एचएएल रीस्टार्ट हो. इससे, सिस्टम सर्वर के रीस्टार्ट होने पर, फ़्रेमवर्क को सेंसर कनेक्शन फिर से बनाने की कोशिश करने की अनुमति मिलती है. डिवाइस के रीबूट होने के बाद, getSensorsList() से मिली वैल्यू बदल सकती है.

एफ़एमक्यू में सेंसर इवेंट लिखना

सेंसर एचएएल 2.0 में, poll() को कॉल किए जाने का इंतज़ार करने के बजाय, सेंसर एचएएल को सेंसर इवेंट उपलब्ध होने पर, उन्हें तुरंत इवेंट एफ़एमक्यू में लिखना होगा. एचएएल की यह भी ज़िम्मेदारी है कि वह EventFlag में सही बिट लिखे, ताकि फ़्रेमवर्क में एफ़एमक्यू को पढ़ा जा सके.

WAKE_UP इवेंट

सेंसर एचएएल 1.0 में, एचएएल, WAKE_UP इवेंट के लिए अपना वेक लॉक रिलीज़ कर सकता था. इसके लिए, poll() को कॉल किया जाता था. ऐसा इसलिए, क्योंकि इससे यह पता चलता था कि फ़्रेमवर्क ने सभी सेंसर इवेंट प्रोसेस कर लिए हैं और ज़रूरत पड़ने पर, वेक लॉक हासिल कर लिया है.WAKE_UPpoll() सेंसर एचएएल 2.0 में, एचएएल को यह पता नहीं चलता कि फ़्रेमवर्क ने एफ़एमक्यू में लिखे गए इवेंट को कब प्रोसेस किया है. इसलिए, वेक लॉक एफ़एमक्यू की मदद से, फ़्रेमवर्क, एचएएल को यह सूचना दे सकता है कि उसने WAKE_UP इवेंट को कब हैंडल किया है.

सेंसर एचएएल 2.0 में, WAKE_UP इवेंट के लिए सेंसर एचएएल के सुरक्षित किए गए वेक लॉक की शुरुआत SensorsHAL_WAKEUP से होनी चाहिए.

डाइनैमिक सेंसर

सेंसर एचएएल 1.0 में, poll() फ़ंक्शन का इस्तेमाल करके, डाइनैमिक सेंसर लौटाए जाते थे. सेंसर एचएएल 2.0 के लिए ज़रूरी है कि डाइनैमिक सेंसर कनेक्शन में बदलाव होने पर, ISensorsCallback में मौजूद onDynamicSensorsConnected और onDynamicSensorsDisconnected को कॉल किया जाए. ये कॉलबैक, ISensorsCallback पॉइंटर के तौर पर उपलब्ध हैं. यह पॉइंटर, initialize() फ़ंक्शन के ज़रिए दिया जाता है.

ऑपरेशन मोड

सेंसर एचएएल 2.0 में, WAKE_UP सेंसर के लिए DATA_INJECTION मोड के साथ काम करना ज़रूरी है.

मल्टी-एचएएल के साथ काम करने की सुविधा

सेंसर एचएएल 2.0 और 2.1, सेंसर मल्टी-एचएएल फ़्रेमवर्क का इस्तेमाल करके, मल्टी-एचएएल के साथ काम करते हैं. लागू करने के तरीके के बारे में ज़्यादा जानने के लिए, सेंसर एचएएल 1.0 से पोर्ट करना देखें.