الإدخال

رمز Android Input HAL

يتألف النظام الفرعي لإدخال البيانات في Android بشكل أساسي من مسار أحداث يمر عبر طبقات متعددة من النظام.

مسار الإدخال

في أدنى طبقة، يُصدر جهاز الإدخال المادي إشارات تصِف تغييرات الحالة، مثل الضغط على المفاتيح ونقاط الاتصال باللمس. يُشفِّر برنامج الجهاز الثابت هذه الإشارات وينقلها بطريقة ما، مثل إرسال تقارير USB HID إلى النظام أو عن طريق توليد عمليات إيقاف مؤقت على ناقل I2C.

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

تتحمّل برامج تشغيل أجهزة الإدخال مسؤولية ترجمة الإشارات الخاصة بالجهاز إلى تنسيق حدث إدخال عادي، وذلك من خلال بروتوكول إدخال Linux. يحدّد بروتوكول إدخال Linux مجموعة قياسية من أنواع الأحداث ورموزها في ملف linux/input.h header kernel. بهذه الطريقة، لا تحتاج المكوّنات خارج النواة إلى الاهتمام بالتفاصيل، مثل رموز المسح الضوئي المادي واستخدامات HID ورسائل I2C ومقبسات GPIO وما إلى ذلك.

بعد ذلك، يقرأ مكوّن EventHub في Android أحداث الإدخال من النواة عن طريق فتح برنامج تشغيل evdev المرتبط بكل جهاز إدخال. بعد ذلك، يفكّك مكوّن Android InputReader ترميز أحداث الإدخال وفقًا لفئة الجهاز وينشئ بثًا لأحداث إدخال Android. وكجزء من هذه العملية، تتم ترجمة رموز أحداث بروتوكول إدخال Linux إلى رموز أحداث Android وفقًا لإعدادات جهاز الإدخال وملفات تنسيق لوحة المفاتيح ومختلف جداول الربط.

أخيرًا، يُرسِل InputReader أحداث الإدخال إلى InputDispatcher الذي يعيد توجيهها إلى النافذة المناسبة.

نقاط التحكّم

هناك عدة مراحل في مسار الإدخال تؤثر في التحكّم في سلوك جهاز الإدخال.

ضبط برنامج التشغيل والبرامج الثابتة

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

غالبًا ما يتم تحديد خيارات ضبط برنامج التشغيل كمَعلمات للوحدة في حزمة دعم اللوحة الأساسية (BSP) لكي يتمكّن برنامج التشغيل نفسه من دعم عمليات تنفيذ متعددة للأجهزة المختلفة.

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

خصائص إعدادات اللوحة

قد تُصدِر حزمة دعم اللوحة الأساسية (BSP) خصائص إعدادات اللوحة من خلال SysFS التي يستخدمها مكوّن InputReader في Android، مثل موضع المفاتيح الافتراضية على شاشة تعمل باللمس.

راجِع أقسام فئة الأجهزة للحصول على تفاصيل عن كيفية استخدام مختلف الأجهزة لخصائص ضبط اللوحة.

تراكب الموارد

يتم ضبط بعض سلوكيات الإدخال من خلال تراكب الموارد في config.xml، مثل تشغيل مفتاح الغطاء.

وفي ما يلي بعض الأمثلة على ذلك:

  • config_lidKeyboardAccessibility: لتحديد تأثير مفتاح التبديل في الغطاء على إمكانية الوصول إلى لوحة المفاتيح المدمجة أو إخفائها

  • config_lidNavigationAccessibility: لتحديد تأثير مفتاح التبديل في الغطاء على إمكانية الوصول إلى لوحة اللمس أو إخفائها.

  • config_longPressOnPowerBehavior: لتحديد ما يجب أن يحدث عندما يضغط المستخدم مع الاستمرار على زر التشغيل

  • config_lidOpenRotation: لتحديد تأثير مفتاح التبديل في الغطاء على اتجاه الشاشة

يمكنك الرجوع إلى المستندات ضمن frameworks/base/core/res/res/values/config.xml للاطّلاع على تفاصيل حول كل خيار إعداد.

خرائط المفاتيح

تستخدِم مكوّنات EventHub وInputReader في Android خطط المفاتيح لضبط التعيين من رموز أحداث Linux إلى رموز أحداث Android للمفاتيح وأزرار ذراع التحكم ومحاور ذراع التحكم. قد يعتمد ربط المحتوى على الجهاز أو اللغة.

راجِع أقسام فئات الأجهزة لمعرفة تفاصيل عن كيفية استخدام الأجهزة المختلفة لجداول المفاتيح.

