Sensörler Donanım Soyutlama Katmanı (HAL), Android sensör çerçevesi ve bir cihazın sensörleri (ör. ivme ölçer veya jiroskop. Sensör HAL'si, aşağıdakileri yapmak için uygulanması gereken yapının sensörleri kontrol etmesini sağlar.
AIDL HAL adlı Sensörler, Android 13 ve yeni ve yükseltilmiş cihazlarda daha yüksek olabilir. Google Analytics 4'ü temel alan Sensörler AIDL HAL Sensors HAL 2.1, AIDL HAL arayüzü ve baş takip cihazını ve sınırlı eksenli IMU sensör türlerini açığa çıkarır.
AIDL HAL Arayüzü
AIDL HAL Sensörlerinin ana belge kaynağı HAL içindedir tanım: donanım/interfaces/sensors/aidl/android/dondware/sensors/ISensors.aidl.
AIDL HAL Sensörlerini uygulayın
AIDL HAL Sensörleri'ni uygulamak için bir nesne ISensors
öğesini genişletmelidir
arayüz oluşturmak ve tüm fonksiyonları uygulamak için
donanım/arabirimler/sensörler/aidl/android/donanım/sensörler/ISensors.aidl.
HAL'yi başlatma
Sensör HAL'si, gerçekleştirilmeden önce Android sensör çerçevesi tarafından başlatılmalıdır
olabilir. Çerçeve, initialize()
işlevini çağırarak üç
parametrelerin arasında yer alır: iki FMQ tanımlayıcısı ve bir
ISensorsCallback
nesne algılandı.
HAL, sensörü yazmak için kullanılan Etkinlik FMQ'sunu oluşturmak için ilk tanımlayıcıyı kullanır
zaman çizelgesine
ulaştırmanızı sağlar. HAL, Uyandırma'yı oluşturmak için ikinci tanımlayıcıyı kullanır.
HAL, WAKE_UP
için uyanık kalma kilidini açtığında senkronizasyon yapmak üzere kullanılan FMQ'yu kilitle
sensör olayları. HAL, ISensorsCallback
nesnesine bir işaretçi kaydetmelidir. Böylece,
tüm gerekli geri çağırma işlevlerinin çağrılabilmesini sağlar.
initialize()
işlevi, başlatma sırasında çağrılan ilk işlev olmalıdır
değeri daha yüksek olabilir.
Kullanılabilir sensörleri kullanıma aç
Cihazdaki kullanılabilir tüm statik sensörlerin listesini almak için
getSensorsList()
işlevi. Bu işlev, her bir sensör için
herkese açık kullanıcı adıyla benzersiz şekilde tanımlanır. Belirli bir sensörün tutma yeri değişmemelidir
ve sensör HAL'sini barındıran işlem yeniden başladığında. Herkese açık kullanıcı adları
yeniden başlatılmasına neden olabilir.
Birden fazla sensör aynı sensör türünü ve uyandırma özelliğini paylaşıyorsa
listedeki ilk sensör varsayılan sensör olarak adlandırılır ve
getDefaultSensor(int sensorType, bool wakeUp)
özelliğini kullanan uygulamalar
işlevini kullanın.
Sensör listesinin kararlılığı
Sensör HAL'si yeniden başlatıldıktan sonra veriler getSensorsList()
tarafından döndürülürse
öncesinde alınan sensör listesine kıyasla önemli bir değişiklik olduğunu gösterir
yeniden başlatırsa çerçeve şunun yeniden başlatılmasını tetikler:
Android çalışma zamanı. Sensör listesinde yapılan önemli değişiklikler arasında
belirli bir tutma yerine sahip sensör yok veya özellikleri değişmiş olabilir ya da yeni bir konuma
sensörler kullanılıyor. Android çalışma zamanını yeniden başlatmak kesintiye neden olabilse de
kullanıcı için bu şarttır. Çünkü Android çerçevesi
Statik (dinamik olmayan) sensörlerin 300 gösterime kadar devam ettiği sırada,
süresi vardır. Bu da çerçevenin yeniden kurulmasını engelleyebilir
uygulamalar tarafından yapılan aktif sensör istekleri. Bu nedenle, HAL tedarikçilerinin
sensör listesi değişikliklerinin önüne geçme.
Sensör tutma yerlerinin stabil olması için HAL, belirli bir fiziksel sensörünü yerine koymalıdır. Belirli bir uygulama şekli olmasa da Sensörler HAL arayüzü tarafından zorunlu kılınan bu özellik sayesinde, geliştiricilerin uygunluk ölçütleri olduğunu unutmayın.
Örneğin, sensör listesi her bir sensörün
tedarikçi, model ve sensör türü gibi sabit özellikler. Diğer bir seçenek de
cihazın statik sensörlerinin donanımda sabit olması,
HAL'nin, beklenen tüm sensörlerin başlatma işlemini daha önce tamamladığını bilmesi gerekir.
getSensorsList()
fiyattan dönüyor. Bu liste
beklenen sensörler HAL ikili dosyası olarak derlenebilir veya
dosya sisteminden kaldırmanız gerekir ve görünüm sırası kullanılabilir
herkese açık kullanıcı adları belirleyin. En iyi çözüm HAL'nize bağlı olsa da
özel uygulama ayrıntıları varsa, temel gereksinim, sensörün
tekrar başlatmalarında değişmez.
Sensörleri yapılandırın
Sensör etkinleştirilmeden önce örnekleme kullanılarak yapılandırılmalıdır
süresini ve maksimum raporlama gecikmesi için batch()
işlevini kullanın.
Sensör, batch()
kullanılarak herhangi bir zamanda yeniden yapılandırılabilmelidir.
kaybına neden olabilir.
Örnekleme dönemi
Örnekleme döneminin anlamı, kullanılan sensör türüne göre yapılandırılıyor:
- Sürekli: Sensör etkinlikleri sürekli bir hızda oluşturulur.
- Değişken: Etkinlikler, örnekleme döneminden daha kısa sürede oluşturulmaz ve ölçülen değer örnekleme süresinden daha yavaş bir hızda üretilmiştir. değişmez.
- Tek seferlik: Örnekleme süresi yok sayılır.
- Özel: Daha fazla bilgi için bkz. Sensör türleri.
Örnekleme süresi ile bir sensörün hakkında daha fazla bilgi edinmek için Raporlama modları başlıklı makaleye göz atın.
Maksimum raporlama gecikmesi
Maksimum raporlama gecikmesi, nanosaniye cinsinden maksimum süreyi Etkinlikler, SoC uyanıkken HAL üzerinden Etkinlik FMQ'su.
Sıfır değeri, etkinliklerin gerçekleştiği andan itibaren raporlanması gerektiğini gösterir atlanması veya FIFO'nun boşaltıldığı andan itibaren FIFO'nun boşaltılması, FIFO'da sensörden bir olay bulunur.
Örneğin, maksimum raporlamayla 50 Hz'de etkinleştirilen bir ivme ölçer, gecikme Çip üzerinde sistem (SoC) uyanıkken saniyede 50 kez kesintiye uğrar.
Maksimum raporlama gecikmesi sıfırdan büyük olduğunda sensör etkinlikleri tespit edildiği anda bildirilmelidir. Etkinlikler geçici olarak olduğu sürece donanım FIFO'da saklanır ve gruplar halinde raporlanır. maksimum raporlama gecikmesinden daha fazla gecikmelidir. tarihinden bu yana gerçekleşen tüm etkinlikler önceki gruplar kaydedilir ve tek seferde döndürülür. Bu da proje yöneticisinin SoC'ye gönderilen kesintiler ve SoC'nin daha düşük bir güç moduna geçmesine olanak tanır diğer yandan da veri işlemeye devam ediyor.
Her etkinlikle ilişkilendirilmiş bir zaman damgası vardır. Bir sonraki aşamaya geçmeden önce etkinlik zaman damgasını etkilememelidir. Zaman damgası değil, etkinliğin fiziksel olarak gerçekleştiği zamana karşılık gelmelidir, bildirildiği zaman.
maksimum raporlama gecikmesi için sıfır dışında bir değer vardır. Toplulama bölümüne bakın.
Sensörleri etkinleştir
Çerçeve, activate()
işlevini kullanarak sensörleri etkinleştirir ve devre dışı bırakır.
Bir sensörü etkinleştirmeden önce çerçevenin sensörü yapılandırması gerekir
batch()
kullanılıyor.
Bir sensör devre dışı bırakıldıktan sonra söz konusu sensörden gelen diğer sensör etkinlikleri Etkinlik FMQ'ya yazılmalıdır.
Gömme sensörleri
Bir sensör, sensör verilerini toplu olarak yapılandırılacaksa çerçeve,
flush()
çağrısı yapılarak toplu sensör etkinliklerinin anında temizlenmesi. Bu durum,
belirtilen sensör tutamacı için toplu sensör etkinliklerini
üzerine konuşacağız. Sensör HAL'si, boşaltma tamamlandı etkinliği eklemelidir
gerçekleştirilen bir çağrının sonucunda yazılan sensör etkinliklerinin sonuna
flush()
Temizlik işlemi eşzamansız olarak gerçekleşir (yani bu işlev, hemen) tıklayın. Uygulama birkaç sensör için tek bir FIFO kullanıyorsa bu FIFO temizlenir ve yıkama tamamlandı etkinliği yalnızca belirtilen sensör için eklenir.
Belirtilen sensörde FIFO yoksa (arabelleğe alma mümkün değil) veya FIFO
çağrı sırasında boş bırakılmışsa flush()
yine de başarılı olmalı ve bir temizlik göndermelidir.
etkinliğin tamamlanmasını sağlar. Bu, tek çekim dışındaki tüm sensörler için geçerlidir
olabilir.
Tek seferlik sensör için flush()
çağrılırsa flush()
dönmelidir.
BAD_VALUE
ve tam temizlik için etkinlik oluşturmaz.
Sensör etkinliklerini FMQ'ya yazma
Etkinlik FMQ, Sensör HAL tarafından sensör etkinliklerini Android cihaza aktarmak için kullanılır. yardımcı olabilir.
Etkinlik FMQ, senkronize edilmiş bir FMQ'dur. Bu, daha fazla yazma girişiminin etkinlikleri FMQ'ya göndermenin başarısız olmasına, yazma. Böyle bir durumda HAL, geçerli kümenin yazılıp yazılmayacağını belirlemelidir. iki küçük etkinlik grubu olarak kullanmak veya tüm etkinlikleri yazmak için bir arada kullanabilirsiniz.
Sensör HAL'si, istenen sayıda sensör etkinliğini
Etkinlik FMQ'su, Sensör HAL'si, etkinliklerin hazır olduğunu çerçeveye bildirmelidir.
Etkinlik FMQ'suna EventQueueFlagBits::READ_AND_PROCESS
bitini yazmak
EventFlag::wake
işlevi. EventFlag, Etkinlik FMQ'dan oluşturulabilir
EventFlag::createEventFlag
ve Etkinlik FMQ'su getEventFlagWord()
kullanılarak
işlevini kullanın.
AIDL HAL Sensörleri, Etkinlik FMQ'sunda hem write
hem de writeBlocking
değerini destekler.
Varsayılan uygulama, write
kullanımı için bir referans sağlar. Öğe
writeBlocking
işlevi kullanılır, readNotification
işareti şuna ayarlanmalıdır:
EventQueueFlagBits::EVENTS_READ
,
çeşitli etkinlikleri nasıl ele aldığımızı açıklayacağız. Yazma bildirimi işareti şuna ayarlanmalıdır:
EventQueueFlagBits::READ_AND_PROCESS
, bu etkinlik çerçevesini
Etkinlik FMQ'ya yazılmıştır.
WAKE_UP etkinlikleri
WAKE_UP
etkinlikleri, uygulama işlemcisinin (AP)
harekete geçmeliyiz. Her WAKE_UP
etkinliği yazıldığında
Sensör HAL'si, uyanık kalma kilidini açarak
çerçeve etkinliği işleyebilene dek sistem uyanık kalır. Bir
WAKE_UP
etkinliği gerçekleştirdiğinde, çerçeve kendi uyanık kalma kilidini güvence altına alarak
Sensörler HAL, uyanık kalma kilidini açar. Sensör HAL'si ayarlandığında senkronizasyon yapmak için
uyanık kalma kilidini serbest bıraktığından, Wake Lock FMQ'yu kullanın.
Sensör HAL'si, WAKE_UP
sayısını belirlemek için Wake Lock FMQ'yu okumalıdır
farklı etkinlikleri de içerir. HAL, yalnızca uyanık kalma kilidini açabilir
İşlenmemiş WAKE_UP
etkinliklerinin toplam sayısı sıfırsa WAKE_UP
etkinlikleri için.
Sensör etkinliklerini işledikten sonra çerçeve, oluşturulan etkinliklerin sayısını
WAKE_UP
etkinlikleri olarak işaretlenir ve bu numarayı Uyandırma Kilidi FMQ'ya geri yazar.
Çerçeve, WakeLockQueueFlagBits::DATA_WRITTEN
yazma işlemini ayarlar
bildirimi alır.
Dinamik sensörler
Dinamik sensörler, fiziksel olarak cihazın bir parçası olmasa da cihazın bir parçası olmayan (ivme ölçerli oyun kumandası gibi) cihaza giriş olarak kullanılmalıdır.
Dinamik bir sensör bağlandığında onDynamicSensorConnected
işlevi şurada çalışır:
ISensorsCallback
, Sensör HAL'sinden çağrılmalıdır. Bu işlem,
çerçevesine sahiptir ve sensörün kontrol edilmesine olanak sağlar
ve sensörün etkinliklerinin istemciler tarafından tüketilmesini sağlar.
Benzer şekilde, bir dinamik sensör bağlantısı kesildiğinde
ISensorsCallback
içindeki onDynamicSensorDisconnected
işlevi, bu şekilde çağrılmalıdır
mevcut olmayan sensörleri kaldırabilir.
Doğrudan kanal
Doğrudan kanal, sensör olaylarının yazıldığı bir çalışma yöntemidir
Android Sensörlerini atlayan Etkinlik FMQ yerine belirli bir hafıza
Çerçeve. Doğrudan kanal kaydeden bir istemci, sensör etkinliklerini okumalıdır.
doğrudan kanalı oluşturmak için kullanılan
hafızadan veya doğrudan
çerçeve üzerinden sensör etkinliklerini alabilir. configDirectReport()
işlevi, normal çalışma için batch()
işlevine benzer ve doğrudan
rapor kanalı.
registerDirectChannel()
ve unregisterDirectChannel()
işlevleri
veya yeni bir doğrudan kanalı kaldırabilirsiniz.
Çalışma modları
setOperationMode()
işlevi, çerçevenin bir sensörü yapılandırmasına olanak tanır
Böylece çerçeve, sensöre sensör verileri yerleştirebilir. Bu, özellikle
özellikle de çerçevenin altında yer alan algoritmalar için.
injectSensorData()
işlevi normalde
parametrelerini Sensör HAL'sine gönderir. İşlev, sensör yerleştirme için de kullanılabilir
belirli bir sensöre aktarmanızı sağlar.
Doğrulama
Sensör HAL'sini uygulamanızı doğrulamak için CTS ve VTS sensörünü çalıştırın testler.
CTS testleri
Sensör CTS testleri hem otomatik CTS testlerinde hem de manuel CTS Doğrulayıcıda bulunur uygulamasını indirin.
Otomatik testler, cts/tests/sensor/src/android/hardware/cts olarak değiştirin. Bu testler, sensörlerin standart işlevlerini (ör. ve sensör etkinlik hızlarını içerir.
CTS Doğrulayıcı testleri, cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors. Bu testler, test operatörünün manuel giriş yapmasını gerektirir ve sensörlerin doğru değerler raporlayabilir.
CTS testlerini geçmek, test edilen cihazın uygunluğunu sağlamak açısından kritik öneme sahiptir. tüm CDD koşulları için geçerlidir.
VTS testleri
AIDL HAL Sensörleri için VTS testleri şurada bulunmaktadır:
donanım/arayüzler/sensörler/aidl/vts/
Bu testler, Sensör HAL'nin doğru bir şekilde uygulanmasını ve
ISensors.aidl
ve ISensorsCallback.aidl
alanlarındaki gereksinimler gerektiği gibi karşılandı.
HAL'yi başlatma
FMQ oluşturmak için initialize()
işlevi desteklenmelidir.
çerçeve ve HAL.
Kullanılabilir sensörleri kullanıma aç
AIDL HAL Sensörlerinde getSensorsList()
işlevi aynı değeri döndürmelidir
yeniden başlatma sırasında bile gerçekleşebilir. Yeni bir koşul
getSensorsList()
işlevinin en önemli özelliği,
yeniden başlatılsa bile tek bir cihaz başlatılabilir. Bu şekilde
sensör bağlantılarını yeniden kurmayı denemek için sistem
yeniden başlatılır. getSensorsList()
tarafından döndürülen değer cihaz sonrasında değişebilir
yeniden başlatma işlemi gerçekleştirir.
Sensör etkinliklerini FMQ'ya yazma
Sensörler, poll()
işlevinin çağrılmasını beklemek yerine AIDL HAL'deki Sensörler
Sensör etkinlikleri her gerçekleştiğinde HAL, sensör etkinliklerini proaktif olarak Etkinlik FMQ'ya yazmalıdır
kullanılabilir. HAL, aynı zamanda doğru bitleri yazmaktan ve
EventFlag
.
WAKE_UP etkinlikleri
Sensör HAL 1.0'da HAL, tüm WAKE_UP
için uyanık kalma kilidini açabildi
WAKE_UP
öğesinin yayınlanmasından sonra poll()
numaralı telefona yapılan sonraki herhangi bir aramada gerçekleşen etkinlik
Bu, çerçevenin tüm sensörü işlediğini belirttiği için poll()
ve gerekirse bir uyanık kalma kilidi edinmişti. Çünkü AIDL Sensörlerinde
HAL, çerçeve tarafından işlenmiş etkinlikler olduğunda HAL artık bilgilendirilmeyecek
Wake Lock FMQ, çerçevenin bu ürünle iletişim kurmasını sağlar.
WAKE_UP
etkinliği işlendiğinde HAL.
AIDL HAL Sensörlerinde, WAKE_UP
için Sensör HAL tarafından korunan uyanık kalma kilidi
etkinlikler SensorsHAL_WAKEUP
ile başlamalıdır.
Dinamik sensörler
Dinamik sensörler, Sensör HAL 1.0'daki poll()
işlevi kullanılarak döndürüldü.
AIDL HAL Sensörleri için onDynamicSensorsConnected
ve
Dinamik olduğunda ISensorsCallback
içindeki onDynamicSensorsDisconnected
çağrılır
sensör bağlantılarında değişiklik olabilir. Bu geri çağırma işlevleri
initialize()
işlevi aracılığıyla sağlanan ISensorsCallback
işaretçisi.
Çalışma modları
WAKE_UP
sensör için DATA_INJECTION
modu desteklenmelidir.
Multi-HAL desteği
AIDL HAL Sensörleri, Sensörler Multi-HAL çerçevesi Örneğin, uygulama ayrıntıları için Sensör HAL 2.1'den Taşıma.