Sensörler AIDL HAL

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

Sensörler AIDL HAL, yeni ve yükseltilmiş cihazlarda Android 13 ve sonraki sürümlerde kullanılabilir. Sensors HAL 2.1'e dayalı Sensors AIDL HAL, AIDL HAL arayüzünü kullanır ve kafa takip cihazı ile sınırlı eksenli IMU sensör türlerini gösterir.

AIDL HAL Arayüzü

Sensörler AIDL HAL'i için ana doküman kaynağı, hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl adresindeki HAL tanımındadır.

Sensörler AIDL HAL'ini uygulama

Sensors AIDL HAL'i uygulamak için bir nesnenin ISensorsarabirimi genişletmesi ve hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl dosyasında tanımlanan tüm işlevleri uygulaması gerekir.

HAL'i başlatma

Sensors HAL, kullanılabilmesi için Android sensör çerçevesi tarafından başlatılmalıdır. Çerçeve, Sensors HAL'e üç parametre sağlamak için initialize() işlevini çağırır: iki FMQ tanımlayıcısı ve bir ISensorsCallback nesnesine işaretçi.

HAL, çerçeveye sensör etkinlikleri yazmak için kullanılan Event FMQ'yi oluşturmak üzere ilk tanımlayıcıyı kullanır. HAL, HAL WAKE_UPsensör etkinlikleri için uyanma kilidini bıraktığında senkronize etmek üzere kullanılan WakeLock FMQ'yi oluşturmak için ikinci tanımlayıcıyı kullanır. HAL, gerekli geri çağırma işlevlerinin çağrılabilmesi için ISensorsCallback nesnesine bir işaretçi kaydetmelidir.

initialize() işlevi, Sensörler HAL'i ilk kullanıma hazırlarken çağrılan ilk işlev olmalıdır.

Mevcut sensörleri gösterme

Cihazdaki tüm statik sensörlerin listesini almak için getSensorsList() işlevini kullanın. Bu işlev, her biri herkese açık kullanıcı adıyla benzersiz şekilde tanımlanan sensörlerin listesini döndürür. Sensors HAL'i barındıran işlem yeniden başlatıldığında belirli bir sensörün herkese açık adı değişmemelidir. Herkese açık kullanıcı adları, 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 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) işlevini kullanan uygulamalara döndürülür.

Sensörler 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 gösteriyorsa çerçeve, Android çalışma zamanının yeniden başlatılmasını tetikler. Sensör listesinde yapılan önemli değişiklikler arasında, belirli bir herkese açık kullanıcı adına sahip bir sensörün eksik olduğu veya özelliklerinin değiştiği ya da yeni sensörlerin kullanıma sunulduğu durumlar yer alır. Android çalışma zamanının yeniden başlatılması kullanıcı için rahatsız edici olsa da Android çerçevesi artık statik (dinamik olmayan) sensörlerin bir uygulamanın ömrü boyunca değişmediği Android API sözleşmesini karşılayamadığı için bu işlem gereklidir. Bu durum, çerçevenin uygulamalar tarafından yapılan etkin sensör isteklerini yeniden oluşturmasını da engelleyebilir. Bu nedenle, HAL tedarikçilerinin önlenebilir sensör listesi değişikliklerini önlemesi önerilir.

Sensör tutamaçlarının kararlı olması için HAL'in, cihazdaki belirli bir fiziksel sensörü tutamacıyla doğrusal bir şekilde eşlemesi gerekir. Sensörler HAL arayüzü belirli bir uygulamayı zorunlu tutmasa da geliştiricilerin bu koşulu karşılamak için kullanabileceği çeşitli seçenekler vardır.

Örneğin, sensör listesi her sensörün sabit özelliklerinin (ör. tedarikçi, model ve sensör türü) bir kombinasyonu kullanılarak sıralanabilir. Diğer bir seçenek, cihazın statik sensör grubunun donanımda sabit olmasıdır. Bu nedenle HAL'in, getSensorsList()'ten dönmeden önce beklenen tüm sensörlerin başlatmayı ne zaman tamamladığını bilmesi gerekir. Beklenen sensörlerin bu listesi HAL ikilisine derlenebilir veya dosya sistemindeki bir yapılandırma dosyasında saklanabilir. Ayrıca, kararlı tutamaç oluşturmak için görünme sırası kullanılabilir. En iyi çözüm, HAL'inizin uygulama ayrıntılarına bağlı olsa da temel şart, HAL'in yeniden başlatılması sırasında sensör tutamaçlarının değişmemesidir.

