Sensörler HAL 2

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

Sensörler HAL 2.0 veya 2.1 uygulamak için, bir amacı genişletmelidir ISensors arayüzü ve tanımlanan tüm işlevleri yerine 2.0/ISensors.hal veya 2.1/ISensors.hal .

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.

Çoklu HAL desteği

Kullanarak Sensörler HAL 2.0 ve 2.1 destekler çoklu HAL Sensörler Çok HAL çerçeve . Uygulama ayrıntıları için bkz Sensörler HAL 1.0 den Porting .