مستشعرات HAL 2

طبقة تجريد أجهزة الاستشعار (HAL) هي الواجهة بين إطار عمل مستشعر Android ومستشعرات الجهاز ، مثل مقياس التسارع أو الجيروسكوب. يحدد Sensors HAL الوظائف التي يجب تنفيذها للسماح للإطار بالتحكم في المستشعرات.

تتوفر أجهزة الاستشعار HAL 2.0 في نظام Android 10 والإصدارات الأحدث للأجهزة الجديدة والمحدثة. ويستند مجسات HAL 2.0 على أجهزة استشعار HAL 1.0 ولكن لديه العديد من الاختلافات الرئيسية التي تمنع من أن يكون متوافقة إلى الوراء. مجسات HAL 2.0 الاستخدامات سريعة قوائم انتظار الرسائل (FMQs) لإرسال الأحداث استشعار من HAL في إطار استشعار الروبوت.

تتوفر أجهزة الاستشعار HAL 2.1 في Android 11 والإصدارات الأحدث للأجهزة الجديدة والمحدثة. مجسات HAL 2.1 هو التكرار من أجهزة الاستشعار HAL 2.0 يفضح HINGE_ANGLE استشعار نوع وتحديث أساليب مختلفة لقبول HINGE_ANGLE نوع.

واجهة HAL 2.1

المصدر الرئيسي للثائق مجسات HAL 2.1 ضمن تعريف HAL في الأجهزة / واجهات / أجهزة الاستشعار / 2.1 / ISensors.hal . إذا كان هناك تعارض بين متطلبات هذه الصفحة و ISensors.hal ، استخدم الشرط في ISensors.hal .

واجهة HAL 2.0

المصدر الرئيسي للثائق مجسات HAL 2.0 ضمن تعريف HAL في الأجهزة / واجهات / أجهزة الاستشعار / 2.0 / ISensors.hal . إذا كان هناك تعارض بين متطلبات هذه الصفحة و ISensors.hal ، استخدم الشرط في ISensors.hal .

تنفيذ مستشعرات HAL 2.0 و HAL 2.1

لتنفيذ مجسات HAL 2.0 أو 2.1، يجب كائن تمديد ISensors واجهة وتنفيذ جميع المهام المحددة في 2.0/ISensors.hal أو 2.1/ISensors.hal .

تهيئة HAL

يجب تهيئة Sensors HAL بواسطة إطار عمل مستشعر Android قبل استخدامه. ويدعو الإطار initialize() وظيفة لHAL 2.0 و initialize_2_1() وظيفة لHAL 2.1 لتوفير ثلاث معلمات إلى HAL مجسات: اثنان FMQ اصفات ومؤشر واحد ل ISensorsCallback الكائن.

يستخدم HAL أول واصف لإنشاء Event FMQ المستخدم لكتابة أحداث المستشعر إلى إطار العمل. يستخدم HAL واصف الثاني لإنشاء ويك قفل FMQ تستخدم لمزامنة عندما تطلق HAL قفل أعقابها ل WAKE_UP الأحداث الاستشعار. وHAL يجب حفظ مؤشر إلى ISensorsCallback الكائن بحيث يجوز التذرع بأية مهام رد اللازمة.

على initialize() أو initialize_2_1() يجب أن يكون وظيفة الوظيفة الأولى تسمى عند تهيئة مجسات وHAL.

كشف أجهزة الاستشعار المتوفرة

للحصول على قائمة من كل من أجهزة الاستشعار ثابت المتاحة في الجهاز، استخدم getSensorsList() الدالة على HAL 2.0 و getSensorsList_2_1() الدالة على HAL 2.1. تقوم هذه الوظيفة بإرجاع قائمة بأجهزة الاستشعار ، يتم تحديد كل منها بشكل فريد من خلال مقبضها. يجب ألا يتغير مقبض مستشعر معين عند إعادة تشغيل العملية التي تستضيف مستشعرات HAL. قد تتغير المقابض عبر عمليات إعادة تمهيد الجهاز ، وعبر عمليات إعادة تشغيل خادم النظام.

