सेंसर HAL 2.0

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

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

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

HAL 2.1 इंटरफ़ेस

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

HAL 2.0 इंटरफ़ेस

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

Sensors HAL 2.0 और HAL 2.1 को लागू करना

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

HAL को शुरू करना

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

फ्लश सेंसर

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

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

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

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

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

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

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

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

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

WAKE_UP इवेंट

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

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

फ़्रेमवर्क, Wake Lock FMQ में डेटा लिखने पर, उसमें WakeLockQueueFlagBits::DATA_WRITTEN लिखने की सूचना सेट करता है.

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

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

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

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

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

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

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

ऑपरेशन मोड

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

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

पुष्टि करें

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

सीटीएस टेस्ट

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

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

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

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

वीटीएस टेस्ट

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

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

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

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

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

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

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

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

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

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

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

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

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

WAKE_UP इवेंट

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

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

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

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

ऑपरेशन मोड

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

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

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