Sensörleri yapılandırma

Bir sensör etkinleştirilmeden önce, batch() işlevi kullanılarak bir örnekleme dönemi ve maksimum raporlama gecikmesi ile yapılandırılmalıdır.

Sensör verileri kaybolmadan, sensörler batch() kullanılarak dilediğiniz zaman yeniden yapılandırılabilmelidir.

Örnekleme dönemi

Örnekleme dönemi, yapılandırılan sensör türüne bağlı olarak farklı bir anlama sahiptir:

  • Sürekli: Sensör etkinlikleri sürekli bir hızda oluşturulur.
  • Değişiklik olduğunda: Etkinlikler, örnekleme döneminden daha hızlı oluşturulmaz ve ölçülen değer değişmezse örnekleme döneminden daha yavaş bir hızda oluşturulabilir.
  • Tek seferlik: Örnekleme dönemi yoksayılır.
  • Özel: Daha fazla bilgi için Sensör türleri başlıklı makaleyi inceleyin.

Örnekleme dönemi ile sensörün raporlama modları arasındaki etkileşim hakkında bilgi edinmek için Raporlama modları başlıklı makaleyi inceleyin.

Maksimum raporlama gecikmesi

Maksimum raporlama gecikmesi, SoC uyanıkken HAL üzerinden Event FMQ'ye yazılmadan önce etkinliklerin gecikebileceği ve donanım FIFO'sunda depolanabileceği maksimum süreyi nanosaniye cinsinden belirler.

Sıfır değeri, etkinliklerin ölçüldükleri anda raporlanması gerektiğini, FIFO'nun tamamen atlanması gerektiğini veya FIFO'da sensörden bir etkinlik olduğunda FIFO'nun boşaltılması gerektiğini belirtir.

Örneğin, maksimum raporlama gecikmesi sıfır olan ve 50 Hz'de etkinleştirilen bir ivmeölçer, SoC uyanıkken saniyede 50 kez kesinti yapar.

Maksimum raporlama gecikmesi sıfırdan büyük olduğunda, sensör etkinliklerinin algılanır algılanmaz raporlanması gerekmez. Hiçbir etkinlik maksimum raporlama gecikmesinden daha fazla gecikmediği sürece etkinlikler geçici olarak donanım FIFO'sunda depolanabilir ve toplu olarak raporlanabilir. Önceki gruptan bu yana gerçekleşen tüm etkinlikler kaydedilir ve bir kerede döndürülür. Bu, SoC'ye gönderilen kesinti sayısını azaltır ve sensör veri toplarken ve gruplandırırken SoC'nin daha düşük bir güç moduna geçmesine olanak tanır.

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

Sıfır olmayan maksimum raporlama gecikmesi ile sensör etkinliklerini raporlamayla ilgili ek bilgiler ve koşullar için Toplu raporlama başlıklı makaleyi inceleyin.

Sensörleri etkinleştirme

Çerçeve, activate() işlevini kullanarak sensörleri etkinleştirir ve devre dışı bırakır. Bir sensörü etkinleştirmeden önce çerçevenin, batch() kullanarak sensörü yapılandırması gerekir.

Bir sensör devre dışı bırakıldıktan sonra, söz konusu sensörden gelen ek sensör etkinlikleri etkinlik FMQ'sine yazılmamalıdır.

Boşluk sensörleri

Bir sensör, sensör verilerini toplu olarak toplayacak şekilde yapılandırılmışsa çerçeve, flush() çağrısı yaparak toplu sensör etkinliklerinin hemen temizlenmesini zorunlu kılabilir. Bu, belirtilen sensör işleyicisine ait toplu sensör etkinliklerinin hemen Etkinlik FMQ'ye yazılmasına neden olur. Sensörler HAL'i, flush() çağrısı sonucunda yazılan sensör etkinliklerinin sonuna bir temizleme tamamlandı etkinliği eklemelidir.

Boşaltma işlemi eşzamansız olarak gerçekleşir (yani bu işlev hemen döndürülmelidir). Uygulamada birkaç sensör için tek bir FIFO kullanılıyorsa bu FIFO temizlenir ve temizleme tamamlandı etkinliği yalnızca belirtilen sensör için eklenir.

