ממשק VHAL

ה-AIDL VHAL מוגדר android.hardware.automotive.vehicle namespace ממשק VHAL מוגדר IVehicle.aidl אם לא צוין אחרת, יש ליישם את כל השיטות.

שיטה
VehiclePropConfigs getAllPropConfigs()
מחזיר רשימה של הכול תמיכה בהגדרות הנכס עם ה-HAL של הרכב.
VehiclePropConfigs getPropConfigs(in int[] props)
מחזיר רשימה של הגדרות הנכס של הנתונים מזהי נכסים.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
משיגים ערכים של נכסי רכב באופן אסינכרוני. טיפול במקבץ של GetValueRequest באופן אסינכרוני. התוצאה נמסרת באמצעות שיטת onGetValues של קריאה חוזרת.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
מגדירים ערכים של נכסי רכב באופן אסינכרוני. טיפול בקבוצה של SetValueRequest באופן אסינכרוני. התוצאה נמסרת באמצעות שיטת onSetValues של קריאה חוזרת.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
הרשמה לאירועי נכסים עם אפשרויות ספציפיות. אפשרויות ההרשמה כוללות מזהה הנכס, מזהה אזור הנכס ותדירות הדגימה ב-Hz (לנכס מתמשך). maxSharedMemoryFileCount לא בשימוש.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
ביטול ההרשמה לאירועי נכסים שנרשמו בעבר עבור נכסים ספציפיים.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
לא בשימוש, וניתן להטמיע אותו כ'לא פעיל'.

הקריאה החוזרת (callback) מוגדרת בכתובת IVehicleCallback.aidl ומכיל את השיטות האלה.

שיטה
oneway void onGetValues(in GetValueResults responses)
התקשרות חזרה לפונקציה getValues כדי לספק תוצאות משמעותיות. התקשרת כשחלק מהערכים לאחזור מוכנים.
oneway void onSetValues(in SetValueResults responses)
התקשרות חזרה לפונקציה setValues כדי לספק תוצאות עם ערכים מוגדרים. התקשרת כאשר VHAL סיים לטפל בחלק מהבקשות לקבוצות נכסים.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
קריאה חוזרת (callback) לדיווח על אירועי עדכון נכסים.
נכס
CONTINUOUS, אירוע בנכס מתרחש על סמך תדירות דגימה של מינויים ב-Hz או בתדירות ההודעות באוטובוס הרכב. אירוע בנכס עשוי להתרחש גם אם נכס בסטטוסים משתנים. לדוגמה, מ'לא זמין' ל'זמין'.
בנכס ON_CHANGE, אירוע בנכס מתרחש כשערך הנכס או שינויים בסטטוס של נכס.
SharedMemoryFileCount הוא תמיד 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
קריאה חוזרת (callback) לדיווח על שגיאות בקבוצת נכס אסינכרונית שלא הוגדרו להן התאמות בקשה. אם אנחנו יודעים לאיזו בקשה מוגדרת השגיאה, הפונקציה onSetValues עם במקום זאת חייבים להשתמש בתוצאת השגיאה הזאת.

מידע נוסף זמין במאמר הבא: IVehicle.aidl וגם IVehicleCallback.aidl

ההטמעה של VHAL מאומתת על ידי VHAL VTS VtsHalAutomotiveVehicle_TargetTest.cpp. הבדיקה מאמתת ששיטות בסיסיות מוטמעות בצורה תקינה ושהנכס הנתמך קיים שההגדרות האישיות שלו נכונות.

ערך נכס הרכב

משתמשים ב VehiclePropValue שמתאר את הערך של כל נכס, שכולל את השדות הבאים:

שדה תיאור
timestamp חותמת הזמן שמייצגת את הזמן שבו האירוע התרחש והסתנכרנה עם שעון SystemClock.elapsedRealtimeNano().
prop מזהה הנכס עבור הערך הזה.
areaid מזהה האזור של הערך הזה. האזור חייב להיות אחד מהאזורים הנתמכים שמפורטים באזור הגדרת המזהה, או 0 לנכסים גלובליים.
value מבנה נתונים שמכיל את ערך הנכס בפועל. על סמך סוג הנכס, מזינים יותר שדות בשדה הזה משמשים לאחסון הערך בפועל. לדוגמה, הסימן הראשון ברכיב value.int32Values נעשה שימוש במאפיינים מסוג Int32. פרטים נוספים זמינים במאמר נכס הגדרות אישיות

