सेंसर हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल), Android सेंसर फ़्रेमवर्क और डिवाइस के सेंसर, जैसे कि एक्सलरोमीटर या जाइरोस्कोप के बीच का इंटरफ़ेस होता है. Sensors HAL उन फ़ंक्शन के बारे में बताता है जिन्हें लागू करना ज़रूरी है, ताकि फ़्रेमवर्क से सेंसर को कंट्रोल किया जा सके.
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 में HAL की परिभाषा में मौजूद है.
अगर इस पेज और ISensors.hal
के बीच ज़रूरी शर्तों में कोई अंतर है, तो ISensors.hal
में दी गई ज़रूरी शर्त का इस्तेमाल करें.
HAL 2.0 इंटरफ़ेस
Sensors HAL 2.0 के दस्तावेज़ का मुख्य सोर्स, hardware/interfaces/sensors/2.0/ISensors.hal में 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 सेंसर फ़्रेमवर्क को सेंसर एचएएल को शुरू करना होगा. फ़्रेमवर्क, 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()
का इस्तेमाल करके किसी भी समय सेंसर को फिर से कॉन्फ़िगर किया जा सकता है.
सैंपलिंग की अवधि
कॉन्फ़िगर किए जा रहे सेंसर के टाइप के आधार पर, सैंपलिंग पीरियड का मतलब अलग-अलग होता है:
- लगातार: सेंसर इवेंट लगातार जनरेट होते रहते हैं.
- बदलाव होने पर: इवेंट, सैंपलिंग पीरियड से ज़्यादा तेज़ी से जनरेट नहीं होते. अगर मेज़र की गई वैल्यू में कोई बदलाव नहीं होता है, तो इवेंट सैंपलिंग पीरियड से धीमी दर से जनरेट हो सकते हैं.
- एक बार में पूरा डेटा इकट्ठा करना: सैंपलिंग पीरियड को अनदेखा किया जाता है.
- खास जानकारी: ज़्यादा जानकारी के लिए, सेंसर टाइप देखें.
सैंपलिंग पीरियड और सेंसर के रिपोर्टिंग मोड के बीच के इंटरैक्शन के बारे में जानने के लिए, रिपोर्टिंग मोड देखें.
रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय
रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय, नैनोसेकंड में वह ज़्यादा से ज़्यादा समय सेट करता है जिसमें इवेंट को HAL के ज़रिए इवेंट एफ़एमक्यू में लिखे जाने से पहले, हार्डवेयर एफ़आईओ में सेव किया जा सकता है. ऐसा तब होता है, जब SoC चालू हो.
शून्य वैल्यू का मतलब है कि इवेंट को मेज़र करने के तुरंत बाद, उनकी रिपोर्ट कर दी जानी चाहिए. इसके लिए, FIFO को पूरी तरह से स्किप किया जा सकता है या सेंसर से एक इवेंट FIFO में मौजूद होने पर, उसे खाली कर दिया जा सकता है.
उदाहरण के लिए, अगर सोसी चालू है, तो 50 Hz पर चालू किया गया ऐक्सीलेरोमीटर, ज़्यादा से ज़्यादा शून्य रिपोर्टिंग रिटर्न के साथ, हर सेकंड में 50 बार रुकावटें ट्रिगर करता है.
अगर रिपोर्टिंग में लगने वाला ज़्यादा से ज़्यादा समय शून्य से ज़्यादा है, तो सेंसर इवेंट का पता चलने के तुरंत बाद उन्हें रिपोर्ट करने की ज़रूरत नहीं होती. इवेंट को कुछ समय के लिए, हार्डवेयर FIFO में सेव किया जा सकता है और एक साथ कई इवेंट की रिपोर्ट की जा सकती है. हालांकि, ऐसा तब तक ही किया जा सकता है, जब तक किसी भी इवेंट को रिपोर्ट करने में लगने वाला समय, रिपोर्टिंग में लगने वाले ज़्यादा से ज़्यादा समय से ज़्यादा न हो. पिछले बैच के बाद से सभी इवेंट रिकॉर्ड किए जाते हैं और एक साथ दिखाए जाते हैं. इससे SoC को भेजे जाने वाले इंटरप्ट की संख्या कम हो जाती है. साथ ही, सेंसर के डेटा कैप्चर करने और उसे बैच में डालने के दौरान, SoC को कम पावर मोड पर स्विच करने की सुविधा मिलती है.
हर इवेंट का एक टाइमस्टैंप होता है. किसी इवेंट की रिपोर्टिंग में देरी होने पर, इवेंट के टाइमस्टैंप पर कोई असर नहीं पड़ना चाहिए. टाइमस्टैंप सटीक होना चाहिए और वह उस समय से मेल खाना चाहिए जब इवेंट हुआ था, न कि उस समय से जब उसकी शिकायत की गई थी.
सेंसर इवेंट की रिपोर्टिंग के बारे में ज़्यादा जानकारी और ज़रूरी शर्तों के लिए, बैच में भेजना देखें.
सेंसर चालू करना
फ़्रेमवर्क, activate()
फ़ंक्शन का इस्तेमाल करके सेंसर को चालू और बंद करता है.
किसी सेंसर को चालू करने से पहले, फ़्रेमवर्क को batch()
का इस्तेमाल करके सेंसर को कॉन्फ़िगर करना होगा.
किसी सेंसर को बंद करने के बाद, उस सेंसर से मिलने वाले अतिरिक्त सेंसर इवेंट को इवेंट एफ़एमक्यू में नहीं लिखा जाना चाहिए.
फ्लश सेंसर
अगर किसी सेंसर को सेंसर डेटा को बैच में भेजने के लिए कॉन्फ़िगर किया गया है, तो फ़्रेमवर्क flush()
को कॉल करके, बैच में भेजे गए सेंसर इवेंट को तुरंत फ़्लश कर सकता है. इससे, चुने गए सेंसर हैंडल के लिए, एक साथ भेजे गए सेंसर इवेंट, इवेंट एफएमक्यू में तुरंत लिखे जाते हैं. सेंसर HAL को flush()
को कॉल करने के नतीजे के तौर पर लिखे गए सेंसर इवेंट के आखिर में, फ़्लश पूरा होने का इवेंट जोड़ना होगा.
फ़्लश असाइनॉनिमस तरीके से होता है. इसका मतलब है कि यह फ़ंक्शन तुरंत रिटर्न होना चाहिए. अगर लागू करने के लिए, कई सेंसर के लिए एक FIFO का इस्तेमाल किया जाता है, तो उस FIFO को फ़्लश किया जाता है और फ़्लश पूरा होने का इवेंट सिर्फ़ तय किए गए सेंसर के लिए जोड़ा जाता है.
अगर बताए गए सेंसर में कोई FIFO नहीं है (बफ़रिंग नहीं की जा सकती) या कॉल के समय FIFO खाली था, तो भी flush()
को कामयाब होना चाहिए और उस सेंसर के लिए 'फ़्लश पूरा हो गया' इवेंट भेजना चाहिए. यह एक बार में एक फ़ोटो लेने वाले सेंसर के अलावा, सभी सेंसर पर लागू होता है.
अगर flush()
को एक बार में काम करने वाले सेंसर के लिए कॉल किया जाता है, तो flush()
को BAD_VALUE
दिखाना चाहिए और फ़्लश पूरा होने का इवेंट जनरेट नहीं करना चाहिए.
एफएमक्यू में सेंसर इवेंट लिखना
सेंसर एचएएल, सेंसर इवेंट को Android सेंसर फ़्रेमवर्क में पुश करने के लिए, इवेंट एफ़एमक्यू का इस्तेमाल करता है.
इवेंट एफ़एमक्यू, सिंक किया गया एफ़एमक्यू होता है. इसका मतलब है कि उपलब्ध जगह से ज़्यादा इवेंट को एफ़एमक्यू में लिखने की कोशिश करने पर, लिखने की प्रोसेस पूरी नहीं हो पाती. ऐसे मामले में, एचएएल को यह तय करना चाहिए कि इवेंट के मौजूदा सेट को, इवेंट के दो छोटे ग्रुप के तौर पर लिखा जाए या ज़रूरत के हिसाब से जगह होने पर सभी इवेंट को एक साथ लिखा जाए.
जब Sensors HAL ने इवेंट एफ़एमक्यू में ज़रूरत के मुताबिक सेंसर इवेंट लिख दिए हैं, तो Sensors HAL को फ़्रेमवर्क को सूचना देनी होगी कि इवेंट तैयार हैं. इसके लिए, इवेंट एफ़एमक्यू के EventFlag::wake
फ़ंक्शन में EventQueueFlagBits::READ_AND_PROCESS
बिट लिखना होगा. EventFlag को Event FMQ से बनाया जा सकता है. इसके लिए, EventFlag::createEventFlag
और Event FMQ के 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 अपना वेक लॉक रिलीज़ करता है, तब सिंक करने के लिए वेक लॉक एफ़एमक्यू का इस्तेमाल करें.
Sensors HAL को वेक लॉक एफ़एमक्यू को पढ़ना होगा, ताकि यह पता लगाया जा सके कि फ़्रेमवर्क ने WAKE_UP
इवेंट की कितनी संख्या को मैनेज किया है. HAL को WAKE_UP
इवेंट के लिए अपना वेक लॉक सिर्फ़ तब रिलीज़ करना चाहिए, जब बिना मैनेज किए गए WAKE_UP
इवेंट की कुल संख्या शून्य हो.
सेंसर इवेंट को मैनेज करने के बाद, फ़्रेमवर्क उन इवेंट की संख्या की गिनती करता है जिन्हें WAKE_UP
इवेंट के तौर पर मार्क किया गया है. साथ ही, यह संख्या फिर से वेक लॉक एफ़एमक्यू में लिख देता है.
फ़्रेमवर्क, Wake Lock FMQ में डेटा लिखने पर, उसमें WakeLockQueueFlagBits::DATA_WRITTEN
लिखने की सूचना सेट करता है.
डाइनैमिक सेंसर
डाइनैमिक सेंसर, ऐसे सेंसर होते हैं जो डिवाइस का हिस्सा नहीं होते. हालांकि, इनका इस्तेमाल डिवाइस के इनपुट के तौर पर किया जा सकता है. जैसे, एक्सलरोमीटर वाला गेमपैड.
डाइनैमिक सेंसर कनेक्ट होने पर, ISensorsCallback
में मौजूद onDynamicSensorConnected
फ़ंक्शन को Sensors HAL से कॉल किया जाना चाहिए. इससे, फ़्रेमवर्क को नए डाइनैमिक सेंसर के बारे में सूचना मिलती है. साथ ही, फ़्रेमवर्क की मदद से सेंसर को कंट्रोल किया जा सकता है और क्लाइंट से सेंसर के इवेंट का इस्तेमाल किया जा सकता है.
इसी तरह, जब कोई डाइनैमिक सेंसर डिसकनेक्ट हो जाता है, तो 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 में मौजूद हैं. इन टेस्ट के लिए, टेस्ट ऑपरेटर को मैन्युअल इनपुट देना होता है. इससे यह पक्का किया जाता है कि सेंसर सटीक वैल्यू दिखाते हों.
सीटीएस टेस्ट पास करना ज़रूरी है, ताकि यह पक्का किया जा सके कि जांचा जा रहा डिवाइस, सीडीडी की सभी ज़रूरी शर्तों को पूरा करता है.
वीटीएस टेस्ट
Sensors HAL 2.0 के लिए, वीटीएस टेस्ट hardware/interfaces/sensors/2.0/vts में मौजूद होते हैं.
Sensors HAL 2.1 के लिए, वीटीएस टेस्ट hardware/interfaces/sensors/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()
तरीकों का इस्तेमाल करना ज़रूरी है. इन तरीकों को, ऊपर बताई गई HAL 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 लागू करने का तरीका इन ज़रूरी शर्तों को पूरा करता हो.
HAL को शुरू करना
फ़्रेमवर्क और एचएएल के बीच एफ़एमक्यू सेट अप करने के लिए, initialize()
फ़ंक्शन का इस्तेमाल किया जाना चाहिए.
उपलब्ध सेंसर दिखाना
Sensors HAL 2.0 में, getSensorsList()
फ़ंक्शन को किसी डिवाइस के एक बार बूट होने के दौरान एक ही वैल्यू दिखानी चाहिए. ऐसा तब भी होना चाहिए, जब Sensors HAL को कई बार रीस्टार्ट किया गया हो. getSensorsList()
फ़ंक्शन के लिए एक नई ज़रूरी शर्त यह है कि किसी डिवाइस के एक बार बूट होने के दौरान, यह एक ही वैल्यू दिखाए. ऐसा, Sensors HAL के रीस्टार्ट होने के दौरान भी होना चाहिए. इससे, सिस्टम सर्वर के फिर से शुरू होने पर, फ़्रेमवर्क सेंसर कनेक्शन फिर से बनाने की कोशिश कर सकता है. डिवाइस के रीबूट होने के बाद, getSensorsList()
से मिली वैल्यू बदल सकती है.
एफएमक्यू में सेंसर इवेंट लिखना
Sensors HAL 2.0 में, poll()
के कॉल होने का इंतज़ार करने के बजाय, Sensors HAL को सेंसर इवेंट उपलब्ध होने पर, इवेंट FMQ में सेंसर इवेंट को पहले से लिखना चाहिए. एचएएल की यह भी ज़िम्मेदारी है कि वह EventFlag
में सही बिट लिखे, ताकि फ़्रेमवर्क में एफ़एमक्यू को पढ़ा जा सके.
WAKE_UP इवेंट
Sensors HAL 1.0 में, WAKE_UP
को poll()
पर पोस्ट करने के बाद, poll()
को किए जाने वाले किसी भी अगले कॉल पर, HAL किसी भी WAKE_UP
इवेंट के लिए अपना वेक लॉक रिलीज़ कर सकता था. इसकी वजह यह थी कि इससे पता चलता था कि फ़्रेमवर्क ने सभी सेंसर इवेंट को प्रोसेस कर लिया है और ज़रूरत पड़ने पर, वेक लॉक भी हासिल कर लिया है. ऐसा इसलिए है, क्योंकि Sensors HAL 2.0 में, अब एचएएल को यह पता नहीं चलता कि फ़्रेमवर्क ने एफ़एमक्यू में लिखे गए इवेंट को कब प्रोसेस किया है. इसलिए, वेक लॉक एफ़एमक्यू की मदद से, फ़्रेमवर्क, एचएएल से तब संपर्क कर सकता है, जब उसने WAKE_UP
इवेंट को मैनेज कर लिया हो.
Sensors HAL 2.0 में, WAKE_UP
इवेंट के लिए Sensors HAL से सुरक्षित किया गया वेक लॉक, SensorsHAL_WAKEUP
से शुरू होना चाहिए.
डाइनैमिक सेंसर
Sensors HAL 1.0 में poll()
फ़ंक्शन का इस्तेमाल करके, डाइनैमिक सेंसर दिखाए जाते थे.
Sensors HAL 2.0 के मुताबिक, जब भी सेंसर के डाइनैमिक कनेक्शन बदलते हैं, तो ISensorsCallback
में onDynamicSensorsConnected
और
onDynamicSensorsDisconnected
को कॉल किया जाना चाहिए. ये कॉलबैक, initialize()
फ़ंक्शन के ज़रिए दिए गए ISensorsCallback
पॉइंटर के हिस्से के तौर पर उपलब्ध होते हैं.
ऑपरेशन मोड
Sensors HAL 2.0 में, WAKE_UP
सेंसर के लिए DATA_INJECTION
मोड काम करना चाहिए.
कई एचएएल के साथ काम करने की सुविधा
Sensors HAL 2.0 और 2.1, Sensors Multi-HAL फ़्रेमवर्क का इस्तेमाल करके, कई HAL के साथ काम करता है. लागू करने के बारे में जानकारी के लिए, Sensors HAL 1.0 से पोर्ट करना लेख पढ़ें.