Belirtilen sensörün FIFO'su yoksa (arabelleğe alma yapılamaz) veya FIFO çağrı sırasında boşsa flush() yine de başarılı olmalı ve söz konusu sensör için bir temizleme tamamlandı etkinliği göndermelidir. Bu, tek seferlik sensörler dışındaki tüm sensörler için geçerlidir.

Tek seferlik bir sensör için flush() çağrılırsa flush(), BAD_VALUE döndürmeli ve bir temizleme tamamlandı etkinliği oluşturmamalıdır.

Sensör etkinliklerini FMQ'ye yazma

Etkinlik FMQ'si, sensör etkinliklerini Android sensör çerçevesine göndermek için Sensörler HAL tarafından kullanılır.

Etkinlik FMQ'si senkronize bir FMQ'dir. Bu, FMQ'ye mevcut alandan daha fazla etkinlik yazma girişiminin başarısız yazmayla sonuçlandığı anlamına gelir. Bu durumda HAL, mevcut etkinlik grubunun iki küçük etkinlik grubu olarak mı yoksa yeterli alan olduğunda tüm etkinliklerin birlikte mi yazılacağını belirlemelidir.

Sensors HAL, Event FMQ'ye istenen sayıda sensör etkinliği yazdığında, Event FMQ'nin EventFlag::wake işlevine EventQueueFlagBits::READ_AND_PROCESS bitini yazarak çerçeveyi etkinliklerin hazır olduğu konusunda bilgilendirmelidir. EventFlag, EventFlag::createEventFlag ve Event FMQ'nın getEventFlagWord() işlevi kullanılarak Event FMQ'den oluşturulabilir.

Sensörler AIDL HAL, etkinlik FMQ'sinde hem write hem de writeBlocking'yi destekler. Varsayılan uygulama, write kullanımıyla ilgili bir referans sağlar. writeBlocking işlevi kullanılıyorsa readNotification işaretçisi EventQueueFlagBits::EVENTS_READ olarak ayarlanmalıdır. Bu işaretçi, etkinlik FMQ'sinden etkinlikleri okurken çerçeve tarafından ayarlanır. Yazma bildirimi işareti EventQueueFlagBits::READ_AND_PROCESS olarak ayarlanmalıdır. Bu, çerçeveye etkinliklerin Event FMQ'ye yazıldığını bildirir.

WAKE_UP etkinlikleri

WAKE_UP etkinlikleri, uygulama işlemcisinin (AP) uyandığı ve etkinliği hemen işlediği sensör etkinlikleridir. Etkinlik FMQ'sine bir WAKE_UP etkinliği yazıldığında, çerçeve etkinliği işleyene kadar sistemin uyanık kalmasını sağlamak için Sensörler HAL'inin bir uyanma kilidi sağlaması gerekir. Çerçeve, bir WAKE_UP etkinliği aldıktan sonra kendi uyanma kilidini güvence altına alarak Sensörler HAL'in uyanma kilidini bırakmasına olanak tanır. Sensörler HAL'ı uyanma kilidini bıraktığında senkronize etmek için Wake Lock FMQ'yi kullanın.

Sensörler HAL, çerçevenin işlediği WAKE_UPetkinlik sayısını belirlemek için Wake Lock FMQ'yi okumalıdır. HAL, yalnızca işlenmemiş WAKE_UP etkinliklerinin toplam sayısı sıfır olduğunda WAKE_UP etkinlikleri için uyanma kilidini açmalıdır. Çerçeve, sensör etkinliklerini işledikten sonra WAKE_UP etkinliği olarak işaretlenen etkinliklerin sayısını sayar ve bu sayıyı Wake Lock FMQ'ye geri yazar.

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

Dinamik sensörler

Dinamik sensörler, fiziksel olarak cihazın bir parçası olmayan ancak cihaza giriş olarak kullanılabilen sensörlerdir (ör. ivme ölçerli gamepad).

Dinamik bir sensör bağlandığında, ISensorsCallback içindeki onDynamicSensorConnected işlevi Sensors HAL'den çağrılmalıdır. Bu işlem, yeni dinamik sensörün çerçeveye bildirilmesini sağlar ve sensörün çerçeve üzerinden kontrol edilmesine ve sensörün etkinliklerinin müşteriler tarafından kullanılmasına olanak tanır.

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

Doğrudan kanal

