सेंसर HAL 1.0

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

सेंसर एचएएल इंटरफ़ेस की जानकारी सेंसर एच में दी गई है.यह Android फ़्रेमवर्क और हार्डवेयर के हिसाब से सॉफ़्टवेयर. HAL लागू करने की प्रक्रिया में हर फ़ंक्शन तय होना चाहिए सेंसर.h में बताया गया इसके मुख्य फ़ंक्शन हैं:

  • get_sensors_list - सभी सेंसर की सूची दिखाता है.
  • activate - सेंसर को चालू या बंद करता है.
  • batch - सेंसर के पैरामीटर सेट करता है, जैसे कि सैंपलिंग की फ़्रीक्वेंसी और ज़्यादा से ज़्यादा रिपोर्टिंग में देरी.
  • setDelay - सिर्फ़ HAL वर्शन 1.0 में इस्तेमाल किया जाता है. किसी दिया गया सेंसर.
  • flush - निर्दिष्ट सेंसर के एफ़आईएफ़ओ को फ़्लश करता है और फ़्लश पूर्ण होने की रिपोर्ट करता है इवेंट जोड़ें.
  • poll - उपलब्ध सेंसर इवेंट दिखाता है.

लागू करने की प्रक्रिया, थ्रेड के हिसाब से सुरक्षित होनी चाहिए. साथ ही, इससे इन फ़ंक्शन को कॉल करने की अनुमति मिलती है अलग-अलग थ्रेड से.

इंटरफ़ेस उन फ़ंक्शन में इस्तेमाल होने वाले कई टाइप के बारे में भी बताता है. मुख्य टाइप हैं:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

नीचे दिए गए सेक्शन के अलावा, ऐसे टाइप के बारे में ज़्यादा जानकारी पाने के लिए सेंसर.h देखें.

get_sensors_list(सूची)

int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t
  const** list);

एचएएल के लगाए गए सेंसर की सूची देता है. सेंसर के बारे में बताने के तरीके के बारे में जानने के लिए, sensor_t देखें.

सूची में सेंसर जिस क्रम में दिखते हैं सेंसर की जानकारी ऐप्लिकेशन को दी जाएगी. आम तौर पर, बेस सेंसर पहले, कंपोज़िट सेंसर के बाद.

अगर कई सेंसर एक ही तरह के सेंसर और स्क्रीन चालू करने की प्रॉपर्टी को शेयर करते हैं, तो पहले सूची में मौजूद एक सेंसर को “डिफ़ॉल्ट” सेंसर कहा जाता है. इसे लौटाकर getDefaultSensor(int sensorType, bool wakeUp).

यह फ़ंक्शन, सूची में सेंसर की संख्या दिखाता है.

चालू करें(सेंसर, सही/गलत)

int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int
  enabled);

इससे सेंसर को चालू या बंद किया जाता है.

sensor_handle सेंसर का हैंडल है, ताकि इसे चालू या बंद किया जा सके. सेंसर हैंडल को इसके sensor_t स्ट्रक्चर के handle फ़ील्ड से तय किया जाता है.

सेंसर को चालू करने के लिए, enabled को 1 या बंद करने के लिए 0 पर सेट किया गया है.

कोई इवेंट मिलने पर, वन-शॉट सेंसर अपने-आप काम करना बंद कर देता है, और उन्हें activate(..., enabled=0) पर कॉल करके, इस सुविधा को बंद किए जाने का अनुरोध स्वीकार करना होगा.

सक्रिय न करने वाले सेंसर, SoC को सस्पेंड मोड में जाने से कभी नहीं रोकते; वह यह है कि एचएएल को आवेदनों के लिए पार्शियल वेक-लॉक नहीं चाहिए होगा.

फ़ोन की स्क्रीन चालू करने वाले सेंसर, जब लगातार इवेंट डिलीवर करते हैं, तो वे SoC को निलंबित मोड में चला जाएगा, लेकिन अगर कोई इवेंट डिलीवर करने की ज़रूरत नहीं है, तो वेक-लॉक को हटा देना चाहिए.

