VHAL इंटरफ़ेस

एआईडीएल वीएचएएल के बारे में जानकारी android.hardware.automotive.vehicle namespace में दी गई है. वीएचएएल इंटरफ़ेस को IVehicle.aidl पर तय किया गया है. अगर कोई जानकारी नहीं दी गई है, तो किसी खास VHAL वर्शन के लिए सभी तरीके लागू करने होंगे.

वर्शन

Android वर्शन VHAL का नया वर्शन वीएचएएल प्रॉपर्टी का नया वर्शन VHAL का कम से कम वर्शन
Android 16 V4 V4 V1
Android 15 V3 V3 V1
Android 14 V2 V2 V1
Android 13 V1 (वीएचएएल प्रॉपर्टी इंटरफ़ेस को अलग नहीं किया गया है) V1

हमारा सुझाव है कि किसी खास Android वर्शन के लिए, VHAL का नया वर्शन लागू करें.

फ़ंक्शन और कॉलबैक

वीएचएएल फ़ंक्शन, IVehicle.aidl पर तय किए गए हैं.

Method
VehiclePropConfigs getAllPropConfigs()
इस वीएचएएल के साथ काम करने वाले सभी प्रॉपर्टी कॉन्फ़िगरेशन की सूची दिखाता है.
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)
तय किए गए विकल्पों के साथ प्रॉपर्टी इवेंट की सदस्यता लेता है. सदस्यता लेने के विकल्पों में ये शामिल हैं: प्रॉपर्टी आईडी, प्रॉपर्टी एरिया आईडी, और सैंपल रेट (हर्ट्ज़ में, लगातार चलने वाली प्रॉपर्टी के लिए). maxSharedMemoryFileCount का इस्तेमाल नहीं किया जाता.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
यह उन प्रॉपर्टी के लिए, पहले से सदस्यता ली गई प्रॉपर्टी इवेंट की सदस्यता रद्द कर देता है.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
इस्तेमाल नहीं किया जाता और इसे बिना किसी कार्रवाई के लागू किया जा सकता है.
(Android 16 में नया)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
तय किए गए प्रॉपर्टी आईडी और एरिया आईडी के जोड़े के लिए, इस्तेमाल की जा सकने वाली वैल्यू की सूचियां पाता है.
वीएचएएल V4 में जोड़ा गया.
(Android 16 में नया)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
तय किए गए प्रॉपर्टी आईडी और एरिया आईडी के पेयर के लिए, काम करने वाली सबसे कम और सबसे ज़्यादा वैल्यू दिखाता है.
वीएचएएल V4 में जोड़ा गया.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
इस्तेमाल की जा सकने वाली वैल्यू में बदलाव होने पर, कॉलबैक को रजिस्टर करता है.
वीएचएएल V4 में जोड़ा गया.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
वैल्यू में हुए बदलाव के लिए, इस्तेमाल किए जा सकने वाले कॉलबैक को अनरजिस्टर करता है.
वीएचएएल V4 में जोड़ा गया.

कॉलबैक, IVehicleCallback.aidl में तय किए जाते हैं और इनमें ये मेथड होते हैं.