إذا عدة أجهزة استشعار تتشارك نفس نوع الاستشعار والممتلكات إيقاظ، ثم يسمى استشعار الأول في القائمة استشعار الافتراضية ويتم إرجاع إلى التطبيقات التي تستخدم getDefaultSensor(int sensorType, bool wakeUp) وظيفة.

قائمة استقرار أجهزة الاستشعار

بعد إعادة تشغيل مجسات HAL، إذا كانت البيانات التي تم إرجاعها بواسطة getSensorsList() أو getSensorsList_2_1() يشير إلى تغير كبير مقارنة مع قائمة استشعار استردادها قبل بداية الشوط الثاني، الإطار يؤدي إعادة تشغيل وقت التشغيل أندرويد. تتضمن التغييرات المهمة في قائمة المستشعرات الحالات التي يكون فيها جهاز استشعار بمقبض معين مفقودًا أو يغير خصائصه ، أو حيث يتم إدخال مستشعرات جديدة. على الرغم من أن إعادة تشغيل وقت تشغيل Android أمر مزعج للمستخدم ، إلا أنه مطلوب لأن إطار عمل Android لم يعد قادرًا على تلبية عقد Android API الذي لا تتغير أجهزة الاستشعار الثابتة (غير الديناميكية) خلال عمر التطبيق. قد يمنع هذا أيضًا إطار العمل من إعادة إنشاء طلبات الاستشعار النشطة التي تقدمها التطبيقات. لذلك ، يُنصح بائعي HAL بمنع تغييرات قائمة المستشعرات التي يمكن تجنبها.

لضمان استقرار مقابض المستشعرات ، يجب أن يحدد HAL بشكل حاسم مستشعرًا ماديًا معينًا في الجهاز لمقبضه. على الرغم من عدم وجود تنفيذ محدد مفروض بواسطة واجهة Sensors HAL ، فإن المطورين لديهم عدد من الخيارات المتاحة لتلبية هذا المطلب.

على سبيل المثال ، يمكن فرز قائمة المستشعرات باستخدام مجموعة من السمات الثابتة لكل مستشعر ، مثل البائع والطراز ونوع المستشعر. يعتمد خيار آخر على حقيقة أن مجموعة للجهاز من أجهزة الاستشعار ثابت ثابت في الأجهزة، لذلك تحتاج إلى HAL لمعرفة متى يكون قد أتم جميع أجهزة الاستشعار المتوقع التهيئة قبل عودته من getSensorsList() أو getSensorsList_2_1() . يمكن تجميع قائمة المستشعرات المتوقعة هذه في ثنائي HAL أو تخزينها في ملف تكوين في نظام الملفات ، ويمكن استخدام ترتيب المظهر لاشتقاق مقابض مستقرة. على الرغم من أن الحل الأفضل يعتمد على تفاصيل التنفيذ المحددة لـ HAL الخاص بك ، فإن المطلب الرئيسي هو أن مقابض المستشعرات لا تتغير عبر عمليات إعادة تشغيل HAL.

تكوين أجهزة الاستشعار

قبل تنشيط جهاز استشعار، يجب أن يتم تكوين أجهزة الاستشعار مع فترة أخذ العينات والحد الأقصى الإبلاغ الكمون باستخدام batch() وظيفة.

يجب أن يكون جهاز استشعار قادرة على إعادة تشكيلها في أي وقت باستخدام batch() دون فقدان بيانات الاستشعار.

فترة أخذ العينات

فترة أخذ العينات لها معنى مختلف بناءً على نوع المستشعر الذي يتم تكوينه:

  • مستمر: يتم إنشاء أحداث المستشعر بمعدل مستمر.
  • عند التغيير: لا يتم إنشاء الأحداث أسرع من فترة أخذ العينات ويمكن إنشاؤها بمعدل أبطأ من فترة أخذ العينات إذا لم تتغير القيمة المقاسة.
  • طلقة واحدة: يتم تجاهل فترة أخذ العينات.
  • خاص: لمزيد من التفاصيل، انظر أنواع الاستشعار .

