Sensörler AIDL HAL

Sensör Donanımı Soyutlama Katmanı (HAL), Android sensör çerçevesi ile ivmeölçer veya jiroskop gibi bir cihazın sensörleri arasındaki arayüzdür. Sensörler HAL, çerçevenin sensörleri kontrol etmesine izin vermek için uygulanması gereken işlevleri tanımlar.

Sensörler AIDL HAL, yeni ve yükseltilmiş cihazlar için Android 13 ve üzeri sürümlerde mevcuttur. Sensörler HAL 2.1'i temel alan Sensörler AIDL HAL, AIDL HAL arayüzünü kullanır ve kafa izleyici ve sınırlı eksenli IMU sensör türlerini ortaya çıkarır.

AIDL HAL Arayüzü

AIDL HAL Sensörlerine ilişkin ana belge kaynağı , hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl adresindeki HAL tanımı dahilindedir.

AIDL HAL Sensörlerini Uygulama

Sensors AIDL HAL'yi uygulamak için bir nesnenin ISensors arayüzünü genişletmesi ve hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl'de tanımlanan tüm işlevleri uygulaması gerekir.

HAL'yi başlat

Sensörler HAL'nin kullanılmadan önce Android sensör çerçevesi tarafından başlatılması gerekir. Çerçeve, Sensör HAL'sine üç parametre sağlamak için initialize() işlevini çağırır: iki FMQ tanımlayıcısı ve bir ISensorsCallback nesnesine yönelik bir işaretçi.

HAL, sensör olaylarını çerçeveye yazmak için kullanılan Olay FMQ'sunu oluşturmak için ilk tanımlayıcıyı kullanır. HAL, WAKE_UP sensör olayları için uyanma kilidini serbest bıraktığında senkronize etmek için kullanılan Uyandırma Kilidi FMQ'sunu oluşturmak için ikinci tanımlayıcıyı kullanır. Gerekli geri çağırma işlevlerinin çağrılabilmesi için HAL'nin ISensorsCallback nesnesine bir işaretçi kaydetmesi gerekir.

initialize() işlevi, Sensör HAL'i başlatılırken çağrılan ilk işlev olmalıdır.

Mevcut sensörleri açığa çıkarın

Cihazdaki mevcut tüm statik sensörlerin bir listesini almak için getSensorsList() işlevini kullanın. Bu işlev, her biri tanıtıcısıyla benzersiz şekilde tanımlanan sensörlerin bir listesini döndürür. Belirli bir sensörün tanıtıcısı, Sensör HAL'sini barındıran işlem yeniden başlatıldığında değişmemelidir. Tanıtıcılar, cihazın yeniden başlatılması ve sistem sunucusunun yeniden başlatılması sırasında değişebilir.

Birkaç sensör aynı sensör tipini ve uyandırma özelliğini paylaşıyorsa listedeki ilk sensöre varsayılan sensör adı verilir ve getDefaultSensor(int sensorType, bool wakeUp) işlevini kullanan uygulamalara döndürülür.

Sensör listesinin kararlılığı

Sensors HAL yeniden başlatıldıktan sonra getSensorsList() tarafından döndürülen veriler, yeniden başlatmadan önce alınan sensör listesine kıyasla önemli bir değişiklik olduğunu gösteriyorsa çerçeve, Android çalışma zamanının yeniden başlatılmasını tetikler. Sensör listesindeki önemli değişiklikler arasında, belirli bir tanıtıcıya sahip bir sensörün eksik olduğu veya niteliklerinin değiştiği ya da yeni sensörlerin eklendiği durumlar yer alır. Android çalışma zamanının yeniden başlatılması kullanıcı açısından rahatsız edici olsa da, Android çerçevesinin, statik (dinamik olmayan) sensörlerin bir uygulamanın ömrü boyunca değişmemesine ilişkin Android API sözleşmesini artık karşılayamaması nedeniyle bu gereklidir. Bu aynı zamanda çerçevenin uygulamalar tarafından yapılan aktif sensör isteklerini yeniden oluşturmasını da engelleyebilir. Bu nedenle HAL satıcılarına önlenebilir sensör listesi değişikliklerini önlemeleri tavsiye edilir.

