VHAL इंटरफ़ेस

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

वर्शन

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

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

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

वीएचएएल फ़ंक्शन को IVehicle.aidl में तय किया गया है.

तरीका
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 में तय किया गया है. इनमें ये तरीके शामिल हैं.

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

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

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

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

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

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

एसिंक्रोनस तरीके से getValues और setValues का इस्तेमाल करना

getValues और setValues कार्रवाइयां एसिंक्रोनस तरीके से की जाती हैं, इसका मतलब है कि असल वैल्यू पाने या सेट करने की कार्रवाई पूरी होने से पहले, फ़ंक्शन वैल्यू दिखा सकता है. कार्रवाई के नतीजे (उदाहरण के लिए, 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 फ़ंक्शन का इस्तेमाल करता है.

वीएचएएल के लिए Java क्लाइंट के तौर पर, Car Service, क्रम से लगाने और क्रम से हटाने की प्रोसेस को हैंडल करता है LargeParcelable. वीएचएएल के लागू होने और नेटिव क्लाइंट के लिए, 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.
}