لمعرفة المزيد عن التفاعل بين فترة أخذ العينات وطرق الإبلاغ عن جهاز استشعار، انظر التقارير وسائط .

الحد الأقصى لوقت استجابة التقارير

يحدد الحد الأقصى لوقت استجابة التقارير الحد الأقصى للوقت بالنانو ثانية الذي يمكن فيه تأخير الأحداث وتخزينها في الجهاز FIFO قبل كتابتها إلى Event FMQ من خلال HAL أثناء تنبيه SoC.

تشير القيمة صفر إلى أنه يجب الإبلاغ عن الأحداث بمجرد قياسها ، إما تخطي FIFO تمامًا ، أو إفراغ FIFO بمجرد وجود حدث واحد من المستشعر في FIFO.

على سبيل المثال ، مقياس التسارع الذي يتم تنشيطه عند 50 هرتز مع وقت استجابة أقصى للإبلاغ يبلغ صفر ، يقطع 50 مرة في الثانية عندما يكون SoC مستيقظًا.

عندما يكون الحد الأقصى لوقت استجابة التقارير أكبر من الصفر ، لا يلزم الإبلاغ عن أحداث المستشعر بمجرد اكتشافها. يمكن تخزين الأحداث مؤقتًا في جهاز ما يرد أولاً يصرف أولاً (FIFO) والإبلاغ عنها على دفعات ، طالما لم يتأخر أي حدث بأكثر من الحد الأقصى لوقت استجابة التقارير. يتم تسجيل جميع الأحداث منذ الدفعة السابقة وإعادتها مرة واحدة. هذا يقلل من عدد المقاطعات المرسلة إلى SoC ويسمح لشركة SoC بالتبديل إلى وضع طاقة أقل أثناء قيام المستشعر بالتقاط البيانات وتجميعها.

كل حدث له طابع زمني مرتبط به. يجب ألا يؤثر تأخير وقت الإبلاغ عن الحدث على الطابع الزمني للحدث. يجب أن يكون الطابع الزمني دقيقًا ويتوافق مع الوقت الذي وقع فيه الحدث فعليًا ، وليس وقت الإبلاغ عنه.

للحصول على معلومات ومتطلبات إعداد التقارير على الأحداث الاستشعار مع أقصى صفرية الكمون تقارير إضافية، راجع للتجزئة .

تفعيل أجهزة الاستشعار

تمكن إطار وتعطيل أجهزة الاستشعار باستخدام activate() وظيفة. قبل تفعيل جهاز استشعار، يجب على الإطار الأول تكوين أجهزة الاستشعار باستخدام batch() .

بعد إلغاء تنشيط المستشعر ، يجب عدم كتابة أحداث المستشعر الإضافية من هذا المستشعر في Event FMQ.

مجسات التنظيف

إذا تم تكوين جهاز استشعار لبيانات الاستشعار دفعة، يمكن للإطار فرض على تدفق فوري للأحداث استشعار دفعات عن طريق الاتصال flush() . يؤدي هذا إلى كتابة أحداث المستشعر المجمعة لمقبض المستشعر المحدد على الفور إلى Event FMQ. ومجسات HAL يجب إلحاق كاملة الحدث دافق إلى نهاية الأحداث الاستشعار التي تتم كتابتها نتيجة للدعوة إلى flush() .

يحدث التدفق بشكل غير متزامن (أي ، يجب أن تعود هذه الوظيفة على الفور). إذا كان التطبيق يستخدم FIFO واحدًا للعديد من أجهزة الاستشعار ، فسيتم مسح ما يرد أولاً يصرف أولاً ثم تتم إضافة حدث التدفق الكامل لجهاز الاستشعار المحدد فقط.

إذا كان جهاز استشعار محدد لا يوجد لديه FIFO (لا التخزين المؤقت ممكن)، أو إذا كان FIFO فارغة في وقت المكالمة، flush() يجب أن تزال تنجح وإرسال كاملة الحدث دافق لهذا الاستشعار. ينطبق هذا على جميع المستشعرات بخلاف المستشعرات أحادية الطلقة.

