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 HAL 2.0, yeni ve yükseltilmiş cihazlar için Android 10 ve sonraki sürümlerde mevcuttur. Sensors HAL 2.0, Sensors HAL 1.0'a dayanır ancak geriye dönük uyumlu olmasını engelleyen bazı temel farklılıkları vardır. Sensors HAL 2.0, HAL'den Android sensör çerçevesine sensör etkinlikleri göndermek için Hızlı Mesaj Kuyrukları (FMQ'ler) kullanır.
Sensors HAL 2.1, yeni ve yükseltilmiş cihazlar için Android 11 ve sonraki sürümlerde kullanılabilir. Sensors HAL 2.1, HINGE_ANGLE sensör türünü gösteren ve çeşitli yöntemleri HINGE_ANGLE
türünü kabul edecek şekilde güncelleyen Sensors HAL 2.0'ın bir iterasyonudur.
HAL 2.1 arayüzü
Sensör HAL 2.1 için ana belge kaynağı, donanım/interfaces/sensors/2.1/ISensors.hal adresindeki HAL tanımı içindedir.
Bu sayfa ile ISensors.hal
arasında şart uyuşmazlığı varsa ISensors.hal
'teki şartı kullanın.
HAL 2.0 arayüzü
Sensors HAL 2.0 için ana doküman kaynağı, hardware/interfaces/sensors/2.0/ISensors.hal adresindeki HAL tanımındadır.
Bu sayfa ile ISensors.hal
arasında şart uyuşmazlığı varsa ISensors.hal
'teki şartı kullanın.
Sensör HAL 2.0 ve HAL 2.1'i uygulama
Sensors HAL 2.0 veya 2.1'i uygulamak için bir nesnenin ISensors
arabirimi genişletmesi ve 2.0/ISensors.hal
veya 2.1/ISensors.hal
'te tanımlanan tüm işlevleri uygulaması gerekir.
HAL'yi başlatma
Sensors HAL, kullanılabilmesi için Android sensör çerçevesi tarafından başlatılmalıdır. Çerçeve, HAL 2.0 için initialize()
işlevini ve HAL 2.1 için initialize_2_1()
işlevini çağırarak Sensörler HAL'ine üç parametre sağlar: 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, WAKE_UP
sensör etkinlikleri için HAL tarafından uyanık kalma kilidini serbest bıraktığında senkronizasyon amacıyla kullanılan Uyandırma Kilidi FMQ'sunu 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.
Sensör HAL'sini başlatırken çağrılan ilk işlev initialize()
veya initialize_2_1()
işlevi olmalıdır.
Mevcut sensörleri gösterme
Cihazdaki kullanılabilir tüm statik sensörlerin listesini almak için HAL 2.0'da getSensorsList()
işlevini, HAL 2.1'de getSensorsList_2_1()
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ör HAL'sini barındıran işlem yeniden başlatıldığında belirli bir sensörün tutma yeri 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ığı
Sensors HAL yeniden başlatıldıktan sonra getSensorsList()
veya getSensorsList_2_1()
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ştiriciler bu koşulu karşılamak için bir dizi seçeneğe sahiptir.
Ö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()
veya getSensorsList_2_1()
'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ı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 süresi, yapılandırılan sensör türüne göre farklı anlamlara gelir:
- 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 etkinliklerin HAL üzerinden HAL aracılığıyla FMQ'ya yazılmadan önce gecikip donanım FIFO'da 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 gecikmesinin sıfır tetikleyiciyle 50 Hz'de etkinleştirildiği bir ivme ölçer, çip üzerinde sistem (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. 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 veri toplarken 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.
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'si senkronize bir FMQ'dir. Diğer bir deyişle, FMQ'ye mevcut alandan daha fazla etkinlik yazma girişimi başarısız olur. 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örler HAL'i, istenen sayıda sensör etkinliğini Etkinlik FMQ'ye yazdığında, Etkinlik 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.
Sensors HAL 2.0/2.1, 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ı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, etkinliklerin Etkinlik FMQ'ya yazıldığı çerçeveyi bildiren EventQueueFlagBits::READ_AND_PROCESS
olarak ayarlanmalıdır.
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, 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 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 Sensörler 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, Android Sensör Çerçevesi'ni atlayarak Etkinlik FMQ yerine sensör etkinliklerinin 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öre sensör verileri yerleştirebilmesi için çerçevenin sensörü yapılandırmasına olanak tanır. Bu, test sırasında, özellikle de çerçevenin altında yer alan algoritmalar için yararlıdır.
HAL 2.0'daki injectSensorData()
işlevi ve HAL 2.0'daki injectSensorsData_2_1()
işlevi, normalde operasyonel parametreleri Sensörler HAL'ine 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, toplu işleme ve sensör etkinlik hızları gibi standart sensör 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.
CTS testlerini geçmek, test edilen cihazın tüm CDD gereksinimlerini karşıladığından emin olmak açısından kritik öneme sahiptir.
VTS testleri
Sensors HAL 2.0 için VTS testleri hardware/interfaces/sensors/2.0/vts adresinde bulunur.
Sensörler HAL 2.1 için VTS testleri hardware/interfaces/sensors/2.1/vts adresinde bulunur.
Bu testler, Sensörler HAL'inin düzgün şekilde uygulanmasını ve ISensors.hal
ile ISensorsCallback.hal
arasındaki tüm şartların düzgün şekilde karşılanmasını sağlar.
2.0'dan Sensors HAL 2.1'e yükseltme
2.0'dan Sensör HAL 2.1'e yükseltme yaparken HAL uygulamanız, HAL 2.1 türleriyle birlikte initialize_2_1()
, getSensorsList_2_1()
ve injectSensorsData_2_1()
yöntemlerini içermelidir. Bu yöntemler, yukarıda HAL 2.0 için belirtilen koşulları karşılamalıdır.
Küçük sürüm HAL'leri önceki HAL'lerdeki tüm işlevleri desteklemesi gerektiğinden, 2.1 HAL'leri 2.0 HAL'leri olarak başlatılmayı desteklemelidir. Her iki HAL sürümünü de desteklemenin karmaşıklığını önlemek için Multi-HAL 2.1'i kullanmanız önemle tavsiye edilir.
Kendi Sensors 2.1 HAL'nizi nasıl uygulayacağınızla ilgili örnek için Sensors.h adresini ziyaret edin.
1.0'dan Sensors HAL 2.0'a yükseltme
Sensörler HAL 2.0 sürümüne 1.0'dan yükseltme yaparken HAL uygulamanızın aşağıdaki şartları karşıladığından emin olun.
HAL'yi başlatma
Çerçeve ile HAL arasında FMQ'ler oluşturmak için initialize()
işlevi desteklenmelidir.
Kullanılabilir sensörleri kullanıma aç
Sensors HAL 2.0'da getSensorsList()
işlevi, tek bir cihazın başlatılması sırasında Sensors HAL'ın 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
Sensors HAL 2.0'da Sensors HAL, poll()
çağrılmasını beklemek yerine, 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 HAL 2.0'da HAL artık çerçevenin FMQ'ye yazılan etkinlikleri ne zaman işlediğini bilmediği için Wake Lock FMQ, çerçevenin WAKE_UP
etkinliğini işlediğinde HAL ile iletişim kurmasına olanak tanır.
Sensors HAL 2.0'da, 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, Sensör HAL 1.0'daki poll()
işlevi kullanılarak döndürüldü.
Sensors HAL 2.0, 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ör için DATA_INJECTION
modu, Sensör HAL 2.0'da desteklenmelidir.
Çoklu HAL desteği
Sensors HAL 2.0 ve 2.1, Sensors Multi-HAL çerçevesini kullanarak çoklu HAL'i destekler. Uygulama ayrıntıları için Sensors HAL 1.0'dan taşıma başlıklı makaleyi inceleyin.