Sensörler Donanım Soyutlama Katmanı (HAL), Android sensör çerçevesi ile bir cihazın ivmeölçer veya jiroskop gibi 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 HAL 2.0, yeni ve yükseltilmiş cihazlar için Android 10 ve üzeri sürümlerde mevcuttur. Sensörler HAL 2.0 dayanmaktadır Sensörler HAL 1.0 fakat geriye doğru uyumlu olmak engellemek çok önemli farklılıklar vardır. Sensörler HAL 2.0 kullanır Hızlı Mesaj Kuyrukları (FMQs) Android sensör çerçevesine HAL'ye sensör olayları göndermek için.
Sensörler HAL 2.1, yeni ve yükseltilmiş cihazlar için Android 11 ve üzeri sürümlerde mevcuttur. Sensörler HAL 2.1 açığa Sensörler HAL 2.0 bir yineleme HINGE_ANGLE sensör tipini ve kabul için çeşitli yöntemler günceller
HINGE_ANGLE türü.
HAL 2.1 Arayüzü
Sensörler HAL 2.1 belgelerine ana kaynağı en HAL tanımı dahilinde donanım / arabirimleri / Sensörler / 2.1 / ISensors.hal . Bu sayfa ve aralarında gereksinimlerinin bir çakışma varsa
ISensors.hal , içinde şartlarından biri
ISensors.hal .
HAL 2.0 Arayüzü
Sensörler HAL 2.0 belgelerine ana kaynağı en HAL tanımı dahilinde donanım / arabirimleri / Sensörler / 2.0 / ISensors.hal . Bu sayfa ve aralarında gereksinimlerinin bir çakışma varsa
ISensors.hal , içinde şartlarından biri
ISensors.hal .
HAL 2.0 ve HAL 2.1 Sensörlerini Uygulama
HAL'ı Başlatma
Sensörler HAL, kullanılmadan önce Android sensör çerçevesi tarafından başlatılmalıdır. Çerçeve çağırır
initialize() HAL 2.0 fonksiyonu ve
initialize_2_1() bir iki FMQ tanımlayıcıları ve bir işaretçi: Sensörler HAL için üç parametre sağlamak üzere HAL 2.1 işlevini
ISensorsCallback nesne.
HAL, çerçeveye sensör olaylarını yazmak için kullanılan Olay FMQ'sunu oluşturmak için ilk tanımlayıcıyı kullanır. HAL Kilit FMQ HAL için uyandırma kilidi serbest bıraktığında eşitlemek için kullanılan Wake yaratmak için ikinci tanımlayıcısı kullanır
WAKE_UP sensörü olaylar. HAL için bir işaretçi kaydetmeniz gerekir
ISensorsCallback gerekli geri arama fonksiyonları olarak uygulanabileceğini böylece nesne.
initialize() ya da
initialize_2_1() işlev Sensörler HAL başlatırken adlandırılan ilk işlev olmalıdır.
Mevcut sensörleri açığa çıkarma
Cihazda bulunan statik sensörleri tümünün bir listesini almak için, kullanmak
getSensorsList() HAL 2.0 ve üzerinde işlevini
getSensorsList_2_1() HAL 2.1 işlev. Bu işlev, her biri tutamacıyla benzersiz olarak tanımlanan bir sensör listesi döndürür. Belirli bir sensörün tutamacı, Sensors HAL'ı barındıran işlem yeniden başlatıldığında değişmemelidir. Tutamaçlar, cihaz yeniden başlatmalarında ve sistem sunucusu yeniden başlatmalarında değişebilir.
Birkaç sensörler aynı sensör tipini ve uyandırma özelliğini paylaşırlarsa listedeki ilk sensör varsayılan sensörü denir ve kullanan uygulamalar iade edilir
getDefaultSensor(int sensorType, bool wakeUp) işlevi.
Sensör listesinin kararlılığı
Tarafından döndürülen veri eğer bir Sensörler HAL yeniden başlatıldıktan sonra
getSensorsList() veya
getSensorsList_2_1() yeniden başlatma önce alınan sensör listeye göre önemli bir değişiklik gösterir, çerçeve Android çalışma zamanında yeniden başlatılmasını tetikler. Sensör listesindeki önemli değişiklikler, belirli bir tutamağa sahip bir sensörün eksik olduğu veya niteliklerinin değiştiği veya yeni sensörlerin tanıtıldığı durumları içerir. 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 gereklidir. Bu, ç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 önerilir.
Kararlı sensör tutamaçlarını sağlamak için HAL, cihazdaki belirli bir fiziksel sensörü tutamacıyla deterministik olarak eşlemelidir. Sensors HAL arabirimi tarafından belirli bir uygulama zorunlu kılınmasa da, geliştiricilerin bu gereksinimi karşılamak için çeşitli seçenekleri vardır.
Örneğin, sensör listesi, satıcı, model ve sensör tipi gibi her sensörün sabit özelliklerinin bir kombinasyonu kullanılarak sıralanabilir. HAL beklenen tüm sensörler dönmeden önce başlatma tamamladıktan sonra bilmesi gerekir böylece bir başka seçenek, statik sensörlerin cihazın seti donanım sabit olmasına dayanır
getSensorsList() veya
getSensorsList_2_1() . 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ı tutamaç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 tanıtıcılarının HAL yeniden başlatmalarında değişmemesidir.
Sensörleri yapılandırma
Bir sensör etkinleştirildiğinde önce, sensör bir numune alma süresi ve maksimum kullanılarak gecikme raporlama ile yapılandırılmalıdır
batch() işlev.
Bir sensör kullanarak herhangi bir anda yeniden yapılandırılması gerekir
batch() sensör verilerinin kaybı olmadan.
Örnekleme periyodu
Örnekleme periyodu, yapılandırılmakta olan sensör tipine bağlı olarak farklı bir anlama sahiptir:
- Sürekli: Sensör olayları sürekli bir hızda oluşturulur.
- On-change: Olaylar, örnekleme periyodundan daha hızlı oluşturulmaz ve ölçülen değer değişmezse, örnekleme periyodundan daha yavaş bir hızda oluşturulabilir.
- Tek seferlik: Örnekleme periyodu göz ardı edilir.
- Özel: Daha fazla bilgi için bkz Sensör türleri .
Bir örnekleme dönemi ve sensör raporlama modları, bkz arasındaki etkileşim hakkında bilgi edinmek için Raporlama Modlar .
Maksimum raporlama gecikmesi
Maksimum raporlama gecikmesi, SoC uyanıkken HAL aracılığıyla Olay FMQ'suna yazılmadan önce olayların ertelenebileceği ve donanım FIFO'sunda saklanabileceği maksimum süreyi nanosaniye cinsinden ayarlar.
Sıfır değeri, FIFO'da sensörden bir olay mevcut olduğu anda FIFO'yu tamamen atlayarak veya FIFO'yu boşaltarak, olayların ölçüldüğü anda rapor edilmesi gerektiğini belirtir.
Örneğin, 50 Hz'de etkinleştirilen ve maksimum sıfır tetikleme gecikmesi olan 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ı gerekmez. Olaylar, hiçbir olay maksimum raporlama gecikmesinden daha fazla gecikmediği sürece, donanım FIFO'sunda geçici olarak saklanabilir ve gruplar halinde raporlanabilir. Bir önceki partiden itibaren tüm olaylar kaydedilir ve bir kerede iade edilir. Bu, SoC'ye gönderilen kesintilerin sayısını azaltır ve sensör verileri yakalarken ve gruplandırırken SoC'nin daha düşük bir güç moduna geçmesine izin verir.
Her olayın kendisiyle ilişkilendirilmiş bir zaman damgası vardır. Bir olayın raporlanma zamanını geciktirmek, olay zaman damgasını etkilememelidir. Zaman damgası doğru olmalı ve olayın bildirildiği zamana değil, fiziksel olarak meydana geldiği zamana karşılık gelmelidir.
Ek bilgi ve sıfırdan farklı maksimum raporlama gecikmeyle sensör olayları raporlama gereksinimleri için bkz batching .
Sensörleri etkinleştirme
Çerçeve sağlar ve kullanan devre dışı bırakır sensörleri
activate() işlev. Bir sensörünü devreye önce, çerçeve birinci sensör kullanarak yapılandırmanız gerekir
batch() .
Bir sensör devre dışı bırakıldıktan sonra, o sensörden gelen ek sensör olayları Olay FMQ'suna yazılmamalıdır.
Yıkama sensörleri
Bir sensör toplu sensör verilerine yapılandırılırsa, çerçeve çağrı göre yığın sensör olayların hemen flush zorlayabilir
flush() . Bu, belirtilen sensör tanıtıcısı için toplu sensör olaylarının hemen Olay FMQ'suna yazılmasına neden olur. Sensörler HAL bir çağrı sonucunda yazılır sensör olayları sonuna bir hizada komple olay eklemek gerekir
flush() .
Yıkama eşzamansız olarak gerçekleşir (yani, bu işlev hemen dönmelidir). Uygulama birkaç sensör için tek bir FIFO kullanıyorsa, bu FIFO temizlenir ve yıkama tamamlandı olayı yalnızca belirtilen sensör için eklenir.
Belirtilen sensör hiçbir FIFO'yu varsa (hayır mümkün tamponlama) veya FIFO çağrının anda boş olsaydı,
flush() yine de başarılı ve bu sensör için bir floş komple olayı göndermelidir. Bu, tek seferlik sensörler dışındaki tüm sensörler için geçerlidir.
Eğer
flush() bir atışlık sensörü çağrılır, daha sonra
flush() döndürmesi gerekir
BAD_VALUE ve floş tam olayı oluşturmaz.
Sensör olaylarını FMQ'ya yazma
Event FMQ, Sensör olaylarını Android sensör çerçevesine göndermek için Sensörler HAL tarafından kullanılır.
Olay FMQ'su senkronize bir FMQ'dur; bu, FMQ'ya mevcut alandan daha fazla olay yazmaya yönelik herhangi bir girişimin başarısız bir yazmayla sonuçlanmasına neden olduğu anlamına gelir. Böyle bir durumda, HAL, mevcut olay kümesini iki küçük olay grubu olarak mı yazacağına veya yeterli alan olduğunda tüm olayları birlikte mi yazacağına karar vermelidir.
Sensörler HAL Olay FMQ için sensör olayların istenen sayıda yazmıştır zaman Sensörler HAL olaylar yazarak hazır olduklarını çerçeveyi bildirmek zorundadır
EventQueueFlagBits::READ_AND_PROCESS Olay FMQ en etmek biraz
EventFlag::wake fonksiyonu. EventFlag kullanarak Olay FMQ oluşturulabilir
EventFlag::createEventFlag ve Etkinlik FMQ en
getEventFlagWord() fonksiyonu.
Sensörler HAL 2.0 / 2.1 destekler hem
write ve
writeBlocking Olay FMQ üzerinde. Varsayılan uygulama kullanmak için bir referans sağlar
write . Eğer
writeBlocking fonksiyonu kullanılır,
readNotification bayrağı ayarlanmış olmalıdır
EventQueueFlagBits::EVENTS_READ o Olay FMQ olayları okuduğunda çerçevesi tarafından ayarlanır. Yazma bildirim bayrağı ayarlanmış olmalıdır
EventQueueFlagBits::READ_AND_PROCESS olaylar Olay FMQ yazılır edildiğini çerçeveyi bildirir.
WAKE_UP etkinlikleri
WAKE_UP etkinlik uyan hemen olayı işlemek için uygulama işlemcisi (AP) neden olan sensör olaylardır. Bir zaman
WAKE_UP olay Olay FMQ yazılır, Sensörler HAL çerçeve olayını işleyebilir kadar sistem kalır uyanık olmasını sağlamak için bir uyandırma kilidi emniyete alınmalıdır. Bir aldıktan sonra
WAKE_UP olayı, çerçeve onun uyandırma kilidi açabilir Sensörler HAL izin kendi uyandırma kilidi sabitler. Sensörler HAL uyanma kilidini serbest bıraktığında senkronizasyon yapmak için Uyandırma Kilidi FMQ'yu kullanın.
Sensörler HAL sayısını belirlemek için Wake Kilit FMQ okumalı
WAKE_UP çerçevesi ele ettiğini olaylar. HAL sadece onun uyandırma kilidi açmak gerekir
WAKE_UP işlenmeyen toplam sayısı ise olayların
WAKE_UP olaylar sıfırdır. Sensör olaylarını ele sonra çerçeve olarak işaretlenmiş olaylar sayar
WAKE_UP olayları ve Wake Kilit FMQ için bu sayı geri yazar.
Çerçeve setleri
WakeLockQueueFlagBits::DATA_WRITTEN o Wake Kilit FMQ veri yazar her Wake Kilit FMQ yazma bildirim.
Dinamik sensörler
Dinamik sensörler, fiziksel olarak cihazın bir parçası olmayan ancak ivmeölçerli bir oyun kumandası gibi cihaza girdi olarak kullanılabilen sensörlerdir.
Dinamik sensör bağlandığında,
onDynamicSensorConnected fonksiyonu
ISensorsCallback Sensörler HAL çağrılabilir gerekir. Bu, yeni dinamik sensörün çerçevesini bilgilendirir ve sensörün çerçeve aracılığıyla kontrol edilmesini ve sensör olaylarının müşteriler tarafından tüketilmesini sağlar.
Dinamik bir sensör bağlantısı kesildiğinde Benzer şekilde,
onDynamicSensorDisconnected fonksiyonu
ISensorsCallback çerçeve artık mevcut değil herhangi sensörü kaldırmak böylece çağrılmalıdır.
Doğrudan kanal
Doğrudan kanal, sensör olaylarının Android Sensör Çerçevesini atlayarak Olay FMQ'su yerine belirli belleğe yazıldığı bir çalışma yöntemidir. Doğrudan bir kanalı kaydeden bir istemci, doğrudan kanalı oluşturmak için kullanılan bellekten sensör olaylarını doğrudan okumalıdır ve çerçeve aracılığıyla sensör olaylarını almaz.
configDirectReport() işlev benzer
batch() , normal çalışma için ve doğrudan rapor kanalı yapılandırır.
registerDirectChannel() ve
unregisterDirectChannel() fonksiyonları oluşturmak veya yeni bir doğrudan bir kanal yok.
Çalışma modları
setOperationMode() çerçeve sensör içine algılayıcı verilerini enjekte böylece çerçeve bir sensör yapılandırmak için fonksiyon sağlar. Bu, özellikle çerçevenin altında bulunan algoritmalar için test için kullanışlıdır.
injectSensorData() HAL 2.0 ve fonksiyonu
injectSensorsData_2_1() HAL 2.0 fonksiyonu normal Sensörler HAL içine operasyon parametrelerinin itmek için kullanılır. İşlev, sensör olaylarını belirli bir sensöre enjekte etmek için de kullanılabilir.
doğrulama
HAL Sensörleri 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 Verifier uygulamasında bulunur.
Otomatik testler bulunmaktadır cts / test / sensör / src / android / donanım / cts . Bu testler, sensörlerin etkinleştirilmesi, gruplama ve sensör olay oranları gibi sensörlerin standart işlevlerini doğrular.
CTS Doğrulayıcı testler bulunmaktadır cts / apps / CtsVerifier / src / tr / android / cts / doğrulayıcı / sensörler . Bu testler, test operatöründen manuel giriş gerektirir ve sensörlerin doğru değerleri rapor etmesini sağlar.
CTS testlerini geçmek, test edilen cihazın tüm CDD gereksinimlerini karşıladığından emin olmak için çok önemlidir.
VTS testleri
Sensörler HAL 2.0 VTS testleri bulunan donanım / arabirimleri / Sensörler / 2.0 / VTS . Sensörler HAL 2.1 için VTS testleri bulunmaktadır donanım / arayüzleri / sensörler / 2.1 / VTS . Bu testler Sensörler HAL düzgün olarak kurulduğunu ve içindeki tüm gereklilikleri sağlamak
ISensors.hal ve
ISensorsCallback.hal düzgün karşılanmaktadır.
2.0'dan Sensörler HAL 2.1'e Yükseltme
Sensörler HAL 2.1 için yükseltme 2.0 ila, HAL uygulanması içermelidir zaman
initialize_2_1() ,
getSensorsList_2_1() ve
injectSensorsData_2_1() birlikte HAL 2.1 türleriyle yöntemleri. Bu yöntemler, yukarıda HAL 2.0 için belirtilen gereksinimleri karşılamalıdır.
Alt sürüm HAL'lerin önceki HAL'lerden gelen tüm işlevleri desteklemesi gerektiğinden, 2.1 HAL'lerin 2.0 HAL olarak başlatılmasını desteklemesi gerekir. Her iki HAL sürümünü de desteklemenin karmaşıklığından kaçınmak için Multi-HAL 2.1 kullanılması şiddetle tavsiye edilir.
Kendi Sensörler 2.1 HAL nasıl uygulanacağı 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ükseltirken, HAL uygulamanızın aşağıdaki gereksinimleri karşıladığından emin olun.
HAL'ı Başlatma
initialize() işlevi, çerçeve ve HAL arasında FMQs kurmak için desteklenmelidir.
Mevcut sensörleri açığa çıkarma
Sensörler HAL 2.0,
getSensorsList() işlevi, daha Sensörler HAL yeniden boyunca, tek bir cihaz açılışı sırasında aynı değeri gerekir. Yeni bir gereklilik
getSensorsList() fonksiyonu bile Sensörler HAL yeniden karşısında tek cihaz açılışı sırasında aynı değeri döndürür gerektiğidir. Bu, sistem sunucusu yeniden başlatılırsa çerçevenin sensör bağlantılarını yeniden kurmaya çalışmasına izin verir. Tarafından döndürülen değeri
getSensorsList() cihaz gerçekleştirir bir yeniden başlatma sonra değişebilir.
Sensör olaylarını FMQ'ya yazma
Bunun yerine beklemekten
poll() Sensörler HAL 2.0, çağrılacak, Sensörler HAL Olay FMQ için proaktif yazma sensör olaylar sensör olaylar mevcuttur gereken her. HAL ayrıca doğru bit yazma sorumludur
EventFlag bir FMQ çerçevesinde okumak neden.
WAKE_UP etkinlikleri
Sensörler HAL 1.0 yılında HAL herhangi için uyandırma kilidi açabilir başardı
WAKE_UP yapılan sonraki çağrı üzerine olay
poll() bir sonraki
WAKE_UP gönderildiğine
poll() bu çerçeve tüm sensör olayları işlenen girdiğine işaret etmiş ve a elde çünkü gerekirse uyandırma kilidi. Çerçeve FMQ yazılı olayları işlediği zaman, Sensörler HAL 2.0, HAL artık biliyor ki, Uyandırma Kilit FMQ çerçeve, ele aldığı HAL iletişim kurmasına izin veren
WAKE_UP olayları.
Sensörler HAL 2.0'da için Sensörler HAL tarafından emniyete uyandırma kilit
WAKE_UP olayları ile başlamalıdır
SensorsHAL_WAKEUP .
Dinamik sensörler
Dinamik sensör kullanılarak getirildiler
poll() Sensörler HAL 1.0 işlevi. Sensörler HAL 2.0 gerektirir
onDynamicSensorsConnected ve
onDynamicSensorsDisconnected içinde
ISensorsCallback zaman dinamik sensör bağlantıları değişiklik çağrılabilir. Bu geri çağırma bir parçası olarak mevcuttur
ISensorsCallback aracılığıyla sağlanır işaretçi
initialize() işlev.
Çalışma modları
DATA_INJECTION için mod
WAKE_UP sensör Sensörler HAL 2.0 desteklenmelidir.