अगर enabled की वैल्यू 1 है और सेंसर पहले से ही चालू है, तो यह फ़ंक्शन नो-ऑप होगा और सफल होते हैं.

अगर enabled, 0 पर सेट है और सेंसर पहले से ही बंद है, तो यह फ़ंक्शन नो-ऑप होता है और सफल होते हैं.

यह फ़ंक्शन सक्सेस (सफलता) होने पर 0 दिखाता है, नहीं तो नेगेटिव गड़बड़ी संख्या दिखाता है.

बैच(सेंसर, फ़्लैग, सैंपलिंग की अवधि, रिपोर्ट में ज़्यादा से ज़्यादा इंतज़ार का समय)

int (*batch)(
     struct sensors_poll_device_1* dev,
     int sensor_handle,
     int flags,
     int64_t sampling_period_ns,
     int64_t max_report_latency_ns);

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

कॉन्फ़िगर करने के लिए, सेंसर का हैंडल sensor_handle है.

फ़िलहाल, flags का इस्तेमाल नहीं किया गया है.

sampling_period_ns, सैंपलिंग की वह अवधि है जिसमें सेंसर चलाना चाहिए, नैनोसेकंड में. इसके लिए sampling_period_ns देखें देखें.

ज़्यादा से ज़्यादा max_report_latency_ns समय तक इवेंट सेट किए जा सकते हैं को HAL के ज़रिए रिपोर्ट किए जाने में देरी हो सकती है. इसे नैनोसेकंड में रिपोर्ट में शामिल किया जा सकता है. max_report_latency_ns देखें ज़्यादा जानकारी के लिए पैराग्राफ़ देखें.

यह फ़ंक्शन सक्सेस (सफलता) होने पर 0 दिखाता है, नहीं तो नेगेटिव गड़बड़ी संख्या दिखाता है.

setदे(सेंसर, सैंपलिंग की अवधि)

int (*setDelay)(
     struct sensors_poll_device_t *dev,
     int sensor_handle,
     int64_t sampling_period_ns);

HAL के वर्शन 1.0 के बाद, यह फ़ंक्शन अब काम नहीं करता. इसे कभी भी कॉल नहीं किया जाता. इसके बजाय, batch फ़ंक्शन को sampling_period_ns पैरामीटर.

HAL के वर्शन 1.0 में, sampling_period_ns को सेट करने के लिए बैच के बजाय set delay का इस्तेमाल किया गया.

फ़्लश(सेंसर)

int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);

चुने गए सेंसर के लिए, हार्डवेयर एफ़आईएफ़ओ के आखिर में फ़्लश पूरा इवेंट जोड़ें और एफ़आईएफ़ओ को फ़्लश करें; उन इवेंट को सामान्य तरीके से डिलीवर किया जाता है. इसका मतलब है कि उन्हें रिपोर्ट भेजने में लगने वाला ज़्यादा से ज़्यादा समय की अवधि खत्म हो चुकी है) और उसे FIFO से हटा दिया गया है.

फ़्लश एसिंक्रोनस रूप से होता है (यानी: यह फ़ंक्शन तुरंत वापस आना चाहिए). अगर इंप्लिमेंटेशन में कई सेंसर के लिए एक ही एफ़आईएफ़ओ का इस्तेमाल किया जाता है, तो एफ़आईएफ़ओ को फ़्लश किया गया और फ़्लश पूरा इवेंट सिर्फ़ बताए गए सेंसर के लिए जोड़ा जाता है.

अगर बताए गए सेंसर में FIFO (बफ़रिंग की सुविधा नहीं) मौजूद नहीं है या FIFO, कॉल के समय खाली था, flush अब भी सफल होना चाहिए और उस सेंसर के लिए एक फ़्लश पूरा इवेंट भेजें. यह अन्य सभी सेंसर पर लागू होता है एक-शॉट सेंसर से कनेक्ट नहीं किया जाता.

flush को कॉल किए जाने पर, भले ही कोई फ़्लश इवेंट पहले से इस सेंसर के लिए एफ़आईएफ़ओ. एक और सेंसर बनाना और आखिर में जोड़ना ज़रूरी है और FIFO फ़्लश होना चाहिए. flush की संख्या कॉल, बनाए गए फ़्लश पूरे इवेंट की संख्या के बराबर होने चाहिए.