getValues ו-setValues אסינכרוניים

הפעולות getValues ו-setValues מבוצעות באופן אסינכרוני, כלומר, הפונקציה עשויה לחזור לפני שפעולת get או set הושלמה. תוצאות הפעולה (למשל, ערך הנכס עבור getValues והצלחה או סטטוס שגיאה עבור setValues) מועברים באמצעות הקריאות החוזרות (callback) שמועברות כארגומנטים.

אסור שההטמעה תיחסם בתוצאה ב-thread של הקישור שמטפל בבקשה. במקום זאת, מומלץ לאחסן את הבקשה בתור בקשות ולהשתמש בשרשור נפרד של handler כדי לטפל בבקשות באופן אסינכרוני. לצפייה הטמעת קובצי עזר עבור פרטים.

איור 1. תהליך אסינכרוני.

מגרשים גדולים

כל המבנים עם השם XXXs, כמו VehiclePropConfigs, SetValueRequests ו-VehiclePropValues נקראים LargeParcelable (או, StableLargeParcelable). כל אחד מהם מייצג רשימה של שמשמשים להעברת נתונים גדולים שעשויים לחרוג ממגבלות הקישור (4KB בשדה הטמעת ספריית LargeParcelable) חוצה את הגבולות של הקישורים. לכל אחת יש של המבנה שכולל את השדות הבאים.

הדרכה תיאור
payloads רשימת ערכים כשגודל הערך מתאים להגבלת זיכרון של קלסר או לרשימה ריקה.
sharedMemoryFd מתאר קובץ אפסי שמצביע על קובץ זיכרון משותף שמאחסן את הקובץ הסידורי מטענים ייעודיים (payloads) אם רשימת הערכים גדולה מדי.

לדוגמה, VehiclePropConfigs מוגדר כך:

parcelable VehiclePropConfigs {
    // The list of vehicle property configs if they fit the binder memory
    // limitation.
    VehiclePropConfig[] payloads;
    // Shared memory file to store configs if they exceed binder memory
    // limitation. Created by VHAL, readable only at client. Client could keep
    // the fd opened or keep the FD mapped to access configs.
    @nullable ParcelFileDescriptor sharedMemoryFd;
}

VehiclePropConfigs מכיל מטענים ייעודיים (payloads) שאינם ריקים או ערך שאינו null sharedMemoryFd.

  • אם השדה payloads לא ריק, נשמרת רשימה של הנתונים בפועל, הגדרות הנכס.
  • אם הערך של sharedMemoryFd לא ריק, יש בו קובץ זיכרון משותף שמאחסן את המבנה הסידורי של VehiclePropConfigs. המבנה משתמש הפונקציה writeToParcel כדי ליצור סדרות נתונים של חבילה.

כלקוח Java של VHAL, שירות Car Service מטפל בסריאליזציה ובפעולת ההמרה (deserialization) עבור LargeParcelable בהטמעות VHAL ובלקוחות נייטיב, צריך לבצע סריאליזציה ל-LargeParcelable ולבצע פעולת deserialize באמצעות LargeParcelable או מחלקה של wrapper שמועילה עבור הספרייה ParcelableUtils.h

לדוגמה, בקשות ניתוח של לקוח נייטיב עבור getValues שהתקבלו מ-Binder הוא:

// 'requests' are from the binder.
GetValueRequests requests;
expected, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests);
if (deserializedResults.ok()) {
    const std::vector& getValueRequests = deserializedResults.value().getObject()->payloads;
    // Use the getValueRequests.
  } else {
    // handle error.
}

הטמעת VHAL לדוגמה ששולחת תוצאות בשביל getValues דרך הקישור מוצגת למטה:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}