رابط Sensors HAL که در sensors.h اعلام شده است، رابط بین چارچوب Android و نرم افزار مخصوص سخت افزار را نشان می دهد. یک پیاده سازی HAL باید هر تابع اعلام شده در sensors.h را تعریف کند. توابع اصلی عبارتند از:
-
get_sensors_list
- لیست تمام حسگرها را برمیگرداند. -
activate
- یک سنسور را شروع یا متوقف می کند. -
batch
- پارامترهای سنسور مانند فرکانس نمونه برداری و حداکثر تأخیر گزارش را تنظیم می کند. -
setDelay
- فقط در نسخه HAL 1.0 استفاده می شود. فرکانس نمونه برداری را برای یک سنسور مشخص تنظیم می کند. -
flush
- FIFO سنسور مشخص شده را شستشو می دهد و پس از انجام این کار، یک رویداد کامل فلاش را گزارش می دهد. -
poll
- رویدادهای حسگر موجود را برمیگرداند.
پیاده سازی باید به صورت Thread ایمن باشد و اجازه دهد که این توابع از رشته های مختلف فراخوانی شوند.
رابط همچنین چندین نوع مورد استفاده توسط آن توابع را تعریف می کند. انواع اصلی عبارتند از:
-
sensors_module_t
-
sensors_poll_device_t
-
sensor_t
-
sensors_event_t
علاوه بر بخشهای زیر، برای اطلاعات بیشتر در مورد این انواع، sensors.h را ببینید.
get_sensors_list(list)
int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list);
لیستی از حسگرهای پیاده سازی شده توسط HAL را ارائه می دهد. برای جزئیات در مورد نحوه تعریف حسگرها به sensor_t مراجعه کنید.
ترتیب ظاهر شدن سنسورها در لیست ترتیبی است که حسگرها به برنامه ها گزارش می شوند. معمولاً ابتدا سنسورهای پایه و به دنبال آن سنسورهای کامپوزیت ظاهر می شوند.
اگر چندین سنسور از یک نوع سنسور و ویژگی بیدار شدن استفاده می کنند، اولین مورد در لیست حسگر "پیش فرض" نامیده می شود. این همان چیزی است که توسط getDefaultSensor(int sensorType, bool wakeUp)
برگردانده شده است.
این تابع تعداد سنسورهای موجود در لیست را برمی گرداند.
فعال کردن (حسگر، درست/نادرست)
int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int enabled);
یک سنسور را فعال یا غیرفعال می کند.
sensor_handle
دسته سنسور برای فعال/غیرفعال کردن است. دسته یک حسگر با فیلد handle
ساختار sensor_t آن تعریف می شود.
enabled
برای فعال کردن 1 یا برای غیرفعال کردن سنسور 0 تنظیم شده است.
حسگرهای تک شات به محض دریافت یک رویداد، خود را به طور خودکار غیرفعال می کنند، و همچنان باید بپذیرند که از طریق تماس غیرفعال شوند تا activate(..., enabled=0)
.
حسگرهای غیر بیدار هرگز از رفتن SoC به حالت تعلیق جلوگیری نمی کنند. یعنی HAL نباید از طرف برنامههای کاربردی، قفل قفل جزئی داشته باشد.
سنسورهای بیدار شدن، هنگام ارائه رویدادها به طور مداوم، می توانند از رفتن SoC به حالت تعلیق جلوگیری کنند، اما اگر نیازی به ارائه هیچ رویدادی نباشد، قفل بیدار شدن جزئی باید آزاد شود.
اگر enabled
1 باشد و سنسور قبلاً فعال شده باشد، این عملکرد غیرفعال است و موفق می شود.
اگر 0 enabled
باشد و سنسور قبلاً غیرفعال شده باشد، این عملکرد غیرفعال است و موفق می شود.
این تابع در صورت موفقیت 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 و در غیر این صورت یک عدد خطای منفی را برمی گرداند.
تأخیر تنظیم (حسگر، دوره نمونه برداری)
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، setDelay به جای دسته ای برای تنظیم sampling_period_ns استفاده شد.
فلاش (حسگر)
int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);
یک رویداد flush full به انتهای سخت افزار FIFO برای سنسور مشخص شده اضافه کنید و FIFO را شستشو دهید. آن رویدادها طبق معمول تحویل داده می شوند (به عنوان مثال: گویی حداکثر تأخیر گزارش منقضی شده است) و از FIFO حذف می شوند.
فلاش به صورت ناهمزمان اتفاق می افتد (یعنی: این تابع باید فوراً برگردد). اگر پیاده سازی از یک FIFO برای چندین سنسور استفاده کند، آن FIFO فلاش می شود و رویداد flush full فقط برای سنسور مشخص شده اضافه می شود.
اگر حسگر مشخص شده فاقد FIFO باشد (بدون بافر امکان پذیر نیست)، یا اگر FIFO در زمان تماس خالی بود، flush
همچنان باید موفق باشد و یک رویداد flush کامل برای آن سنسور ارسال کند. این برای همه سنسورها غیر از سنسورهای تک شات صدق می کند.
هنگامی که flush
فراخوانی می شود، حتی اگر یک رویداد flush از قبل برای آن سنسور در FIFO وجود داشته باشد، باید یک رویداد اضافی ایجاد شود و به انتهای FIFO اضافه شود و FIFO باید فلاش شود. تعداد تماسهای flush
باید برابر با تعداد رویدادهای flush full ایجاد شده باشد.
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
sensors_module_t
نوعی است که برای ایجاد ماژول سخت افزار اندروید برای سنسورها استفاده می شود. پیاده سازی HAL باید یک شی HAL_MODULE_INFO_SYM
از این نوع را برای نمایش تابع get_sensors_list تعریف کند. برای اطلاعات بیشتر به تعریف sensors_module_t
در sensors.h و تعریف hw_module_t
مراجعه کنید.
sensors_poll_device_t / sensors_poll_device_1_t
sensors_poll_device_1_t
شامل بقیه روشهای تعریفشده در بالا است: activate
، batch
، flush
و poll
. فیلد common
آن (از نوع hw_device_t ) شماره نسخه HAL را مشخص می کند.
sensor_t
sensor_t
نشان دهنده یک سنسور اندروید است. در اینجا به برخی از زمینه های مهم آن اشاره می شود:
name: یک رشته قابل مشاهده برای کاربر که نشان دهنده حسگر است. این رشته اغلب شامل نام قطعه حسگر زیرین، نوع سنسور و اینکه آیا حسگر بیدار است یا خیر می باشد. به عنوان مثال، «شتابسنج LIS2HH12»، «ژیروسکوپ بدون کالیبره MAX21000»، «بارومتر بیدار شدن BMP280»، «بردار چرخش بازی MPU6515»
handle: عدد صحیحی که برای رجوع به حسگر در هنگام ثبت روی آن یا ایجاد رویدادها از آن استفاده می شود.
نوع: نوع سنسور. توضیح نوع سنسور را در سنسورهای اندروید چیست ببینید؟ برای جزئیات بیشتر، و انواع سنسور برای انواع سنسور رسمی را ببینید. برای انواع حسگرهای غیر رسمی، type
باید با SENSOR_TYPE_DEVICE_PRIVATE_BASE
شروع شود
stringType: نوع حسگر به صورت رشته ای. وقتی سنسور دارای نوع رسمی است، روی SENSOR_STRING_TYPE_*
تنظیم کنید. وقتی سنسور دارای یک نوع خاص سازنده باشد، stringType
باید با نام دامنه معکوس سازنده شروع شود. برای مثال، یک حسگر (مثلاً آشکارساز تکشاخ) که توسط تیم Cool-product در Fictional-Company تعریف شده است، میتواند از stringType=”com.fictional_company.cool_product.unicorn_detector”
استفاده کند. stringType
برای شناسایی منحصر به فرد انواع حسگرهای غیر رسمی استفاده می شود. برای اطلاعات بیشتر در مورد انواع و انواع رشته ها به sensors.h مراجعه کنید.
requirePermission: رشته ای نشان دهنده مجوزی است که برنامه ها باید برای دیدن حسگر، ثبت نام در آن و دریافت داده های آن داشته باشند. یک رشته خالی به این معنی است که برنامه ها برای دسترسی به این حسگر نیازی به مجوز ندارند. برخی از انواع حسگرها مانند نمایشگر ضربان قلب دارای requiredPermission
اجباری هستند. همه حسگرهایی که اطلاعات حساس کاربر را ارائه می دهند (مانند ضربان قلب) باید با مجوز محافظت شوند.
flags: پرچم هایی برای این سنسور، مشخص کننده حالت گزارش سنسور و اینکه آیا سنسور یک حسگر بیداری است یا نه. به عنوان مثال، یک سنسور بیدار شدن یک شات دارای flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP
. بیت های پرچم که در نسخه HAL فعلی استفاده نمی شوند باید برابر با 0 باقی بمانند.
maxRange: حداکثر مقداری که حسگر می تواند گزارش دهد، در همان واحد مقادیر گزارش شده. حسگر باید بتواند مقادیر را بدون اشباع در [-maxRange; maxRange]
. توجه داشته باشید که این بدان معنی است که محدوده کل سنسور در معنای عمومی 2*maxRange
است. هنگامی که سنسور مقادیر را در چندین محور گزارش می دهد، محدوده برای هر محور اعمال می شود. به عنوان مثال، یک شتاب سنج "+/- 2g" maxRange = 2*9.81 = 2g
گزارش می کند.
وضوح: کوچکترین تفاوت در مقداری که سنسور می تواند اندازه گیری کند. معمولاً بر اساس maxRange
و تعداد بیت های اندازه گیری محاسبه می شود.
توان: هزینه انرژی فعال کردن سنسور، بر حسب میلی آمپر. این تقریباً همیشه بیشتر از مصرف برق گزارش شده در برگه داده سنسور زیرین است. برای جزئیات بیشتر به سنسورهای پایه != حسگرهای فیزیکی مراجعه کنید و برای جزئیات نحوه اندازهگیری مصرف انرژی یک سنسور به فرآیند اندازهگیری نیرو مراجعه کنید. اگر مصرف برق سنسور به حرکت دستگاه بستگی دارد، مصرف برق در حین حرکت همان چیزی است که در میدان power
گزارش شده است.
minDelay: برای سنسورهای پیوسته، دوره نمونه برداری، در میکروثانیه، مربوط به سریعترین نرخی است که سنسور پشتیبانی می کند. برای جزئیات نحوه استفاده از این مقدار به sampling_period_ns مراجعه کنید. مراقب باشید که minDelay
در میکروثانیه بیان می شود در حالی که sampling_period_ns
بر حسب نانوثانیه است. برای سنسورهای در حال تغییر و حالت گزارش ویژه، مگر اینکه خلاف آن مشخص شده باشد، minDelay
باید 0 باشد. برای سنسورهای یک شات، باید -1 باشد.
maxDelay: برای سنسورهای پیوسته و در حال تغییر، دوره نمونه برداری، در میکروثانیه، مربوط به کندترین نرخی است که سنسور پشتیبانی می کند. برای جزئیات نحوه استفاده از این مقدار به sampling_period_ns مراجعه کنید. مراقب باشید که maxDelay
در میکروثانیه بیان می شود در حالی که sampling_period_ns
در نانوثانیه است. برای سنسورهای خاص و تک شات، maxDelay
باید 0 باشد.
fifoReservedEventCount: تعداد رویدادهای رزرو شده برای این سنسور در سخت افزار FIFO. اگر یک FIFO اختصاصی برای این سنسور وجود دارد، پس fifoReservedEventCount
اندازه این FIFO اختصاصی است. اگر FIFO با سنسورهای دیگر به اشتراک گذاشته شود، fifoReservedEventCount
اندازه بخشی از FIFO است که برای آن سنسور رزرو شده است. در اکثر سیستمهای FIFO مشترک، و در سیستمهایی که FIFO سختافزاری ندارند، این مقدار ۰ است.
fifoMaxEventCount: حداکثر تعداد رویدادهایی که می توان در FIFO برای این سنسور ذخیره کرد. این همیشه بزرگتر یا برابر با fifoReservedEventCount
است. این مقدار برای تخمین سرعت پر شدن FIFO هنگام ثبت نام در سنسور با نرخ مشخصی استفاده می شود، فرض کنید هیچ سنسور دیگری فعال نشده باشد. در سیستم هایی که FIFO سخت افزاری ندارند، fifoMaxEventCount
0 است. برای جزئیات بیشتر به Batching مراجعه کنید.
برای حسگرهایی با نوع سنسور رسمی، برخی از فیلدها توسط چارچوب بازنویسی می شوند. به عنوان مثال، حسگرهای شتاب سنج مجبور هستند حالت گزارش دهی پیوسته داشته باشند، و مانیتورهای ضربان قلب مجبور هستند با مجوز SENSOR_PERMISSION_BODY_SENSORS
محافظت شوند.
sensors_event_t
رویدادهای حسگر تولید شده توسط حسگرهای Android و گزارش شده از طریق عملکرد نظرسنجی از type sensors_event_t
هستند. در اینجا برخی از زمینه های مهم sensors_event_t
آورده شده است:
نسخه: باید sizeof(struct sensors_event_t)
سنسور: دسته سنسوری که رویداد را ایجاد کرده است، همانطور که توسط sensor_t.handle
تعریف شده است.
type: نوع حسگر سنسوری که رویداد را ایجاد کرده است، همانطور که توسط sensor_t.type
تعریف شده است.
timestamp: مهر زمانی رویداد در نانوثانیه است. این زمانی است که رویداد اتفاق افتاده است (گامی برداشته شده است، یا اندازه گیری شتاب سنج انجام شده است)، نه زمانی که رویداد گزارش شده است. timestamp
باید با ساعت elapsedRealtimeNano
همگام شود و در مورد سنسورهای پیوسته، لرزش باید کوچک باشد. فیلتر کردن مهر زمانی گاهی اوقات برای برآورده کردن الزامات CDD ضروری است، زیرا فقط استفاده از زمان وقفه SoC برای تنظیم مُهرهای زمانی باعث عصبانیت بیش از حد میشود و استفاده از زمان تراشه حسگر برای تنظیم مُهرهای زمانی میتواند باعث عدم همگامسازی از ساعت elapsedRealtimeNano
RealtimeNano شود. ساعت سنسور حرکت می کند
داده ها و فیلدهای همپوشانی: مقادیر اندازه گیری شده توسط سنسور. معنی و واحدهای آن فیلدها برای هر نوع حسگر مشخص است. برای توضیح فیلدهای داده به sensors.h و تعریف انواع مختلف سنسور مراجعه کنید. برای برخی از حسگرها، دقت قرائت ها نیز به عنوان بخشی از داده ها، از طریق فیلد status
گزارش می شود. این فیلد فقط برای آن دسته از سنسورهای انتخاب شده ارسال می شود و در لایه SDK به عنوان مقدار دقت ظاهر می شود. برای آن سنسورها، این واقعیت که فیلد وضعیت باید تنظیم شود، در تعریف نوع سنسور آنها ذکر شده است.
فراداده رویدادها را کامل می کند
رویدادهای فراداده مانند رویدادهای حسگر معمولی هستند: sensors_event_meta_data_t = sensors_event_t
. آنها همراه با سایر رویدادهای حسگر از طریق نظرسنجی برگردانده می شوند. آنها دارای زمینه های زیر هستند:
نسخه: باید META_DATA_VERSION
باشد
نوع: باید 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
روی سنسور فراخوانی می شود، تولید می شوند. برای اطلاعات بیشتر به بخش عملکرد فلاش مراجعه کنید.