वन-शॉट पर flush लागू नहीं होता सेंसर; अगर sensor_handle एक शॉट सेंसर को रेफ़र करता है, flush को -EINVAL दिखाना चाहिए और कोई वैल्यू जनरेट नहीं करनी चाहिए पूरा मेटाडेटा इवेंट फ़्लश करें.

यह फ़ंक्शन सही होने पर 0 दिखाता है, -EINVAL अगर चुना गया सेंसर एक शॉट सेंसर है या चालू नहीं था और न ही गड़बड़ी का एक नेगेटिव नंबर है.

पोल()

int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int
  count);

data आर्ग्युमेंट भरकर, सेंसर डेटा का कलेक्शन दिखाता है. यह फ़ंक्शन इवेंट उपलब्ध होने तक ब्लॉक होना चाहिए. यह पढ़े गए इवेंट की संख्या दिखाएगा या कोई गड़बड़ी होने पर नेगेटिव गड़बड़ी की संख्या डालें.

data में लौटाए गए इवेंट की संख्या, इससे कम या इसके बराबर होनी चाहिए count आर्ग्युमेंट. यह फ़ंक्शन कभी भी 0 (कोई इवेंट नहीं) दिखाएगा.

कॉल का क्रम

डिवाइस के चालू होने पर, get_sensors_list को कॉल किया जाता है.

जब कोई सेंसर सक्रिय होता है, तो batch फ़ंक्शन को अनुरोध किए गए पैरामीटर के बाद, activate(..., enable=1).

ध्यान दें कि HAL वर्शन 1_0 में, ऑर्डर इसके उलट था: activate को कॉल किया गया था पहले, फिर set_delay.

सेंसर के काम करने के तरीके में बदलाव होने पर तो batch फ़ंक्शन को कॉल किया जाता है.

flush को कभी भी कॉल किया जा सकता है. ऐसा तब भी किया जा सकता है, जब सेंसर चालू न हों इसमें -EINVAL दिखना चाहिए)

सेंसर के बंद होने पर, activate(..., enable=0) पर कॉल किया जाएगा.

उन कॉल के साथ-साथ, poll फ़ंक्शन को बार-बार कॉल किया जाएगा अनुरोध डेटा. सेंसर चालू न होने पर भी poll को कॉल किया जा सकता है.

सेंसर_मॉड्यूल

sensors_module_t, Android हार्डवेयर बनाने के लिए इस्तेमाल किया जाने वाला टाइप है मॉड्यूल का इस्तेमाल करें. एचएएल को लागू करने के लिए एक ऑब्जेक्ट तय करना ज़रूरी है get_sensors_list फ़ंक्शन को प्रदर्शित करने के लिए इस प्रकार का HAL_MODULE_INFO_SYM. ज़्यादा जानकारी के लिए, sensors.h में sensors_module_t की परिभाषा और hw_module_t की परिभाषा हमारा वीडियो देखें.

सेंसर_poll_device_t / सेंसर_poll_device_1_t

sensors_poll_device_1_t में ऊपर बताए गए बाकी तरीके शामिल हैं: activate, batch, flush, और poll. इसका common फ़ील्ड (hw_device_t टाइप का) HAL के वर्शन नंबर के बारे में बताता है.

सेंसर_t

sensor_t, Android का प्रतिनिधित्व करता है सेंसर. यहां इसके कुछ अहम फ़ील्ड दिए गए हैं:

name: उपयोगकर्ता को दिखने वाली स्ट्रिंग, जो सेंसर को दिखाती है. अक्सर यह स्ट्रिंग इसमें मौजूद सेंसर के पार्ट का नाम, सेंसर का टाइप, और भले ही, यह सेंसर चालू हो. उदाहरण के लिए, “LIS2HH12 Accelerometer”, “MAX21000 अनकैलिब्रेटेड जाइरोस्कोप”, “BMP280 वेक-अप बैरोमीटर”, “MPU6515 गेम रोटेशन वेक्टर”

