AIDL HAL Sensörleri

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.