إذا flush() يسمى لاستشعار طلقة واحدة، ثم flush() لا بد من العودة BAD_VALUE ولا تولد كاملة الحدث دافق.

أحداث مستشعر الكتابة إلى FMQ

يتم استخدام Event FMQ بواسطة Sensors HAL لدفع أحداث المستشعر إلى إطار عمل مستشعر Android.

حدث FMQ هو FMQ متزامن ، مما يعني أن أي محاولة لكتابة المزيد من الأحداث إلى FMQ أكثر من المساحة المتاحة تسمح بنتائج كتابة فاشلة. في مثل هذه الحالة ، يجب أن تحدد HAL ما إذا كان يجب كتابة المجموعة الحالية من الأحداث كمجموعتين أصغر من الأحداث أو كتابة كل الأحداث معًا عند توفر مساحة كافية.

عندما مجسات وHAL تمت كتابة العدد المرغوب فيه من أحداث استشعار لFMQ حدث، يجب على HAL مجسات إخطار الإطار أن الأحداث جاهزة عن طريق كتابة EventQueueFlagBits::READ_AND_PROCESS قليلا إلى FMQ حدث في EventFlag::wake ظيفة. يمكن إنشاء EventFlag من FMQ الحدث باستخدام EventFlag::createEventFlag وFMQ حدث في getEventFlagWord() وظيفة.

مجسات HAL 2.0 / 2.1 يدعم كلا write و writeBlocking على FMQ الحدث. يوفر تطبيق الافتراضي إشارة لاستخدام write . إذا كان writeBlocking يستخدم وظيفة، و readNotification يجب وضع اشارة إلى EventQueueFlagBits::EVENTS_READ ، وهو يحدد من قبل الإطار عندما يقرأ الأحداث من FMQ الحدث. يجب تعيين العلم إخطار الكتابة إلى EventQueueFlagBits::READ_AND_PROCESS ، والتي تبلغ الإطار أن الأحداث قد كتب إلى FMQ الحدث.

أحداث WAKE_UP

WAKE_UP الأحداث هي أحداث الاستشعار التي تسبب المعالج التطبيق (AP) إلى الاستيقاظ والتعامل مع الحدث مباشرة. كلما WAKE_UP هو مكتوب الحدث إلى FMQ حدث، يجب على HAL مجسات تأمين قفل أعقاب لضمان أن يبقى مستيقظا حتى نظام الإطار يمكن التعامل مع هذا الحدث. عند تلقي WAKE_UP الحدث، والإطار يؤمن قفل أعقاب الخاص بها، مما يسمح للHAL مجسات للافراج عن قفل أعقابها. للمزامنة عندما يحرر Sensors HAL قفل التنبيه الخاص به ، استخدم Wake Lock FMQ.

ومجسات HAL يجب قراءة ويك قفل FMQ لتحديد عدد من WAKE_UP الأحداث التي إطار عالجت. ينبغي أن HAL فقط الافراج عن قفل أعقابها ل WAKE_UP الأحداث إذا كان عدد غير معالج WAKE_UP الأحداث هو صفر. بعد التعامل مع الأحداث الاستشعار، وبحساب إطار عدد من الأحداث التي تحمل علامة WAKE_UP الأحداث ويكتب هذا العدد إلى ويك قفل FMQ.

يحدد الإطار WakeLockQueueFlagBits::DATA_WRITTEN إخطار الكتابة على ويك قفل FMQ كلما فإنه يكتب البيانات إلى ويك قفل FMQ.

مجسات ديناميكية

المستشعرات الديناميكية هي مستشعرات لا تعد جزءًا فعليًا من الجهاز ولكن يمكن استخدامها كمدخلات للجهاز ، مثل لوحة الألعاب مع مقياس التسارع.