Kararlı sensör tutamaçlarını sağlamak için HAL'in, cihazdaki belirli bir fiziksel sensörü deterministik olarak kendi tutamacıyla eşlemesi gerekir. Sensors HAL arayüzü tarafından özel bir uygulama zorunlu kılınmasa da, geliştiricilerin bu gereksinimi karşılamak için çeşitli seçenekleri mevcuttur.

Örneğin sensör listesi, her sensörün satıcı, model ve sensör türü gibi sabit özelliklerinin bir kombinasyonu kullanılarak sıralanabilir. Diğer bir seçenek, cihazın statik sensör setinin donanımda sabitlenmiş olması gerçeğine dayanır; dolayısıyla HAL'ın getSensorsList() işlevinden dönmeden önce beklenen tüm sensörlerin başlatma işlemini ne zaman tamamladığını bilmesi gerekir. Beklenen sensörlerin bu listesi HAL ikili dosyasında derlenebilir veya dosya sistemindeki bir yapılandırma dosyasında saklanabilir ve görünüm sırası, kararlı tanıtıcılar türetmek için kullanılabilir. En iyi çözüm HAL'inizin özel uygulama ayrıntılarına bağlı olsa da temel gereksinim, sensör tutamaçlarının HAL yeniden başlatıldığında değişmemesidir.

Sensörleri yapılandırma

Bir sensör etkinleştirilmeden önce sensörün, batch() işlevi kullanılarak bir örnekleme periyodu ve maksimum raporlama gecikmesi ile yapılandırılması gerekir.

Bir sensörün, herhangi bir zamanda, sensör verileri kaybı olmadan batch() kullanılarak yeniden yapılandırılabilmesi gerekir.

Örnekleme periyodu

Örnekleme periyodu, yapılandırılan sensör tipine bağlı olarak farklı bir anlama sahiptir:

  • Sürekli: Sensör olayları sürekli bir hızda oluşturulur.
  • Değişiklik halinde: Olaylar örnekleme periyodundan daha hızlı üretilmez ve ölçülen değer değişmezse örnekleme periyodundan daha yavaş bir hızda üretilebilir.
  • Tek seferlik: Örnekleme periyodu göz ardı edilir.
  • Özel: Daha fazla ayrıntı için bkz. Sensör türleri .

Örnekleme periyodu ile sensörün raporlama modları arasındaki etkileşim hakkında bilgi edinmek için bkz. Raporlama modları .

Maksimum raporlama gecikmesi

Maksimum raporlama gecikmesi, SoC uyanıkken HAL aracılığıyla Event FMQ'ya yazılmadan önce olayların ertelenebileceği ve donanım FIFO'sunda depolanabileceği maksimum süreyi nanosaniye cinsinden ayarlar.

Sıfır değeri, FIFO'yu tamamen atlayarak veya sensörden gelen bir olay FIFO'da mevcut olur olmaz FIFO'yu boşaltarak olayların ölçülür ölçülmez raporlanması gerektiğini belirtir.

Örneğin, sıfır tetiklemeden oluşan maksimum raporlama gecikmesi ile 50 Hz'de etkinleştirilen bir ivmeölçer, SoC uyanıkken saniyede 50 kez kesintiye uğrar.

Maksimum raporlama gecikmesi sıfırdan büyük olduğunda sensör olaylarının algılanır algılanmaz raporlanmasına gerek yoktur. Hiçbir olay maksimum raporlama gecikmesinden daha fazla geciktirilmediği sürece, olaylar geçici olarak donanım FIFO'sunda saklanabilir ve gruplar halinde raporlanabilir. Önceki gruptan itibaren tüm olaylar kaydedilir ve bir kerede geri gönderilir. Bu, SoC'ye gönderilen kesinti sayısını azaltır ve sensör verileri yakalayıp toplurken SoC'nin daha düşük bir güç moduna geçmesine olanak tanır.