हैंडल: वह पूर्णांक जिसका इस्तेमाल सेंसर को रजिस्टर करते समय किया जाता है या इससे इवेंट जनरेट करने में मदद मिलती है.

type: सेंसर किस तरह का है. सेंसर की वजह देखें ज़्यादा जानकारी के लिए, Android सेंसर क्या हैं? सेक्शन में टाइप करें और आधिकारिक सेंसर टाइप के लिए, सेंसर के टाइप देखें. इसके लिए गैर-आधिकारिक सेंसर प्रकार, type को SENSOR_TYPE_DEVICE_PRIVATE_BASE से शुरू होना चाहिए

stringType: स्ट्रिंग के रूप में सेंसर का टाइप. जब सेंसर का आधिकारिक टाइप SENSOR_STRING_TYPE_* पर सेट है. टास्क कब शुरू होगा सेंसर के लिए मैन्युफ़ैक्चरर के हिसाब से तय किया गया तापमान सेट है, stringType के लिए सबसे पहले, निर्माता के रिवर्स डोमेन नेम से शुरू करें. उदाहरण के लिए, सेंसर (मान लें कि यूनिकॉर्न डिटेक्टर) का पता लगाएं, जिसे Cool-product टीम काल्पनिक कंपनी इसका इस्तेमाल कर सकती है stringType=”com.fictional_company.cool_product.unicorn_detector”. stringType का इस्तेमाल गैर-आधिकारिक सेंसर की खास तरह से पहचान करने के लिए किया जाता है प्रकार. टाइप और स्ट्रिंग के बारे में ज़्यादा जानकारी पाने के लिए, sensors.h लेख पढ़ें प्रकार.

ज़रूरीअनुमति: अनुमति को दिखाने वाली स्ट्रिंग कि ऐप्लिकेशन के पास सेंसर देखने, उससे रजिस्टर करने और उसे ऐक्सेस करने की अनुमति होनी चाहिए उसका डेटा शामिल होता है. खाली स्ट्रिंग का मतलब है कि ऐप्लिकेशन को इस सेंसर को ऐक्सेस करें. हृदय गति मॉनिटर जैसे कुछ सेंसर प्रकार requiredPermission का इस्तेमाल करना ज़रूरी है. संवेदनशील जानकारी देने वाले सभी सेंसर उपयोगकर्ता की जानकारी (जैसे कि हृदय गति) को सुरक्षित रखने के लिए अनुमति.

फ़्लैग: इस सेंसर के लिए फ़्लैग, सेंसर के रिपोर्टिंग मोड को तय करता है और क्या सेंसर, जगाने वाला सेंसर है या नहीं. उदाहरण के लिए, एक शॉट में सक्रिय करने वाला सेंसर flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP होगा. इसके बिट जिस फ़्लैग का इस्तेमाल मौजूदा एचएएल वर्शन में नहीं किया जा रहा है उसे 0 के बराबर रखना चाहिए.

maxRange: सेंसर, सबसे ज़्यादा वैल्यू की रिपोर्ट कर सकता है. यह वैल्यू रिपोर्ट की गई वैल्यू. यह ज़रूरी है कि सेंसर, बिना रंग के वैल्यू रिपोर्ट कर पाए [-maxRange; maxRange] के अंदर. ध्यान दें कि इसका अर्थ है कि सेंसर को आम तौर पर 2*maxRange माना जाता है. जब सेंसर वैल्यू अलग-अलग ऐक्सिस पर इस्तेमाल किए जाते हैं, तो रेंज हर ऐक्सिस पर लागू होती है. उदाहरण के लिए, “+/- 2g” एक्सलरोमीटर maxRange = 2*9.81 = 2g रिपोर्ट करेगा.

रिज़ॉल्यूशन: सेंसर से मापी जा सकने वाली वैल्यू में, सबसे छोटा अंतर. आम तौर पर, इसका हिसाब maxRange और मेज़रमेंट में बिट की संख्या के आधार पर लगाया जाता है.