ملفات إعدادات أجهزة الإدخال

تستخدم مكوّنات EventHub و InputReader في Android ملفات ضبط أجهزة الإدخال لضبط خصائص خاصة للجهاز، مثل كيفية تسجيل معلومات حجم اللمس.

راجِع أقسام فئات الأجهزة للحصول على تفاصيل عن كيفية استخدام الأجهزة المختلفة لجداول إعدادات أجهزة الإدخال.

التعرّف على استخدامات HID ورموز الأحداث

غالبًا ما يكون هناك عدة معرّفات مختلفة تُستخدَم للإشارة إلى أي مفتاح معيّن على لوحة مفاتيح أو زر على جهاز تحكّم في الألعاب أو محور عصا التحكم أو جهاز تحكّم آخر. لا تكون العلاقات بين هذه المعرّفات متماثلة دائمًا: فهي تعتمد على مجموعة من جداول الربط، والتي يكون بعضها ثابتًا وبعضها يختلف استنادًا إلى خصائص الجهاز وبرنامج تشغيله واللغة الحالية وإعدادات النظام وإعدادات المستخدم المفضّلة وعوامل أخرى.

رمز الاستجابة السريعة على المنتج

رمز المسح الضوئي المادي هو معرّف خاص بالجهاز مرتبط بكل مفتاح أو زر أو عنصر تحكّم آخر. وبما أنّ رموز المسح الضوئي المادية تختلف غالبًا من جهاز إلى آخر، يكون برنامج التشغيل أو البرامج الثابتة للجهاز مسؤولاً عن ربطها بالمعرِّفات العادية، مثل استخدامات HID أو رموز مفاتيح Linux.

تُستخدم الرموز المخصّصة للمسح الضوئي بشكل أساسي في لوحات المفاتيح. تتواصل الأجهزة الأخرى عادةً على مستوى منخفض باستخدام أطراف GPIO أو رسائل I2C أو وسائل أخرى. ونتيجةً لذلك، تعتمد الطبقات العليا من بنية البرامج على برامج تشغيل الأجهزة لفهم ما يحدث.

استخدام HID

استخدام HID هو معرّف عادي يُستخدَم للإبلاغ عن حالة عنصر تحكّم، مثل مفتاح لوحة مفاتيح أو محور ذراع تحكّم أو زر ماوس أو نقطة اتصال تعمل باللمس. تتوافق معظم أجهزة الإدخال USB وBluetooth مع مواصفات HID، ما يتيح للنظام التفاعل معها بطريقة موحّدة.

يعتمد إطار عمل Android على برامج تشغيل HID لنظام التشغيل Linux لتحويل رموز استخدام HID إلى رموز مفاتيح Linux ومعرّفات أخرى. لذلك، تهمّ استخدامات HID بشكل أساسي الشركات المصنّعة للأجهزة الطرفية.

رمز مفتاح Linux

رمز مفتاح Linux هو معرّف عادي لمفتاح أو زر. يتم تحديد رموز مفاتيح Linux في ملف الرأس linux/input.h باستخدام ثوابت تبدأ بالبادئة KEY_ أو BTN_. تتحمّل برامج تشغيل إدخال ملف تعريف النظام Linux مسؤولية ترجمة رموزها المخصّصة للفحص واستخدامات HID وغيرها من الإشارات الخاصة بالأجهزة إلى رموز مفاتيح Linux وتقديم معلومات عنها كجزء من أحداث EV_KEY.

تشير واجهة برمجة تطبيقات Android أحيانًا إلى رمز مفتاح Linux المرتبط بمفتاح باسم "رمز المسح الضوئي". هذا غير صحيح من الناحية الفنية، ولكنه يساعد في التمييز بين رموز مفاتيح Linux ورموز مفاتيح Android في واجهة برمجة التطبيقات.

رمز محور Linux النسبي أو المطلق

رمز محور Linux النسبي أو المطلق هو معرّف عادي لتسجيل الحركات النسبية أو المواضع المطلقة على طول محور، مثل الحركات النسبية للفأرة على طول محور X أو الموضع المطلق لعصا التحكم على طول محور X. يتم تحديد رمز محور Linux في ملف الرأس linux/input.h باستخدام ثوابت تبدأ بالبادئة REL_ أو ABS_. تتحمّل برامج تشغيل إدخال ملف تعريف النظام Linux مسؤولية ترجمة استخدامات HID والإشارات الأخرى الخاصة بالأجهزة إلى رموز محاور Linux وتقديم معلومات عنها كجزء من حدثَي EV_REL و EV_ABS.

رمز تبديل Linux