Her olayın kendisiyle ilişkilendirilmiş bir zaman damgası vardır. Bir olayın raporlandığı zamanın geciktirilmesi, olay zaman damgasını etkilememelidir. Zaman damgası doğru olmalı ve olayın rapor edildiği zamana değil, fiziksel olarak gerçekleştiği zamana karşılık gelmelidir.

Sensör olaylarını sıfırdan farklı maksimum raporlama gecikmesiyle raporlamaya ilişkin ek bilgi ve gereksinimler için bkz .

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 öncelikle sensörü batch() kullanarak yapılandırması gerekir.

Bir sensör devre dışı bırakıldıktan sonra, o sensörden gelen ek sensör olayları Olay FMQ'ya yazılmamalıdır.

Yıkama sensörleri

Bir sensör, sensör verilerini toplu olarak kullanacak şekilde yapılandırılmışsa, çerçeve flush() çağırarak toplu sensör olaylarının anında temizlenmesini zorlayabilir. Bu, belirtilen sensör tanıtıcısı için toplu sensör olaylarının anında Olay FMQ'ya yazılmasına neden olur. Sensörler HAL'nin, bir flush() çağrısının sonucu olarak yazılan sensör olaylarının sonuna bir temizleme tamamlandı olayı eklemesi gerekir.

Yıkama eşzamansız olarak gerçekleşir (yani bu işlevin hemen geri dönmesi gerekir). Uygulama birkaç sensör için tek bir FIFO kullanıyorsa, bu FIFO temizlenir ve temizleme tamamlama olayı yalnızca belirtilen sensör için eklenir.

Belirtilen sensörün FIFO'su yoksa (ara belleğe alma mümkün değil) veya çağrı sırasında FIFO boşsa, flush() un yine de başarılı olması ve bu sensör için bir temizleme tamamlama olayı göndermesi gerekir. Bu, tek atımlı sensörler dışındaki tüm sensörler için geçerlidir.

Tek atımlı bir sensör için flush() çağrılırsa, bu durumda flush() işlevi BAD_VALUE döndürmeli ve bir temizleme tamamlama olayı oluşturmamalıdır.

Sensör olaylarını FMQ'ya yazın

Event FMQ, Sensors HAL tarafından sensör olaylarını Android sensör çerçevesine aktarmak için kullanılır.

Event FMQ senkronize bir FMQ'dur; bu, FMQ'ya mevcut alandan daha fazla olay yazma girişiminin başarısız bir yazmayla sonuçlanacağı anlamına gelir. Böyle bir durumda HAL, mevcut olay kümesini iki küçük olay grubu olarak mı yazacağını yoksa yeterli alan olduğunda tüm olayları birlikte mi yazacağını belirlemelidir.

Sensörler HAL, Event FMQ'ya istenen sayıda sensör olayını yazdığında, Sensörler HAL EventQueueFlagBits::READ_AND_PROCESS bitini Event FMQ'nun EventFlag::wake işlevine yazarak olayların hazır olduğunu çerçeveye bildirmelidir. EventFlag EventFlag::createEventFlag ve Event FMQ'nun getEventFlagWord() işlevi kullanılarak Event FMQ'dan oluşturulabilir.

AIDL HAL Sensörleri, Event FMQ'da hem write hem de writeBlocking destekler. Varsayılan uygulama write kullanımı için bir referans sağlar. writeBlocking işlevi kullanılıyorsa, readNotification bayrağının, Event FMQ'dan olayları okurken çerçeve tarafından ayarlanan EventQueueFlagBits::EVENTS_READ olarak ayarlanması gerekir. Yazma bildirim bayrağı, olayların Event FMQ'ya yazıldığını çerçeveye bildiren EventQueueFlagBits::READ_AND_PROCESS olarak ayarlanmalıdır.

WAKE_UP etkinlikleri