पावर: सेंसर को चालू करने पर होने वाली ऊर्जा की लागत, MilliAmps में. यह तकरीबन हमेशा, डेटाशीट में से एक है. बेस सेंसर != फ़िज़िकल ज़्यादा जानकारी के लिए, सेंसर और पावर मेज़रमेंट की जानकारी देखें प्रोसेस में दी गई जानकारी देखें. अगर सेंसर में ऊर्जा की खपत इस बात पर निर्भर करती है कि डिवाइस चल रहा है या नहीं, तो एक जगह से दूसरी जगह ले जाते समय, power में बिजली की खपत के बारे में बताया गया है फ़ील्ड.

कम से कम देरी: लगातार सेंसर के लिए, सैंपलिंग की अवधि, माइक्रोसेकंड, जो सेंसर द्वारा समर्थित सबसे तेज़ दर के अनुरूप होता है. इसके लिए sampling_period_ns देखें इस बारे में ज़्यादा जानकारी पाएं कि इस वैल्यू का इस्तेमाल कैसे किया जाता है. ध्यान रहे कि minDelay को माइक्रोसेकंड में दिखाया गया है, जबकि sampling_period_ns इसमें है नैनोसेकंड. बदलाव करने पर और विशेष रिपोर्टिंग मोड वाले सेंसर के लिए, जब तक कि अगर वैल्यू अलग है, तो minDelay 0 होना चाहिए. वन-शॉट सेंसर के लिए, यह -1 होना चाहिए.

max delay: लगातार बदलने वाले और बदलाव करने वाले सेंसर के लिए, सैंपलिंग अवधि, माइक्रोसेकंड में, सेंसर की सबसे धीमी दर के हिसाब से इस्तेमाल किया जा सकता है. इसके लिए sampling_period_ns देखें इस बारे में ज़्यादा जानकारी पाएं कि इस वैल्यू का इस्तेमाल कैसे किया जाता है. ध्यान रहे कि maxDelay को माइक्रोसेकंड में दिखाया गया है, जबकि sampling_period_ns इसमें है नैनोसेकंड. खास और एक शॉट वाले सेंसर के लिए, maxDelay यह होना चाहिए 0.

fifo ReservedEventCount: इस सेंसर के लिए इस सेंसर के लिए रिज़र्व किए गए इवेंट की संख्या हार्डवेयर एफ़आईएफ़ओ. अगर इस सेंसर के लिए खास तौर पर एफ़आईएफ़ओ मौजूद है, तो खास तौर पर बनाए गए इस एफ़आईएफ़ओ का साइज़ fifoReservedEventCount है. अगर एफ़आईएफ़ओ को अन्य सेंसर के साथ शेयर किया जाता है, तो fifoReservedEventCount वह एफ़आईएफ़ओ जिसे उस सेंसर के लिए रिज़र्व रखा गया है. ज़्यादातर शेयर किए गए-एफ़आईएफ़ओ सिस्टम पर और वे सिस्टम जिनमें हार्डवेयर FIFO नहीं है, यह मान 0 है.

fifoMaxEventCount: उन इवेंट की ज़्यादा से ज़्यादा संख्या जो इस सेंसर के लिए एफ़आईएफ़ओ में सेव हो सकता है. यह हमेशा इसके बराबर या ज़्यादा होता है fifoReservedEventCount. इस वैल्यू का इस्तेमाल करके यह अनुमान लगाया जाता है कि सेंसर में रजिस्टर करने पर, एफ़आईएफ़ओ तेज़ी से भर जाएगा की दर दिखाता है. ऐसा माना जाता है कि कोई दूसरा सेंसर चालू नहीं है. ऐसे सिस्टम पर जिनमें हार्डवेयर FIFO, fifoMaxEventCount का मान शून्य है. ज़्यादा जानकारी के लिए बैच करना देखें.

आधिकारिक सेंसर टाइप वाले सेंसर के लिए, कुछ फ़ील्ड ओवरराइट हो जाते हैं के हिसाब से डिज़ाइन किया गया है. उदाहरण के लिए, एक्सलरोमीटर सेंसर लगातार रिपोर्टिंग मोड चालू रखना पड़ता है और दिल की धड़कन मॉनिटर करने वाले मॉनिटर SENSOR_PERMISSION_BODY_SENSORS के ज़रिए सुरक्षित रखा जाना ज़रूरी है अनुमति.

