ממשק 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 באופן אסינכרוני. התוצאה מועברת באמצעות שיטת ה-callback onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
הגדר ערכי מאפייני הרכב באופן אסינכרוני. מטפל באצווה של SetValueRequest באופן אסינכרוני. התוצאה מועברת באמצעות שיטת onSetValues ​​של התקשרות חוזרת.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
נרשם לאירועי נכס עם אפשרויות מוגדרות. אפשרויות המנוי כוללות מזהה נכס, מזהה אזור נכס וקצב דגימה בהרץ (עבור נכס רציף). maxSharedMemoryFileCount אינו בשימוש.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
מבטל את המנוי של אירועי נכס שנרשמו בעבר עבור נכסים שצוינו.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
לא בשימוש וניתן ליישם אותו ללא הפעלה.

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

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

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

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

חפצים גדולים

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

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

לדוגמה, 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 מכיל מטענים לא ריקים או sharedMemoryFd שאינו ריק.

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

כלקוח Java עבור VHAL, Car Service מטפל בסידרה ובסידריאליזציה עבור LargeParcelable . עבור יישומי VHAL ולקוחות מקומיים, LargeParcelable צריך להיות מסודר וסיריאליזציה עם ספריית LargeParcelable או מחלקה עטיפה שימושית עבור הספרייה ב- ParcelableUtils.h .

לדוגמה, בקשות לניתוח של לקוח מקורי עבור getValues ​​שהתקבלו מקלסר הוא כדלקמן:

// '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.
}