Method
oneway void onGetValues(in GetValueResults responses)
फ़ंक्शन के लिए कॉलबैक, ताकि वैल्यू के नतीजे दिखाए जा सकें.getValues फ़ेच करने के लिए कुछ वैल्यू तैयार होने पर, इसे कॉल किया जाता है.
oneway void onSetValues(in SetValueResults responses)
फ़ंक्शन के लिए कॉलबैक, ताकि सेट की गई वैल्यू के नतीजे दिखाए जा सकें.setValues यह तब कॉल किया जाता है, जब VHAL, प्रॉपर्टी सेट के कुछ अनुरोधों को मैनेज कर लेता है.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
प्रॉपर्टी अपडेट इवेंट की रिपोर्टिंग के लिए कॉलबैक.
CONTINUOUS प्रॉपर्टी में, किसी प्रॉपर्टी इवेंट का ट्रिगर, Hz या वाहन बस मैसेज फ़्रीक्वेंसी में, subscribe सैंपल रेट के आधार पर होता है. अगर किसी प्रॉपर्टी का स्टेटस बदलता है, तो भी प्रॉपर्टी इवेंट हो सकता है. उदाहरण के लिए, 'उपलब्ध नहीं है' से 'उपलब्ध है' पर.
ON_CHANGE प्रॉपर्टी के लिए, प्रॉपर्टी इवेंट तब होता है, जब प्रॉपर्टी की वैल्यू या प्रॉपर्टी का स्टेटस बदलता है.
इसका इस्तेमाल, प्रॉपर्टी के स्टेटस में हुए बदलाव के इवेंट डिलीवर करने के लिए भी किया जाना चाहिए. उदाहरण के लिए, जब प्रॉपर्टी को पढ़ने में गड़बड़ी होती है या वह उपलब्ध नहीं होती है, तो VehiclePropValue को 'उपलब्ध नहीं है' या 'गड़बड़ी है' के स्टेटस और खाली वैल्यू के साथ डिलीवर किया जाना चाहिए.
SharedMemoryFileCount हमेशा 0 होता है.
oneway void onPropertySetError(in VehiclePropErrors errors)
ऐसे सिंक न होने वाले प्रॉपर्टी सेट की गड़बड़ियों की शिकायत करने के लिए कॉलबैक जिनका कोई सेट करने का अनुरोध नहीं है. अगर हमें पता है कि गड़बड़ी किस सेट अनुरोध के लिए है, तो इसके बजाय, onSetValues के साथ गड़बड़ी के नतीजे का इस्तेमाल किया जाना चाहिए.
oneway void onSupportedValueChange(in List propIdAreaIds)
इस कॉलबैक की मदद से, इस्तेमाल की जा सकने वाली सबसे कम और सबसे ज़्यादा वैल्यू या इस्तेमाल की जा सकने वाली वैल्यू की सूची में हुए बदलावों की रिपोर्टिंग की जा सकती है. कॉल करने वाले व्यक्ति को अपडेट की गई वैल्यू पाने के लिए, getMinMaxSupportedValue या getSupportedValuesLists पर कॉल करना होगा.

VtsHalAutomotiveVehicle_TargetTest.cpp पर, वीएचएएल वीटीएस की मदद से, वीएचएएल लागू करने की पुष्टि की जाती है.

इस टेस्ट से यह पुष्टि की जाती है कि बुनियादी तरीके सही तरीके से लागू किए गए हैं और काम करने वाली प्रॉपर्टी के कॉन्फ़िगरेशन सही हैं. यह जांच, डिवाइस पर मौजूद सभी VHAL इंस्टेंस के लिए की जाती है. हालांकि, AAOS सिर्फ़ डिफ़ॉल्ट इंस्टेंस (android.hardware.automotive.vehicle.IVehicle/default) का इस्तेमाल करता है

वाहन की प्रॉपर्टी की वैल्यू

हर प्रॉपर्टी की वैल्यू के बारे में बताने के लिए, VehiclePropValue स्ट्रक्चर का इस्तेमाल करें. इसमें ये फ़ील्ड होते हैं:

फ़ील्ड ब्यौरा
timestamp टाइमस्टैंप, इवेंट होने के समय की जानकारी देता है. यह SystemClock.elapsedRealtimeNano() घड़ी के साथ सिंक होता है.
prop इस वैल्यू के लिए प्रॉपर्टी आईडी.
areaid इस वैल्यू के लिए इलाके का आईडी. यह ज़रूरी है कि यह इलाका, क्षेत्र के आईडी कॉन्फ़िगरेशन में बताए गए इलाकों में से कोई एक हो या ग्लोबल प्रॉपर्टी के लिए 0 हो.
value ऐसा डेटा स्ट्रक्चर जिसमें प्रॉपर्टी की असल वैल्यू शामिल होती है. प्रॉपर्टी टाइप के आधार पर, इस फ़ील्ड में एक या एक से ज़्यादा फ़ील्ड का इस्तेमाल, असल वैल्यू को सेव करने के लिए किया जाता है. उदाहरण के लिए, value.int32Values में पहले एलिमेंट का इस्तेमाल Int32 टाइप की प्रॉपर्टी के लिए किया जाता है. ज़्यादा जानकारी के लिए, प्रॉपर्टी के कॉन्फ़िगरेशन देखें.
status प्रॉपर्टी को पढ़ने की स्थिति. रीड/राइट प्रॉपर्टी के लिए, यह लिखने के लिए भी लागू हो सकता है, लेकिन इसकी कोई गारंटी नहीं है. उदाहरण के लिए, हो सकता है कि प्रॉपर्टी पढ़ने के लिए उपलब्ध हो, लेकिन लिखने के लिए उपलब्ध न हो. ऐसे मामले में, स्थिति AVAILABLE होती है और वैल्यू फ़ील्ड में मान्य जानकारी होती है. संभावित स्थितियों के लिए, VehiclePropertyStatus देखें.