WAKE_UP olayları, uygulama işlemcisinin (AP) uyanmasına ve olayı hemen işlemesine neden olan sensör olaylarıdır. Olay FMQ'suna bir WAKE_UP olayı yazıldığında, HAL Sensörleri, çerçeve olayı işleyinceye kadar sistemin uyanık kalmasını sağlamak için bir uyandırma kilidi sağlamalıdır. Bir WAKE_UP olayı alındığında, çerçeve kendi uyanık kalma kilidini güvence altına alarak Sensör HAL'inin uyanma kilidini serbest bırakmasına olanak tanır. Sensör HAL'i uyandırma kilidini serbest bıraktığında senkronize etmek için Uyandırma Kilidi FMQ'yu kullanın.

HAL Sensörleri, çerçevenin işlediği WAKE_UP olaylarının sayısını belirlemek için Wake Lock FMQ'yu okumalıdır. HAL, yalnızca işlenmeyen WAKE_UP olaylarının toplam sayısı sıfırsa WAKE_UP olayları için uyandırma kilidini serbest bırakmalıdır. Sensör olaylarını işledikten sonra çerçeve, WAKE_UP olayları olarak işaretlenen olayların sayısını sayar ve bu sayıyı Wake Lock FMQ'ya geri yazar.

Çerçeve, Wake Lock FMQ'ya veri yazdığında WakeLockQueueFlagBits::DATA_WRITTEN yazma bildirimini Wake Lock FMQ'da ayarlar.

Dinamik sensörler

Dinamik sensörler, fiziksel olarak cihazın bir parçası olmayan ancak ivme ölçerli bir oyun kumandası gibi cihaza giriş olarak kullanılabilen sensörlerdir.

Dinamik bir sensör bağlandığında, ISensorsCallback onDynamicSensorConnected işlevi Sensors HAL'den çağrılmalıdır. Bu, yeni dinamik sensörün çerçevesini bilgilendirir ve sensörün çerçeve aracılığıyla kontrol edilmesine ve sensör olaylarının istemciler tarafından tüketilmesine olanak tanır.

Benzer şekilde, dinamik bir sensörün bağlantısı kesildiğinde, çerçevenin artık mevcut olmayan herhangi bir sensörü kaldırabilmesi için ISensorsCallback onDynamicSensorDisconnected işlevi çağrılmalıdır.

Doğrudan kanal

Doğrudan kanal, Android Sensors Framework'ü atlayarak sensör olaylarının Event FMQ yerine belirli bir belleğe yazıldığı bir çalışma yöntemidir. Doğrudan kanalı kaydeden bir istemci, sensör olaylarını doğrudan kanalı oluşturmak için kullanılan bellekten okumalıdır ve sensör olaylarını çerçeve aracılığıyla almayacaktır. configDirectReport() işlevi, normal çalışma için batch() işlevine benzer ve doğrudan rapor kanalını yapılandırır.

registerDirectChannel() ve unregisterDirectChannel() işlevleri yeni bir doğrudan kanal oluşturur veya yok eder.

Çalışma modları

setOperationMode() işlevi, çerçevenin sensör verilerini sensöre enjekte edebileceği şekilde çerçevenin bir sensörü yapılandırmasına olanak tanır. Bu, özellikle çerçevenin altında bulunan algoritmalar için test yapmak için kullanışlıdır.

injectSensorData() işlevi normalde operasyonel parametreleri Sensör HAL'sine göndermek için kullanılır. Bu fonksiyon aynı zamanda sensör olaylarını belirli bir sensöre enjekte etmek için de kullanılabilir.

Doğrulama

Sensör HAL uygulamanızı doğrulamak için sensör CTS ve VTS testlerini çalıştırın.

CTS testleri

Sensör CTS testleri hem otomatik CTS testlerinde hem de manuel CTS Doğrulayıcı uygulamasında mevcuttur.

Otomatik testler cts/tests/sensor/src/android/hardware/cts konumunda bulunur. Bu testler, sensörlerin etkinleştirilmesi, gruplama ve sensör olay oranları gibi sensörlerin standart işlevlerini doğrular.

