वीएचएएल इंटरफ़ेस

AIDL VHAL को android.hardware.automotive.vehicle namespace में परिभाषित किया गया है। VHAL इंटरफ़ेस को 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)
उपयोग नहीं किया गया है और इसे नो-ऑप के रूप में कार्यान्वित किया जा सकता है।

कॉलबैक को 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 संपत्ति के लिए, एक संपत्ति घटना तब होती है जब किसी संपत्ति का मूल्य या संपत्ति की स्थिति बदल जाती है।
SharedMemoryFileCount हमेशा 0 है।
oneway void onPropertySetError(in VehiclePropErrors errors)
एसिंक्रोनस प्रॉपर्टी सेट त्रुटियों की रिपोर्ट करने के लिए कॉलबैक जिसमें कोई संबंधित सेट अनुरोध नहीं है। यदि हम जानते हैं कि त्रुटि किस सेट अनुरोध के लिए है, तो इसके बजाय त्रुटि परिणाम वाले onSetValues उपयोग किया जाना चाहिए।

अधिक जानकारी के लिए IVehicle.aidl और IVehicleCallback.aidl देखें।

वीएचएएल कार्यान्वयन को वीएचएएल वीटीएस द्वारा VtsHalAutomobileVehicle_TargetTest.cpp पर मान्य किया गया है। परीक्षण सत्यापित करता है कि बुनियादी तरीकों को सही ढंग से लागू किया गया है और समर्थित संपत्ति कॉन्फ़िगरेशन सही हैं।

वाहन संपत्ति का मूल्य

प्रत्येक संपत्ति के मूल्य का वर्णन करने के लिए VehiclePropValue संरचना का उपयोग करें, जिसमें ये फ़ील्ड हैं:

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

अतुल्यकालिक getValues ​​और setValues

getValues ​​और setValues ​​संचालन अतुल्यकालिक रूप से किए जाते हैं, जिसका अर्थ है कि फ़ंक्शन वास्तविक प्राप्त या सेट ऑपरेशन पूरा होने से पहले वापस आ सकता है। ऑपरेशन परिणाम (उदाहरण के लिए, getValues ​​के लिए संपत्ति मूल्य और setValues ​​के लिए सफलता या त्रुटि स्थिति) तर्क के रूप में पारित कॉलबैक के माध्यम से वितरित किए जाते हैं।

कार्यान्वयन को अनुरोध को संभालने वाले बाइंडर थ्रेड में परिणाम को अवरुद्ध नहीं करना चाहिए। इसके बजाय, हम अनुशंसा करते हैं कि आप अनुरोध को अनुरोध कतार में संग्रहीत करें और अनुरोधों को अतुल्यकालिक रूप से संभालने के लिए एक अलग हैंडलर थ्रेड का उपयोग करें। विवरण के लिए संदर्भ कार्यान्वयन देखें।

चित्र 1. अतुल्यकालिक प्रक्रिया।

बड़ी पार्सल योग्य वस्तुएँ

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

मार्गदर्शन विवरण
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 फ़ंक्शन का उपयोग करती है।

वीएचएएल के लिए जावा क्लाइंट के रूप में, कार सर्विस LargeParcelable के लिए क्रमांकन और डिसेरिएलाइज़ेशन को संभालती है। वीएचएएल कार्यान्वयन और मूल ग्राहकों के लिए, एक 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.
}