एसिंक्रोनस getValues और setValues

getValues और setValues ऑपरेशन, एक साथ नहीं किए जाते, इसका मतलब है कि फ़ंक्शन, असल get या set ऑपरेशन पूरा होने से पहले ही रिटर्न कर सकता है. ऑपरेशन के नतीजे (उदाहरण के लिए, getValues के लिए प्रॉपर्टी वैल्यू और setValues के लिए सफलता या गड़बड़ी की स्थिति), आर्ग्युमेंट के तौर पर पास किए गए कॉलबैक के ज़रिए डिलीवर किए जाते हैं.

अनुरोध को मैनेज करने वाली बाइंडर थ्रेड में, नतीजे के लागू होने पर ब्लॉक नहीं होना चाहिए. इसके बजाय, हमारा सुझाव है कि आप अनुरोध को अनुरोध सूची में सेव करें और अनुरोधों को अलग-अलग हैंडलर थ्रेड का इस्तेमाल करके, एक साथ मैनेज करें. ज़्यादा जानकारी के लिए, रेफ़रंस लागू करना देखें.

पहली इमेज. एसिंक्रोनस प्रोसेस.

बड़े पार्सल

XXXs नाम वाले सभी स्ट्रक्चर, जैसे कि VehiclePropConfigs, SetValueRequests, और VehiclePropValues को LargeParcelable (या, StableLargeParcelable) कहा जाता है. हर स्ट्रक्चर में, वैल्यू की एक सूची होती है. इन वैल्यू का इस्तेमाल, बड़े डेटा को पास करने के लिए किया जाता है. यह डेटा, बाइंडर की सीमाओं (LargeParcelable लाइब्रेरी लागू करने में 4 केबी) से ज़्यादा हो सकता है. हर फ़ाइल का स्ट्रक्चर एक जैसा होता है. इसमें ये फ़ील्ड होते हैं.

मार्गदर्शन ब्यौरा
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 शून्य नहीं है, तो इसमें शेयर की गई मेमोरी फ़ाइल होती है. इसमें VehiclePropConfigs का क्रम से लगाया गया स्ट्रक्चर सेव होता है. यह स्ट्रक्चर, किसी पार्सल को सीरियल में बदलने के लिए, writeToParcel फ़ंक्शन का इस्तेमाल करता है.

VHAL के लिए Java क्लाइंट के तौर पर, Car Service, LargeParcelable के लिए सीरियलाइज़ेशन और डीसीरियलाइज़ेशन को मैनेज करता है. VHAL लागू करने और नेटिव क्लाइंट के लिए, LargeParcelable को LargeParcelable लाइब्रेरी या ParcelableUtils.h में लाइब्रेरी के लिए काम की रैपर क्लास के साथ सीरियलाइज़ और डिसीरियलाइज़ किया जाना चाहिए.

उदाहरण के लिए, बाइंडर से मिले getValues के लिए अनुरोधों को पार्स करने वाला नेटिव क्लाइंट, इस तरह काम करता है:

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

वीएचएएल लागू करने का एक सैंपल, यहां दिया गया है. इसमें बाइंडर के ज़रिए getValues के नतीजे भेजे जाते हैं:

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