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ş cihazlar için 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'sini uygulama
Sensors AIDL HAL'i uygulamak için bir nesnenin ISensors
arabirimi 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
Sensör HAL'sinin kullanılabilmesi için önce Android sensör çerçevesi tarafından başlatılması gerekir. Ç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, sensör etkinliklerini çerçeveye yazmak için kullanılan Event FMQ'yi oluşturmak üzere ilk tanımlayıcıyı kullanır. HAL, HAL WAKE_UP
sensö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, Sensors HAL ilk kullanıma hazırlanırken çağrılan ilk işlev olmalıdır.
Kullanılabilir sensörleri kullanıma aç
Cihazdaki kullanılabilir 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. Sensörler HAL'ini 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ör listesinin kararlılığı
Sensörler HAL'i 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ını sağlamak için HAL'in, cihazdaki belirli bir fiziksel sensörü tutamacıyla doğrusal bir şekilde eşlemesi gerekir. Sensörler HAL arayüzü tarafından belirli bir uygulama zorunlu kılınmasa da geliştiricilerin bu koşulu karşılamak için kullanabileceği çeşitli seçenekler vardır.
Örneğin, sensör listesi her bir sensörün sabit özelliklerinin (ör. tedarikçi, model ve sensör türü) 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'inize özgü 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ırın
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 süresi yok sayı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ğu anda 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ılandığı anda raporlanması gerekmez. Etkinlikler, maksimum raporlama gecikmesinden daha yüksek bir gecikme nedeniyle donanım FIFO'da geçici olarak depolanabilir ve gruplar halinde 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 verileri yakalayıp toplu hale getirirken SoC'nin daha düşük bir güç moduna geçmesine olanak tanır.
Her etkinlikle ilişkilendirilmiş bir zaman damgası vardır. Bir etkinliğin raporlandığı zamanı ertelemek, etkinlik zaman damgasını etkilememelidir. Zaman damgası doğru olmalı ve etkinliğin bildirildiği zamana değil, fiziksel olarak gerçekleştiği zamana karşılık gelmelidir.
Maksimum raporlama gecikmesiyle maksimum raporlama gecikmesiyle sensör etkinliklerini raporlama hakkında ek bilgiler ve gereksinimler için Toplulama bölümüne bakın.
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 öncelikle 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 tutamacına 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örde FIFO 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 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, senkronize edilmiş bir FMQ'dur. Diğer bir deyişle, FMQ'ya kullanılabilir alandan daha fazla etkinlik yazmaya çalışıldığında başarısız yazılabilir. 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.
Sensör HAL'si, Etkinlik FMQ'ya istenen sayıda sensör etkinliği yazdığında Sensör HAL'si, Etkinlik FMQ'nun EventFlag::wake
işlevine EventQueueFlagBits::READ_AND_PROCESS
bitini yazarak çerçeveye etkinliklerin hazır olduğunu bildirmelidir. EventFlag, EventFlag::createEventFlag
ve Etkinlik FMQ'nun getEventFlagWord()
işlevi kullanılarak Etkinlik FMQ'dan oluşturulabilir.
Sensors AIDL HAL, Event FMQ'de hem write
hem de writeBlocking
'yi destekler.
Varsayılan uygulama, write
kullanımıyla ilgili bir referans sağlar. writeBlocking
işlevi kullanılırsa readNotification
işareti EventQueueFlagBits::EVENTS_READ
olarak ayarlanmalıdır. Bu işaret, Etkinlik FMQ'dan 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.
Sensors HAL, çerçevenin işlediği WAKE_UP
etkinlik sayısını belirlemek için Wake Lock FMQ'yi okumalıdır. HAL, WAKE_UP
etkinlikleri için uyanık kalma kilidini yalnızca işlenmemiş WAKE_UP
etkinliklerinin toplam sayısı sıfırsa etkinleştirmelidir.
Ç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 yazar.
Çerçeve, Wake Lock FMQ'ya veri yazdığında Wake Lock FMQ'da 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, Sensör HAL'sinden çağrılmalıdır. Bu işlem, yeni dinamik sensörün çerçevesine bilgi verir, sensörün çerçeve üzerinden kontrol edilmesine ve sensör etkinliklerinin istemciler tarafından tüketilmesini sağlar.
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 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 şartların düzgün şekilde karşılanmasını sağlar.
HAL'yi başlatma
Çerçeve ile HAL arasında FMQ 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 oluşturmaya ç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
Sensörler HAL, AIDL HAL'deki poll()
işlevinin çağrılmasını beklemek yerine, sensör etkinlikleri mevcut olduğunda sensör etkinliklerini proaktif olarak Etkinlik FMQ'ya 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_UP
etkinlikleri 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şleviyle 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
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.