VHAL इंटरफ़ेस

AIDL VHAL की जानकारी android.hardware.automotive.vehicle namespace में दी गई है. 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)
इस्तेमाल नहीं किया जाता और इसे बिना किसी कार्रवाई के लागू किया जा सकता है.

कॉलबैक, 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 प्रॉपर्टी, प्रॉपर्टी इवेंट हर्ट्ज़ में 'सदस्यता लें' सैंपल रेट या वाहन की बस के मैसेज फ़्रीक्वेंसी के आधार पर होता है. अगर प्रॉपर्टी का स्टेटस बदलता है, तो भी प्रॉपर्टी इवेंट हो सकता है. उदाहरण के लिए, उपलब्ध न होने से लेकर उपलब्ध तक.
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 के लिए सफलता या गड़बड़ी की स्थिति), आर्ग्युमेंट के तौर पर पास किए गए कॉलबैक के ज़रिए डिलीवर किए जाते हैं.

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

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

बड़े पार्सल

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, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests);
if (deserializedResults.ok()) {
    const std::vector& getValueRequests = deserializedResults.value().getObject()->payloads;
    // Use the getValueRequests.
  } else {
    // handle error.
}

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

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