Sensors HAL 2.0

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

Sensors HAL 2.0, Android 10 और इसके बाद के वर्शन पर उपलब्ध है. यह सुविधा, नए और अपग्रेड किए गए डिवाइसों के लिए उपलब्ध है. Sensors HAL 2.0, Sensors HAL 1.0 पर आधारित है. हालांकि, इसमें कई अहम अंतर हैं. इस वजह से, यह पिछले वर्शन के साथ काम नहीं करता. Sensors HAL 2.0, 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 के दस्तावेज़ का मुख्य सोर्स, एचएएल डेफ़िनिशन में मौजूद है. यह hardware/interfaces/sensors/2.1/ISensors.hal पर मौजूद है. अगर इस पेज और ISensors.hal में दी गई ज़रूरी शर्तों में कोई टकराव होता है, तो ISensors.hal में दी गई ज़रूरी शर्त का इस्तेमाल करें.

HAL 2.0 इंटरफ़ेस

Sensors HAL 2.0 के दस्तावेज़ का मुख्य सोर्स, एचएएल डेफ़िनिशन में मौजूद है. यह 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 सेंसर फ़्रेमवर्क से शुरू किया जाना चाहिए, ताकि इसका इस्तेमाल किया जा सके. फ़्रेमवर्क, HAL 2.0 के लिए initialize() फ़ंक्शन और HAL 2.1 के लिए initialize_2_1() फ़ंक्शन को कॉल करता है, ताकि Sensors HAL को तीन पैरामीटर दिए जा सकें: दो FMQ डिस्क्रिप्टर और ISensorsCallback ऑब्जेक्ट का एक पॉइंटर.

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

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

उपलब्ध सेंसर की जानकारी देना

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

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

सेंसर की सूची में बदलाव न होना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

फ़्लश सेंसर

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

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

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

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

FMQ में सेंसर इवेंट लिखना

इवेंट FMQ का इस्तेमाल, Sensors HAL करता है. इससे सेंसर इवेंट को Android सेंसर फ़्रेमवर्क में पुश किया जाता है.

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

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

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

WAKE_UP इवेंट

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

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

जब भी फ़्रेमवर्क, वेक लॉक FMQ में डेटा लिखता है, तब वह वेक लॉक FMQ पर WakeLockQueueFlagBits::DATA_WRITTEN write notification सेट करता है.

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

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

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

इसी तरह, जब कोई डाइनैमिक सेंसर डिसकनेक्ट हो जाता है, तो ISensorsCallback में onDynamicSensorDisconnected फ़ंक्शन को कॉल किया जाना चाहिए, ताकि फ़्रेमवर्क उस सेंसर को हटा सके जो अब उपलब्ध नहीं है.

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

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

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

ऑपरेशन मोड

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

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

Validation

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

सीटीएस टेस्ट

सेंसर के लिए CTS टेस्ट, ऑटोमेटेड CTS टेस्ट और CTS Verifier ऐप्लिकेशन, दोनों में मौजूद होते हैं.

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

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

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

वीटीएस टेस्ट

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

सेंसर HAL 2.0 से 2.1 पर अपग्रेड करना

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

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

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

Sensors HAL 1.0 से 2.0 पर अपग्रेड करना

Sensors HAL 1.0 से 2.0 पर अपग्रेड करते समय, पक्का करें कि आपका HAL इन ज़रूरी शर्तों को पूरा करता हो.

HAL शुरू करना

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

उपलब्ध सेंसर की जानकारी देना

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

FMQ में सेंसर इवेंट लिखना

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

WAKE_UP इवेंट

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

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

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

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

ऑपरेशन मोड

Sensors HAL 2.0 में, WAKE_UP सेंसर के लिए DATA_INJECTION मोड काम करना चाहिए.

एक से ज़्यादा HAL इस्तेमाल करने की सुविधा

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