عندما يتم توصيل جهاز استشعار ديناميكية، و onDynamicSensorConnected وظيفة في ISensorsCallback يجب استدعاء من HAL مجسات. يقوم هذا بإعلام إطار عمل المستشعر الديناميكي الجديد ويسمح بالتحكم في المستشعر من خلال الإطار واستهلاك أحداث المستشعر من قبل العملاء.

وبالمثل، عندما يتم قطع جهاز استشعار ديناميكية، و onDynamicSensorDisconnected وظيفة في ISensorsCallback يجب أن يسمى هذا الإطار يمكن إزالة أي أجهزة الاستشعار التي لم تعد متوفرة.

قناة مباشرة

القناة المباشرة هي طريقة تشغيل حيث تتم كتابة أحداث المستشعر على ذاكرة معينة بدلاً من Event FMQ لتجاوز إطار عمل أجهزة استشعار Android. يجب على العميل الذي يسجل قناة مباشرة قراءة أحداث المستشعر مباشرة من الذاكرة التي تم استخدامها لإنشاء القناة المباشرة ولن يتلقى أحداث المستشعر من خلال إطار العمل. و configDirectReport() وظيفة مشابهة ل batch() للتشغيل العادي وتكوين القناة تقرير المباشرة.

و registerDirectChannel() و unregisterDirectChannel() وظائف خلق أو تدمير قناة جديدة مباشرة.

وسائط التشغيل

و setOperationMode() تسمح وظيفة للإطار لتكوين جهاز استشعار بحيث الإطار يمكن حقن بيانات الاستشعار في الاستشعار. هذا مفيد للاختبار ، خاصة بالنسبة للخوارزميات الموجودة أسفل إطار العمل.

و injectSensorData() وظيفة في HAL 2.0 و injectSensorsData_2_1() يتم استخدام الدالة في HAL 2.0 عادة لدفع المعلمات التشغيلية إلى مجسات وHAL. يمكن أيضًا استخدام الوظيفة لحقن أحداث المستشعر في مستشعر معين.

تصديق

للتحقق من صحة تنفيذ Sensors HAL ، قم بتشغيل اختبارات CTS و VTS الخاصة بالمستشعر.

اختبارات CTS

توجد اختبارات Sensor CTS في كل من اختبارات CTS الآلية وتطبيق CTS Verifier اليدوي.

توجد اختبارات مؤتمتة في سنت / الاختبارات / استشعار / SRC / الروبوت / الأجهزة / سنت . تتحقق هذه الاختبارات من الوظائف القياسية لأجهزة الاستشعار ، مثل تنشيط أجهزة الاستشعار ، والتجميع ، ومعدلات أحداث المستشعرات.

توجد اختبارات CTS متحقق في سنت / التطبيقات / CtsVerifier / SRC / كوم / الروبوت / سنت / المدقق / أجهزة الاستشعار . تتطلب هذه الاختبارات إدخالًا يدويًا من مشغل الاختبار والتأكد من أن المستشعرات تبلغ عن قيم دقيقة.

يعد اجتياز اختبارات CTS أمرًا بالغ الأهمية للتأكد من أن الجهاز قيد الاختبار يلبي جميع متطلبات العناية الواجبة.

اختبارات VTS

تقع الاختبارات VTS عن مجسات HAL 2.0 في الأجهزة / واجهات / أجهزة الاستشعار / 2.0 / خدمة حركة السفن . تقع الاختبارات VTS عن مجسات HAL 2.1 في الأجهزة / واجهات / أجهزة الاستشعار / 2.1 / خدمة حركة السفن . هذه الاختبارات التأكد من أن HAL مجسات يتم تنفيذه بشكل صحيح وأن جميع المتطلبات المنصوص عليها في ISensors.hal و ISensorsCallback.hal الوفاء بشكل صحيح.

الترقية إلى Sensors HAL 2.1 من 2.0

عندما الترقية إلى مجسات HAL 2.1 من 2.0، يجب أن يتضمن تنفيذ HAL الخاص بك initialize_2_1() ، getSensorsList_2_1() ، و injectSensorsData_2_1() طرق، جنبا إلى جنب مع أنواع HAL 2.1. يجب أن تفي هذه الطرق بنفس المتطلبات الموضحة لـ HAL 2.0 أعلاه.

