وضعیتهای برق SoC
وضعیتهای برق سیستم روی تراشه (SoC) عبارتاند از: روشن، در حالت آزاد، و تعلیق. «روشن» زمانی است که SoC درحال اجرا است. «آمادهبهکار» حالت میانهای از مصرف برق است که در آن SoC روشن است اما هیچ کاری انجام نمیدهد. «تعلیق» حالت کممصرفی است که در آن SoC برق ندارد. مصرف برق دستگاه در این حالت معمولاً ۱۰۰ برابر کمتر از حالت «روشن» است.
حسگرهای غیرفعالکننده
حسگرهای غیربیدارکننده حسگرهایی هستند که مانع از رفتن SoC به حالت تعلیق نمیشوند و SoC را برای گزارش دادهها بیدار نمیکنند. بهطور خاص، درایورها مجاز به نگهداری قفلهای بیداری نیستند. برنامهها مسئولیت دارند که اگر میخواهند وقتی صفحهنمایش خاموش است از حسگرهای غیربیدارکننده رویداد دریافت کنند، قفل بیداری جزئی را حفظ کنند. وقتی SoC در حالت تعلیق است، حسگرها باید به عملکرد خود ادامه دهند و رویداد تولید کنند، که در یک سختافزار FIFO قرار میگیرند. (برای جزئیات بیشتر، دستهبندی را ببینید.) وقتی SoC بیدار میشود، رویدادهای موجود در FIFO به برنامهها تحویل داده میشوند. اگر FIFO برای ذخیره همه رویدادها خیلی کوچک باشد، رویدادهای قدیمیتر ازدست میروند؛ قدیمیترین دادهها حذف میشوند تا فضا برای جدیدترین دادهها باز شود. در حالت شدید که FIFO وجود ندارد، همه رویدادهای تولیدشده درحالیکه SoC در حالت تعلیق است ازدست میروند. یک استثنا وجود دارد و آن جدیدترین رویداد از هر حسگر تغییر است: آخرین رویداد باید خارج از FIFO ذخیره شود تا ازدست نرود.
بهمحض اینکه SoC از حالت تعلیق خارج شود، همه رویدادهای FIFO گزارش میشوند و عملیاتها به حالت عادی ازسر گرفته میشوند.
برنامههایی که از حسگرهای غیربیدارکننده استفاده میکنند باید یا قفل بیداری نگه دارند تا مطمئن شوند سیستم به حالت تعلیق نمیرود، یا وقتی به حسگرها نیاز ندارند، ثبت آنها را لغو کنند، یا انتظار داشته باشند که وقتی SoC در حالت تعلیق است، رویدادها را ازدست بدهند.
حسگرهای بیدار شدن
برخلاف حسگرهای غیربیدارباش، حسگرهای بیدارباش تضمین میکنند که دادههایشان بدون توجه به وضعیت SoC ارائه شود. وقتی SoC بیدار است، حسگرهای بیدارباش مانند حسگرهای غیربیدارباش عمل میکنند. وقتی SoC در حالت خواب است، حسگرهای بیدارباش باید SoC را بیدار کنند تا رویدادها را ارائه دهند. آنها همچنان باید به SoC اجازه دهند به حالت تعلیق برود، اما باید آن را هنگام نیاز به گزارش رویداد بیدار کنند. یعنی حسگر باید SoC را بیدار کند و رویدادها را قبلاز اینکه بیشینه تأخیر گزارشدهی سپری شود یا FIFO سختافزاری پر شود ارائه دهد. برای جزئیات بیشتر، دستهبندی را ببینید.
برای اطمینان از اینکه برنامهها قبلاز اینکه SoC دوباره به حالت خواب برود، زمان کافی برای دریافت رویداد را دارند، درایور باید هر بار که رویدادی گزارش میشود، یک «قفل بیدارباش با وقفه زمانی» را بهمدت ۲۰۰ میلیثانیه نگه دارد. یعنی SoC نباید اجازه داشته باشد در ۲۰۰ میلیثانیه پساز وقفه بیدار شدن دوباره به خواب برود. این الزام در نسخهٔ پخش آتی Android برداشته خواهد شد و تا آن زمان به این قفل بیدارباش زماندار نیاز داریم.
چگونه حسگرهای بیدارباش و غیربیدارباش را تعریف کنیم؟
تا KitKat، اینکه حسگری حسگر بیدارباش باشد یا حسگر غیربیدارباش، بهنوع حسگر بستگی داشت: اکثر حسگرها غیربیدارباش بودند، بهجز حسگر مجاورت و آشکارساز حرکت قابلتوجه.
از L شروع میشود، اینکه حسگر معینی حسگر بیدارباش است یا نه با پرچمی در تعریف حسگر مشخص میشود. اکثر حسگرها را میتوان با جفتهای انواع بیدارباش و غیربیدارباش همان حسگر تعریف کرد، که در این صورت باید بهعنوان دو حسگر مستقل رفتار کنند و با یکدیگر تعامل نداشته باشند. برای جزئیات بیشتر، تعامل را ببینید.
مگر اینکه در تعریف نوع حسگر بهگونهای دیگر مشخص شده باشد، توصیه میشود
برای هر نوع حسگر فهرستشده در انواع حسگر، یک حسگر بیدارکننده و یک حسگر غیربیدارکننده پیادهسازی کنید. در تعریف هر نوع حسگر، ببینید کدام حسگر (حسگر بیدارباش یا حسگر غیربیدارباش) توسط SensorManager.getDefaultSensor(sensorType) برگردانده خواهد شد. این حسگری است که اکثر برنامهها از آن استفاده میکنند.