رمز مفتاح التبديل في نظام التشغيل Linux هو معرّف عادي للإبلاغ عن حالة مفتاح التبديل على جهاز، مثل مفتاح التبديل الخاص بغطاء الجهاز. يتم تعريف رموز التبديل في Linux في ملف الرأس linux/input.h باستخدام الثوابت التي تبدأ بالبادئة SW_. تُبلِغ برامج تشغيل إدخال ملف تعريف kernel في Linux عن تغييرات حالة التبديل على أنّها أحداث EV_SW.

لا تتلقّى تطبيقات Android بشكل عام أحداثًا من مفاتيح التبديل، ولكن قد يستخدمها النظام داخليًا للتحكّم في وظائف مختلفة متعلقة بالجهاز.

رمز مفتاح Android

رمز مفتاح Android هو معرّف عادي محدّد في واجهة برمجة التطبيقات Android للإشارة إلى مفتاح معيّن، مثل "HOME". يتم تعريف رموز مفاتيح Android من خلال فئة android.view.KeyEvent على أنّها ثوابت تبدأ بالبادئة KEYCODE_.

يحدِّد تنسيق المفاتيح كيفية ربط رموز مفاتيح Linux برموز مفاتيح Android. قد يتم استخدام تنسيقات مختلفة للمفاتيح حسب لوحة المفاتيح أو طرازها أو لغتها أو بلدها أو تنسيقها أو وظائفها الخاصة.

يتم تحويل مجموعات رموز مفاتيح Android إلى رموز أحرف باستخدام خريطة أحرف مفاتيح خاصة بالجهاز واللغة. على سبيل المثال، عند الضغط على المفتاحَين KEYCODE_SHIFT وKEYCODE_A معًا، يبحث النظام عن هذا التركيب في ملف تمييز الأحرف الخاص بالمفتاحَين ويجد الحرف الكبير "أ"، والذي يتم إدراجه بعد ذلك في التطبيق المصغّر للنص الذي يتم التركيز عليه حاليًا.

رمز محور Android

رمز محور Android هو معرّف عادي محدّد في واجهة برمجة التطبيقات Android للإشارة إلى محور جهاز معيّن. يتم تحديد رموز محاور Android من خلال فئة android.view.MotionEvent على أنّها ثوابت تبدأ بالبادئة AXIS_.

يحدِّد تنسيق المفتاح كيفية ربط رموز محاور Linux برموز محاور Android. قد يتم استخدام تنسيقات مختلفة للمفاتيح حسب طراز الجهاز أو لغته أو بلده أو تنسيقه أو وظائفه الخاصة.

حالة Android الوصفية

حالة العنصر النائب في Android هي معرّف عادي محدّد في واجهة برمجة التطبيقات Android API للإشارة إلى مفاتيح التعديل التي تم الضغط عليها. يتم تعريف حالات العناصر الوصفية في Android بواسطة فئة android.view.KeyEvent على أنّها ثوابت تبدأ بالبادئة META_.

يتم تحديد الحالة الوصفية الحالية من خلال مكوّن InputReader في Android الذي يراقب الضغط على مفاتيح الترميز مثل KEYCODE_SHIFT_LEFT أو تحريرها ويضبط علامة الحالة الوصفية المناسبة أو يعيد ضبطها.

تكون العلاقة بين مفاتيح التعديل والحالات الوصفية برمجية برمجيًا، ولكن يمكن أن يغيّر تنسيق المفاتيح كيفية تحديد مفاتيح التعديل نفسها، مما يؤثّر بدوره في الحالات الوصفية.

حالة زر Android

حالة زر Android هي معرّف عادي محدّد في واجهة برمجة التطبيقات Android API للإشارة إلى الأزرار التي تم الضغط عليها (على الماوس أو قلم الشاشة). يتم تحديد حالات زر Android من خلال فئة android.view.MotionEvent كثوابت تبدأ بالبادئة BUTTON_.

يتم تحديد حالة الزر الحالية من خلال ملف Android InputReader الذي يراقب حالات الضغط على الأزرار (على الماوس أو قلم الشاشة) أو تحريرها ويضبط علامة حالة الزر المناسبة أو يعيد ضبطها.

تكون العلاقة بين الأزرار وحالاتها مضمّنة في الرمز البرمجي.

مراجع إضافية

  1. رموز أحداث الإدخال في Linux
  2. بروتوكول اللمس المتعدّد في Linux
  3. برامج تشغيل الإدخال في Linux
  4. التعليقات والآراء حول ميزة "Force Feedback" في نظام التشغيل Linux
  5. معلومات HID، بما في ذلك جداول استخدام HID