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.
Sensors HAL 2.0, yeni ve yükseltilmiş cihazlar için Android 10 ve üzeri sürümlerde mevcuttur. Sensors HAL 2.0, Sensors HAL 1.0'ı temel alır ancak geriye dönük olarak uyumlu olmasını engelleyen birkaç önemli farklılığa sahiptir. Sensörler HAL 2.0, sensör olaylarını HAL'den Android sensör çerçevesine göndermek için Hızlı Mesaj Kuyruklarını (FMQ'lar) kullanır.
Sensors HAL 2.1, yeni ve yükseltilmiş cihazlar için Android 11 ve üzeri sürümlerde mevcuttur. Sensors HAL 2.1, HINGE_ANGLE sensör tipini ortaya çıkaran ve HINGE_ANGLE
tipini kabul etmek için çeşitli yöntemleri güncelleyen Sensors HAL 2.0'ın yinelemesidir.
HAL 2.1 arayüzü
HAL 2.1 Sensörlerine ilişkin ana belge kaynağı , hardware/interfaces/sensors/2.1/ISensors.hal adresindeki HAL tanımı dahilindedir. Bu sayfa ile ISensors.hal
arasında bir gereksinim çatışması varsa, ISensors.hal
içindeki gereksinimi kullanın.
HAL 2.0 arayüzü
Sensors HAL 2.0'a ilişkin ana belge kaynağı , hardware/interfaces/sensors/2.0/ISensors.hal adresindeki HAL tanımı dahilindedir. Bu sayfa ile ISensors.hal
arasında bir gereksinim çatışması varsa, ISensors.hal
içindeki gereksinimi kullanın.
HAL 2.0 ve HAL 2.1 Sensörlerini Uygulama
Sensors HAL 2.0 veya 2.1'i uygulamak için bir nesnenin ISensors
arayüzünü genişletmesi ve 2.0/ISensors.hal
veya 2.1/ISensors.hal
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 üzere HAL 2.0 için initialize()
işlevini ve HAL 2.1 için initialize_2_1()
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()
veya initialize_2_1()
işlevi, Sensörler HAL'yi başlatı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 HAL 2.0'da getSensorsList()
işlevini ve HAL 2.1'de getSensorsList_2_1()
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()
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 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ş olduğu gerçeğine dayanır; bu nedenle HAL'nin getSensorsList()
veya getSensorsList_2_1()
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.
HAL 2.0/2.1 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.
HAL 2.0'daki injectSensorData()
işlevi ve HAL 2.0'daki injectSensorsData_2_1()
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
HAL 2.0 Sensörleri için VTS testleri hardware/interfaces/sensors/2.0/vts konumunda bulunur. HAL 2.1 Sensörleri için VTS testleri hardware/interfaces/sensors/2.1/vts konumunda bulunur. Bu testler, Sensors HAL'nin doğru şekilde uygulandığından ve ISensors.hal
ve ISensorsCallback.hal
içindeki tüm gereksinimlerin doğru şekilde karşılandığından emin olur.
2.0'dan HAL 2.1 Sensörlerine Yükseltme
2.0'dan Sensors 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 gereksinimlerin aynısını karşılamalıdır.
İkincil sürüm HAL'lerin önceki HAL'lerdeki tüm işlevleri desteklemesi gerektiğinden, 2,1 HAL'lerin 2,0 HAL olarak başlatılmayı desteklemesi gerekir. Her iki HAL sürümünü desteklemenin karmaşıklığını önlemek için Multi-HAL 2.1'in kullanılması önemle tavsiye edilir.
Kendi Sensors 2.1 HAL'inizi nasıl uygulayacağınıza ilişkin bir örnek için bkz . Sensors.h .
1.0'dan Sensörler HAL 2.0'a yükseltme
1.0'dan Sensors HAL 2.0'a yükseltme yaparken HAL uygulamanızın aşağıdaki gereksinimleri karşıladığından emin olun.
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 HAL 2.0'da getSensorsList()
işlevi, Sensors HAL yeniden başlatıldığında 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ör HAL 2.0'da poll()
öğesinin çağrılmasını beklemek yerine, Sensör HAL'lerinin, sensör olayları mevcut olduğunda proaktif olarak sensör olaylarını Olay FMQ'suna yazması gerekir. 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ü Sensors HAL 2.0'da HAL, çerçevenin FMQ'ya yazılan olayları ne zaman işlediğini artık bilemez; Wake Lock FMQ, çerçevenin WAKE_UP
olaylarını işlediğinde HAL ile iletişim kurmasına olanak tanır.
Sensors HAL 2.0'da, 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ü. Sensors HAL 2.0, 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, Sensörler HAL 2.0'da desteklenmelidir.
Çoklu HAL desteği
Sensors HAL 2.0 ve 2.1 , Sensors Multi-HAL çerçevesini kullanan çoklu HAL'i destekler. Uygulama ayrıntıları için bkz. HAL 1.0 Sensörlerinden Taşıma .