Doğrudan kanal, sensör etkinliklerinin Android Sensör Çerçevesi'ni atlayarak etkinlik FMQ'sine yerine belirli bir belleğe yazıldığı bir çalışma yöntemidir. Doğrudan kanal kaydeden bir istemci, sensör etkinliklerini doğrudan doğrudan kanal oluşturmak için kullanılan bellekten okumalıdır ve sensör etkinliklerini çerçeve üzerinden almaz. 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 mevcut bir doğrudan kanalı kaldırır.

Çalışma modları

setOperationMode() işlevi, çerçevenin sensör verilerini sensöre enjekte edebilmesi için çerçevenin bir sensörü yapılandırmasına olanak tanır. Bu, özellikle çerçevenin altında bulunan algoritmalar için testler yaparken yararlıdır.

injectSensorData() işlevi, normalde operasyonel parametreleri Sensors HAL'e göndermek için kullanılır. Bu işlev, belirli bir sensöre sensör etkinlikleri eklemek için de kullanılabilir.

Doğrulama

Sensörler HAL'inizin uygulanmasını 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 bulunur.

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

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

Test edilen cihazın tüm CDD şartlarını karşılaması için CTS testlerini geçmesi çok önemlidir.

VTS testleri

Sensörler AIDL HAL'si için VTS testleri hardware/interfaces/sensors/aidl/vts/ adresinde bulunur. Bu testler, Sensörler HAL'inin düzgün şekilde uygulanmasını ve ISensors.aidl ile ISensorsCallback.aidl arasındaki tüm koşulların düzgün şekilde karşılanmasını sağlar.

HAL'i başlatma

Çerçeve ile HAL arasında FMQ'ler oluşturmak için initialize() işlevi desteklenmelidir.

Mevcut sensörleri gösterme

Sensors AIDL HAL'de getSensorsList() işlevi, tek bir cihazın başlatılması sırasında Sensors HAL'in yeniden başlatılması durumunda bile aynı değeri döndürmelidir. getSensorsList() işlevinin yeni bir şartı, tek bir cihazın başlatılması sırasında, hatta Sensörler HAL'i yeniden başlatılırken bile aynı değeri döndürmesidir. Bu sayede sistem sunucusu yeniden başlatılırsa çerçeve, sensör bağlantılarını yeniden kurmaya çalışabilir. getSensorsList() tarafından döndürülen değer, cihaz yeniden başlatıldıktan sonra değişebilir.

Sensör etkinliklerini FMQ'ye yazma

Sensors AIDL HAL'de, poll() çağrılmasını beklemek yerine Sensors HAL, sensör etkinlikleri mevcut olduğunda proaktif olarak sensör etkinliklerini Event FMQ'ye yazmalıdır. HAL, çerçeve içinde FMQ okumasına neden olmak için EventFlag adresine doğru bitleri yazmaktan da sorumludur.

WAKE_UP etkinlikleri

Sensors HAL 1.0'da HAL, poll()'a bir WAKE_UP yayınlandıktan sonra poll()'a yapılan sonraki tüm çağrılarda WAKE_UP etkinliği için uyanma kilidini bırakabiliyordu. Bunun nedeni, çerçevenin tüm sensör etkinliklerini işlediğini ve gerekirse uyanma kilidi aldığını belirtmesidir. Sensors AIDL HAL'de, çerçeve FMQ'ye yazılan etkinlikleri işlediğinde HAL artık bilgilendirilmediğinden Wake Lock FMQ, çerçeve WAKE_UP etkinliğini işlediğinde HAL ile iletişim kurmasına olanak tanır.

Sensors AIDL HAL'de, WAKE_UPetkinlikleri için Sensors HAL tarafından sağlanan uyanma 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ülmüştür. Sensors AIDL HAL, dinamik sensör bağlantıları değiştiğinde ISensorsCallback içindeki onDynamicSensorsConnected ve onDynamicSensorsDisconnected işlevlerinin çağrılmasını gerektirir. Bu geri çağırma işlevleri, initialize() işlevi aracılığıyla sağlanan ISensorsCallback işaretçisi kapsamında kullanılabilir.

Çalışma modları

WAKE_UP sensörleri için DATA_INJECTION modu desteklenmelidir.

Çoklu HAL desteği

Sensörler AIDL HAL, Sensörler Çoklu HAL çerçevesini kullanarak çoklu HAL'i destekler. Uygulama ayrıntıları için Sensors HAL 2.1'den taşıma başlıklı makaleyi inceleyin.