CTS Doğrulayıcı testleri cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors konumunda bulunur. Bu testler, test operatörünün manuel giriş yapmasını gerektirir ve sensörlerin doğru değerleri raporlamasını sağlar.

CTS testlerini geçmek, test edilen cihazın tüm CDD gerekliliklerini karşıladığından emin olmak açısından kritik öneme sahiptir.

VTS testleri

AIDL HAL Sensörleri için VTS testleri donanım/arayüzler/sensörler/aidl/vts/ konumunda bulunur. Bu testler, Sensors HAL'nin doğru şekilde uygulandığından ve ISensors.aidl ve ISensorsCallback.aidl içindeki tüm gereksinimlerin doğru şekilde karşılandığından emin olur.

HAL'yi başlat

Çerçeve ile HAL arasında FMQ'lar oluşturmak için initialize() işlevinin desteklenmesi gerekir.

Mevcut sensörleri açığa çıkarın

Sensors AIDL HAL'de getSensorsList() işlevi, Sensors HAL yeniden başlatılsa bile tek bir aygıt önyüklemesi sırasında aynı değeri döndürmelidir. getSensorsList() işlevinin yeni bir gereksinimi, Sensörler HAL yeniden başlatıldığında bile tek bir aygıt önyüklemesi sırasında aynı değeri döndürmesinin gerekli olmasıdır. Bu, sistem sunucusunun yeniden başlatılması durumunda çerçevenin sensör bağlantılarını yeniden kurmaya çalışmasına olanak tanır. getSensorsList() tarafından döndürülen değer, aygıt yeniden başlatma gerçekleştirdikten sonra değişebilir.

Sensör olaylarını FMQ'ya yazın

Sensörler AIDL HAL'de poll() öğesinin çağrılmasını beklemek yerine, Sensör HAL'leri, sensör olayları mevcut olduğunda proaktif olarak sensör olaylarını Olay FMQ'suna yazmalıdır. HAL ayrıca çerçeve içinde bir FMQ okumasına neden olmak için EventFlag doğru bitleri yazmaktan da sorumludur.

WAKE_UP etkinlikleri

Sensors HAL 1.0'da HAL, poll poll() a bir WAKE_UP gönderildikten sonra herhangi bir sonraki poll( poll() çağrısında herhangi bir WAKE_UP olayı için uyandırma kilidini serbest bırakabildi çünkü bu, çerçevenin tüm sensör olaylarını işlediğini ve bir sonuç elde ettiğini gösteriyordu. Gerekirse uyandırma kilidi. Çünkü AIDL HAL Sensörlerinde, çerçeve FMQ'ya yazılan olayları işlediğinde HAL artık bilgilendirilmiyor; Wake Lock FMQ, çerçevenin WAKE_UP olaylarını işlediğinde HAL ile iletişim kurmasına izin veriyor.

Sensors AIDL HAL'de, WAKE_UP olayları için Sensors HAL tarafından güvence altına alınan uyanık kalma kilidi SensorsHAL_WAKEUP ile başlamalıdır.

Dinamik sensörler

Dinamik sensörler, Sensors HAL 1.0'daki poll() işlevi kullanılarak döndürüldü. AIDL HAL Sensörleri, dinamik sensör bağlantıları değiştiğinde ISensorsCallback onDynamicSensorsConnected ve onDynamicSensorsDisconnected öğelerinin çağrılmasını gerektirir. Bu geri aramalar, initialize() işlevi aracılığıyla sağlanan ISensorsCallback işaretçisinin bir parçası olarak kullanılabilir.

Çalışma modları

WAKE_UP sensörleri için DATA_INJECTION modu desteklenmelidir.

Çoklu HAL desteği

Sensors AIDL HAL, Sensors Multi-HAL çerçevesini kullanarak çoklu HAL'i destekler. Uygulama ayrıntıları için bkz. HAL 2.1 Sensörlerinden Taşıma .