نظرًا لأن الإصدار الثانوي من HALs يجب أن يدعم جميع الوظائف من HALs السابقة ، يجب أن تدعم 2.1 HALs التهيئة كـ 2.0 HALs. لتجنب تعقيد دعم كلا الإصدارين HAL ، يوصى بشدة باستخدام Multi-HAL 2.1.

للحصول على مثال لكيفية تنفيذ مجسات الخاصة بك 2.1 HAL، انظر Sensors.h .

الترقية إلى Sensors HAL 2.0 من 1.0

عند الترقية إلى Sensors HAL 2.0 من 1.0 ، تأكد من أن تطبيق HAL الخاص بك يفي بالمتطلبات التالية.

تهيئة HAL

على initialize() يجب أن تكون معتمدة من وظيفة لإنشاء FMQs بين الإطار وHAL.

كشف أجهزة الاستشعار المتوفرة

في مجسات HAL 2.0، getSensorsList() يجب أن الدالة بإرجاع نفس القيمة خلال تمهيد جهاز واحد، حتى عبر إعادة تشغيل مجسات HAL. شرط جديد لل getSensorsList() وظيفة هو أن يجب أن تعيد نفس القيمة خلال تمهيد جهاز واحد، حتى عبر إعادة تشغيل مجسات HAL. يسمح هذا لإطار العمل بمحاولة إعادة إنشاء اتصالات أجهزة الاستشعار في حالة إعادة تشغيل خادم النظام. القيمة التي تم إرجاعها من قبل getSensorsList() يمكن أن تتغير بعد ينفذ الجهاز إعادة التشغيل.

أحداث مستشعر الكتابة إلى FMQ

بدلا من الانتظار ل poll() ليتم استدعاؤها، في مجسات HAL 2.0، يجب مجسات وHAL الأحداث استشعار استباقي الكتابة إلى FMQ الحدث كلما تتوفر الأحداث الاستشعار. وHAL مسؤولة أيضا عن كتابة البتات الصحيحة ل EventFlag أن تسبب FMQ قراءة في إطار.

أحداث WAKE_UP

في مجسات HAL 1.0، كان قادرا على إطلاق سراح قفل أعقابه لأي من HAL WAKE_UP الحدث على أي استدعاء لاحقة poll() بعد WAKE_UP تم نشرها إلى poll() لأن هذا أشار إلى أن الإطار قد جهزت كل الأحداث استشعار وحصلت على قفل التنبيه ، إذا لزم الأمر. لأنه، في مجسات HAL 2.0 HAL لم يعد يعرف متى الإطار تمت معالجة الأحداث مكتوبة إلى FMQ، ويك قفل FMQ يسمح إطار التواصل إلى HAL عند التعامل معها WAKE_UP الأحداث.

في مجسات HAL 2.0، وقفل أعقاب المضمون HAL مجسات ل WAKE_UP يجب أن الأحداث تبدأ SensorsHAL_WAKEUP .

مجسات ديناميكية

أعيدت أجهزة الاستشعار الحيوية باستخدام poll() وظيفة في مجسات HAL 1.0. مجسات HAL 2.0 يتطلب أن onDynamicSensorsConnected و onDynamicSensorsDisconnected في ISensorsCallback أن يسمى كلما ديناميكية التغيير وصلات الحساسات. تتوفر كجزء من هذه الاسترجاعات ISensorsCallback المؤشر التي يتم توفيرها من خلال initialize() وظيفة.

وسائط التشغيل

و DATA_INJECTION وضع ل WAKE_UP يجب أن تدعم أجهزة الاستشعار في مجسات HAL 2.0.

دعم متعدد HAL

مجسات HAL 2.0 و 2.1 الدعم متعدد HAL باستخدام إطار استشعار متعدد HAL . للحصول على تفاصيل التنفيذ، انظر ترقية من مجسات HAL 1.0 .