הוצאה משימוש של גרסת HAL

במהדורת L של Android, אנחנו מפסיקים את התמיכה בגרסאות מסוימות של HAL לחיישנים. הגרסאות הנתמכות היחידה הן SENSORS_DEVICE_API_VERSION_1_0 ו-SENSORS_DEVICE_API_VERSION_1_3.

בגרסאות הבאות סביר להניח שנפסיק גם את התמיכה ב-1_0.

ב-1_0 אין מושג של צבירה. אם אפשר, צריך לשדרג את כל המכשירים עם הגרסה 1_0 לגרסה 1_3.

ב-1_1 וב-1_2 יש הגדרה לא טובה של מושג האצווה, והם לא נתמכים יותר

כל המכשירים שמשתמשים כרגע בגרסה 1_1 או 1_2 חייבים לשדרג לגרסה 1_3.

בגרסה 1_3 הפכנו את הרעיון של קיבוץ בקשות לפשוט יותר והוספנו חיישני התעוררות.

כדי לשדרג לגרסה 1_3, מבצעים את השינויים המפורטים בהמשך.

הטמעת פונקציית האצווה

גם אם לא מטמיעים אצווה (אין בחומרה FIFO), צריך להטמיע את הפונקציה batch. השדה batch משמש להגדרת תקופת הדגימה וזמן האחזור המקסימלי לדיווח של חיישן נתון. הוא מחליף את setDelay. לא יתבצעו יותר שיחות אל setDelay.

אם לא מטמיעים את האצווה, אפשר להטמיע את batch פשוט על ידי קריאה לפונקציה הקיימת setDelay עם הפרמטר sampling_period_ns שסופק.

הטמעת פונקציית ה-flush

גם אם לא מטמיעים את האצווה, צריך להטמיע את הפונקציה flush.

אם לא מטמיעים את האצווה, flush חייבת ליצור אירוע META_DATA_FLUSH_COMPLETE אחד ולהחזיר 0 (הצלחה).

שינוי השדה sensors_poll_device_t.common.version

your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3

מוסיפים את השדות החדשים להגדרה של החיישנים

כשמגדירים כל חיישן, בנוסף לשדות הרגילים של sensor_t:

.name =       "My magnetic field Sensor",
.vendor =     "My company",
.version
=    1,
.handle =     mag_handle,
.type =       SENSOR_TYPE_MAGNETIC_FIELD,
.maxRange =   200.0f,
.resolution = CONVERT_M,
.power =      5.0f,
.minDelay =
 16667,

צריך גם להגדיר את השדות החדשים, שמוגדרים בין 1_0 ל-1_3:

.fifoReservedEventCount = 0,
.fifoMaxEventCount =   0,
.stringType =         0,
.requiredPermission = 0,
.maxDelay =      200000
.flags =
SENSOR_FLAG_CONTINUOUS_MODE,

fifoReservedEventCount: אם לא מטמיעים אצווה, מגדירים את הערך הזה ל-0.

fifoMaxEventCount: אם לא מטמיעים אצווה, מגדירים את הערך הזה ל-0

stringType: מגדירים את הערך 0 לכל החיישנים הרשמיים של Android (אלה שמוגדרים ב-sensors.h), כי הערך הזה יוחלף על ידי המסגרת. לפרטים על הגדרת חיישנים לא רשמיים, ראו sensor_t.

requiredPermission: זו ההרשאה שתצטרכו להעניק לאפליקציות כדי שתהיה להן גישה לחיישן. בדרך כלל אפשר להגדיר את הערך הזה ל-0 לכל החיישנים, אבל חיישנים מסוג HEART_RATE חייבים להגדיר את הערך הזה ל-SENSOR_PERMISSION_BODY_SENSORS.

maxDelay: הערך הזה חשוב וצריך להגדיר אותו בהתאם ליכולות של החיישן ושל מנהל ההתקן שלו.

הערך הזה מוגדר רק לחיישנים רצופיים ולחיישנים שמתעדכנים בזמן אמת. זהו העיכוב בין שני אירועי חיישן שתואמים לתדירות הנמוכה ביותר שהחיישן תומך בה. כשמבקשים תדרים נמוכים יותר באמצעות הפונקציה batch, האירועים נוצרים בתדירות הזו במקום זאת. אפשר להשתמש בו על ידי המסגרת או האפליקציות כדי להעריך מתי ה-FIFO של האצווה עשוי להתמלא. אם הערך הזה לא מוגדר כראוי, הבדיקה של CTS תיכשל. לחיישנים עם דיווח חד-פעמי ובמצב דיווח מיוחד, מגדירים את maxDelay כ-0.

בחיישנים רצופיים, מגדירים את פרק הזמן המקסימלי לדגימה במיקרו-שניות.

הפרטים הבאים רלוונטיים ל-period_ns, ל-maxDelay ול-minDelay:

  • הערך של period_ns הוא בננו-שניות, ואילו הערכים של maxDelay/minDelay הם במיליוניות השנייה.
  • הערך של maxDelay צריך תמיד להתאים למספר שלם חתום באורך 32 ביט. הוא מוגדר כ-64 סיביות בארכיטקטורות של 64 סיביות רק מסיבות של תאימות בינארית.

flags: השדה הזה מגדיר את אופן הדיווח של החיישן ואת העובדה שהוא חיישן להפעלה.

אם לא מטמיעים אצווה, ורק עוברים מ-1.0 ל-1.3, מגדירים את הערך הזה בתור:

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE לחיישנים חד-פעמיים

SENSOR_FLAG_CONTINUOUS_MODE לחיישנים רציפים, SENSOR_FLAG_ON_CHANGE_MODE לחיישנים שמשנים את הערך, מלבד חיישן הקרבה, SENSOR_FLAG_SPECIAL_REPORTING_MODE לחיישנים עם מצב דיווח מיוחד, מלבד גלאי ההטיה.

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE עבור חיישן הקרבה וחיישן זיהוי הטיה הרשמי של Android.

הערות לגבי שדרוג מגרסה 1_1 או 1_2

  • הפונקציה batch מצליחה כמעט תמיד, גם בחיישניים שלא תומכים בצבירה, ללא קשר לערך של ארגומנט הזמן הקצוב לתפוגה. הפונקציה batch עשויה להיכשל רק במקרים של שגיאות פנימיות, או אם הערך של sensor_handle, שגוי, או אם הערך של sampling_period_ns או max_report_latency_ns שלילי.
  • כדי לבדוק אם חיישן תומך בצבירה, צריך לבדוק אם הערך של fifoMaxEventCount גדול מ-0. (בגרסאות קודמות, הוא היה מבוסס על ערך ההחזרה של batch()).
  • חיישנים שתומכים בצבירה תמיד נמצאים במצב שקראנו לו 'מצב צבירה' בגרסאות קודמות: גם אם הערך של הפרמטר max_report_latency_ns הוא 0, עדיין צריך לצבור את הנתונים מהחיישן, כלומר האירועים צריכים להישמר ב-FIFO כש-SoC עובר למצב השהיה.
  • הפרמטר flags של הפונקציה batch לא בשימוש יותר. גם DRY_RUN וגם WAKE_UPON_FIFO_FULL הוצאו משימוש, והם אף פעם לא יועברו לפונקציה batch.
  • הארגומנט של זמן הקצאת הזמן לקבוצה נקרא עכשיו הארגומנט max_report_latency.