सेंसर_event_t

Android सेंसर से जनरेट किए गए और पोल फ़ंक्शन के ज़रिए रिपोर्ट किए गए सेंसर इवेंट type sensors_event_t के हैं. यहां कुछ sensors_event_t के ज़रूरी फ़ील्ड:

version: sizeof(struct sensors_event_t) होना चाहिए

सेंसर: सेंसर का वह हैंडल जिससे इवेंट जनरेट हुआ. इसकी जानकारी sensor_t.handle.

type: सेंसर का वह सेंसर टाइप जिससे इवेंट जनरेट हुआ. इसकी जानकारी sensor_t.type.

timestamp: नैनोसेकंड में इवेंट का टाइमस्टैंप. यही वह समय है कोई घटना हुई (एक कदम उठाया गया या एक एक्सलरोमीटर माप लिया गया), इवेंट को रिपोर्ट किए जाने का समय नहीं है. timestamp इसके साथ सिंक होना चाहिए elapsedRealtimeNano और लगातार सेंसर के मामले में, वाइब्रेट करने वाला सिग्नल छोटा होना चाहिए. सीडीडी के मुताबिक काम करने के लिए, कभी-कभी टाइमस्टैंप को फ़िल्टर करना ज़रूरी होता है ज़रूरी शर्तें, जैसे कि सिर्फ़ SoC का इस्तेमाल करके, टाइमस् टैंप सेट करने में रुकावट डालना इसकी वजह से बहुत ज़्यादा वाइब्रेट होता है और टाइमस्टैंप elapsedRealtimeNano घड़ी, सेंसर की घड़ी में ड्रिफ़्ट होती है.

डेटा और ओवरलैप होने वाले फ़ील्ड: वे वैल्यू जिन्हें सेंसर. उन फ़ील्ड के मतलब और उनकी इकाइयां, हर सेंसर के हिसाब से अलग-अलग होती हैं टाइप करें. सेंसर की डेटा फ़ील्ड. कुछ सेंसर के लिए, आंकड़ों के सटीक होने की जानकारी भी दी जाती है status फ़ील्ड की मदद से, डेटा के हिस्से के तौर पर शामिल करता है. यह फ़ील्ड सिर्फ़ उन चुनिंदा सेंसर टाइप के लिए पाइप-इन किया जाता है, जो SDK टूल की लेयर पर सटीक वैल्यू. इन सेंसर के लिए, यह तथ्य कि स्थिति फ़ील्ड को सेट किया जाना चाहिए के बारे में, उनके सेंसर टाइप में बताया गया हो परिभाषा शामिल नहीं है.

मेटाडेटा फ़्लश पूरे होने वाले इवेंट

मेटाडेटा इवेंट, सामान्य सेंसर इवेंट की तरह ही होते हैं: sensors_event_meta_data_t = sensors_event_t. वे एक साथ अन्य सेंसर इवेंट के लिए पोल का इस्तेमाल करता है. इनमें ये फ़ील्ड शामिल होते हैं:

version: META_DATA_VERSION होना चाहिए

type: SENSOR_TYPE_META_DATA होना चाहिए

सेंसर, रिज़र्व, और टाइमस्टैंप: यह 0 होना चाहिए

meta_data.what: इसमें इस इवेंट का मेटाडेटा टाइप शामिल होता है. इस समय एक मान्य मेटाडेटा टाइप: META_DATA_FLUSH_COMPLETE.

META_DATA_FLUSH_COMPLETE इवेंट सेंसर FIFO पर. जब meta_data.what=META_DATA_FLUSH_COMPLETE, meta_data.sensor सेंसर के उस हैंडल पर सेट होना चाहिए जो फ़्लश कर दिया गया है. वे हैं यह तब और ही जनरेट होता है, जब flush को सेंसर पर कॉल किया जाता है. सेक्शन देखें flsh फ़ंक्शन का इस्तेमाल करें.