Sensörler HAL 1.0

Beyan Sensörler HAL arayüzü, sensors.h , Android arasındaki arayüzü temsil çerçeve ve donanıma özgü yazılım. Bir HAL uygulaması, sensörler.h'de belirtilen her bir işlevi tanımlamalıdır. Ana işlevler şunlardır:

  • get_sensors_list - Tüm sensörlerin listesini döndürür.
  • activate - Bir sensörü başlatır veya durdurur.
  • batch - Örnekleme frekansı ve maksimum raporlama gecikmesi gibi bir sensörün parametrelerini ayarlar.
  • setDelay - Yalnızca HAL sürüm 1.0'da kullanılır. Belirli bir sensör için örnekleme frekansını ayarlar.
  • flush - Belirtilen sensörün FIFO'sunu yıkar ve bu yapıldığında bir yıkama tamamlandı olayını bildirir.
  • poll - Mevcut sensör olaylarını döndürür.

Gerçekleştirme iş parçacığı güvenli olmalı ve bu işlevlerin farklı evrelerden çağrılmasına izin vermelidir.

Arayüz ayrıca bu işlevler tarafından kullanılan çeşitli türleri tanımlar. Ana türler:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Aşağıdaki bölümlere ek olarak, bu türler hakkında daha fazla bilgi için sensörler.h'ye bakın.

get_sensors_list (liste)

int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t
  const** list);

HAL tarafından uygulanan sensörlerin listesini sağlar. Sensörlerin nasıl tanımlandığına ilişkin ayrıntılar için sensor_t'ye bakın.

Sensörlerin listede görünme sırası, sensörlerin uygulamalara rapor edileceği sıradır. Genellikle önce temel sensörler, ardından kompozit sensörler görünür.

Birkaç sensör aynı sensör tipini ve uyandırma özelliğini paylaşıyorsa, listedeki ilk sensör "varsayılan" sensör olarak adlandırılır. getDefaultSensor(int sensorType, bool wakeUp) tarafından döndürülendir.

Bu işlev, listedeki sensörlerin sayısını döndürür.

etkinleştir (sensör, doğru / yanlış)

int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int
  enabled);

Bir sensörü etkinleştirir veya devre dışı bırakır.

sensor_handle , sensörün etkinleştirilmesi / devre dışı bırakılması için tutamaktır. Bir sensörün tutacağı, sensor_t yapısının handle alanı tarafından tanımlanır.

enabled , sensörü etkinleştirmek için 1 veya devre dışı bırakmak için 0 olarak ayarlanır.

Tek vuruşlu sensörler, bir olay aldıktan sonra kendilerini otomatik olarak devre dışı bırakır ve activate(..., enabled=0) için bir çağrı yoluyla devre dışı bırakılmayı kabul etmeleri gerekir activate(..., enabled=0) .

Uyandırılmayan sensörler, SoC'nin askıya alma moduna geçmesini asla engellemez; yani, HAL, uygulamalar adına kısmi bir uyandırma kilidine sahip olmayacaktır.

Uyanma sensörleri, olayları sürekli olarak iletirken, SoC'nin askıya alma moduna geçmesini önleyebilir, ancak herhangi bir olayın iletilmesi gerekmiyorsa, kısmi uyandırma kilidinin serbest bırakılması gerekir.

enabled 1 ise ve sensör zaten etkinleştirilmişse, bu işlev işlemsizdir ve başarılı olur.

enabled 0 ise ve sensör zaten devre dışı bırakılmışsa, bu işlev işlemsizdir ve başarılı olur.

Bu işlev başarı durumunda 0, aksi takdirde negatif hata numarası döndürür.

parti (sensör, bayraklar, örnekleme süresi, maksimum rapor gecikmesi)

int (*batch)(
     struct sensors_poll_device_1* dev,
     int sensor_handle,
     int flags,
     int64_t sampling_period_ns,
     int64_t max_report_latency_ns);

Örnekleme frekansı ve maksimum rapor gecikmesi dahil olmak üzere bir sensörün parametrelerini ayarlar. Bu işlev sensör etkinleştirildiğinde çağrılabilir, bu durumda herhangi bir sensör ölçümünün kaybolmasına neden olmamalıdır: Bir örnekleme hızından diğerine geçiş, kayıp olaylara neden olamaz veya yüksek bir maksimum rapor gecikmesinden düşük bir değere geçiş yapamaz. maksimum rapor gecikmesi.

sensor_handle , konfigüre edilecek sensörün tutma sensor_handle .

flags şu anda kullanılmıyor.

sampling_period_ns , sensörün nanosaniye cinsinden çalışması gereken örnekleme periyodudur. Daha fazla ayrıntı için örnekleme_dönemine bakın.

max_report_latency_ns , olayların max_report_latency_ns cinsinden HAL aracılığıyla rapor edilmeden önce geciktirilebileceği maksimum süredir. Daha fazla ayrıntı için max_report_latency_ns paragrafına bakın.

Bu işlev başarı durumunda 0, aksi takdirde negatif hata numarası döndürür.

setDelay (sensör, örnekleme süresi)

int (*setDelay)(
     struct sensors_poll_device_t *dev,
     int sensor_handle,
     int64_t sampling_period_ns);

HAL sürüm 1.0'dan sonra, bu işlev kullanımdan kaldırılmıştır ve hiçbir zaman çağrılmaz. Bunun yerine, sampling_period_ns parametresini ayarlamak için batch işlevi çağrılır.

HAL sürüm 1.0'da, örnekleme_dönemi_ns'yi ayarlamak için batch yerine setDelay kullanıldı.

flush (sensör)

int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);

Belirtilen sensör için donanım FIFO'sunun sonuna bir yıkama tamamlanma olayı ekleyin ve FIFO'yu temizler; bu olaylar her zamanki gibi gönderilir (yani: maksimum raporlama gecikmesi sona ermiş gibi) ve FIFO'dan kaldırılır.

Yıkama eşzamansız olarak gerçekleşir (yani: bu işlevin hemen dönmesi gerekir). Uygulama birkaç sensör için tek bir FIFO kullanıyorsa, bu FIFO yıkanır ve yıkama tamamlandı olayı yalnızca belirtilen sensör için eklenir.

Belirtilen sensörde FIFO yoksa (arabelleğe alma mümkün değil) veya FIFO arama sırasında boşsa, flush yine de başarılı olmalı ve bu sensör için bir yıkama tamamlandı olayı göndermelidir. Bu, tek adımlı sensörler dışındaki tüm sensörler için geçerlidir.

flush çağrıldığında, o sensör için zaten FIFO'da bir fışkırtma olayı olsa bile, FIFO'nun sonuna ek bir olay oluşturulmalı ve eklenmeli ve FIFO yıkanmalıdır. flush çağrılarının sayısı, oluşturulan temizleme tamamlama olaylarının sayısına eşit olmalıdır.

flush tek adımlı sensörler için geçerli değildir; Eğer sensor_handle tek seferlik bir algılayıcıyı ifade eder, flush döndürmelidir -EINVAL ve herhangi bir çalkalama tam meta olayı oluşturmaz.

Bu işlev, başarı durumunda 0, belirtilen sensör tek adımlı bir -EINVAL veya etkinleştirilmemişse -EINVAL, aksi takdirde negatif bir hata numarası döndürür.

anket()

int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int
  count);

data bağımsız değişkenini doldurarak bir sensör verisi dizisi döndürür. Olaylar mevcut olana kadar bu işlev engellenmelidir. Başarı durumunda okunan olay sayısını veya bir hata durumunda negatif bir hata numarasını döndürecektir.

data içinde döndürülen olayların count , count bağımsız değişkeninden daha az veya ona eşit olmalıdır. Bu işlev asla 0 döndürmez (olay yok).

Çağrı dizisi

Cihaz önyüklendiğinde get_sensors_list çağrılır.

Bir sensör etkinleştirildiğinde, batch işlevi istenen parametrelerle çağrılır ve ardından activate(..., enable=1) .

HAL sürümünde 1_0 yılında, sipariş tersiydi Not olun: activate ve ardından ilk olarak adlandırıldı set_delay .

Bir sensör etkinleştirilirken istenen karakteristikler değiştiğinde, batch fonksiyonu çağrılır.

flush (ki bu durumda geri dönmelidir da aktif olmayan sensörler, herhangi bir zamanda çağrılabilir -EINVAL )

Bir sensör devre dışı bırakıldığında, activate(..., enable=0) çağrılacaktır.

Bu çağrılara paralel olarak, poll işlevi veri istemek için tekrar tekrar çağrılacaktır. poll , hiçbir sensör etkinleştirilmediğinde bile çağrılabilir.

sensörler_module_t

sensörler_module_t, sensörler için Android donanım modülünü oluşturmak için kullanılan sensors_module_t . HAL uygulaması, get_sensors_list işlevini ortaya çıkarmak için bu türden bir HAL_MODULE_INFO_SYM nesnesini tanımlamalıdır. Tanımını görüntüle sensors_module_t içinde sensors.h ve tanımı hw_module_t fazla bilgi için.

sensörler_poll_device_t / sensörler_poll_device_1_t

sensors_poll_device_1_t yukarıda tanımlanan yöntemlerin geri kalanını içerir: activate , batch , flush ve poll . common alanı ( hw_device_t türü) HAL'ın sürüm numarasını tanımlar.

sensor_t

sensor_t bir Android sensörünü temsil eder. İşte önemli alanlarından bazıları:

ad: Sensörü temsil eden, kullanıcı tarafından görülebilen bir dize. Bu dizi genellikle temel sensörün parça adını, sensörün türünü ve bir uyandırma sensörü olup olmadığını içerir. Örneğin, "LIS2HH12 İvmeölçer", "MAX21000 Kalibre Edilmemiş Jiroskop", "BMP280 Uyandırma Barometresi", "MPU6515 Oyun Döndürme Vektörü"

handle: Sensör kaydedilirken veya ondan olay oluşturulurken sensöre atıfta bulunmak için kullanılan tamsayı.

type: Sensörün türü. Android sensörleri nedir? Bölümündeki sensör türü açıklamasına bakın. Daha fazla ayrıntı için, bkz ve Sensör türleri resmi sensör tipleri için. Resmi olmayan sensör türleri için, type SENSOR_TYPE_DEVICE_PRIVATE_BASE ile SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: Bir dizge olarak sensörün türü. Sensör resmi bir türe sahip olduğunda, SENSOR_STRING_TYPE_* ayarlayın. Sensörün üreticiye özgü bir türü olduğunda, stringType , üreticinin ters etki alanı adıyla başlamalıdır. Örneğin, Fictional-Company'deki Cool-ürün ekibi tarafından tanımlanan bir sensör (örneğin bir tek boynuzlu at detektörü) stringType=”com.fictional_company.cool_product.unicorn_detector” . stringType , resmi olmayan sensör türlerini benzersiz şekilde tanımlamak için kullanılır. Türler ve dizi türleri hakkında daha fazla bilgi için sensörler.h'ye bakın.

requiredPermission: Uygulamaların sensörü görmek, ona kaydolmak ve verilerini almak için sahip olması gereken izni temsil eden bir dize. Boş bir dizi, uygulamaların bu sensöre erişmek için herhangi bir izin gerektirmediği anlamına gelir. Kalp atış hızı monitörü gibi bazı sensör türlerinde zorunlu bir requiredPermission İzin vardır. Hassas kullanıcı bilgileri (kalp atış hızı gibi) sağlayan tüm sensörler bir izinle korunmalıdır.

bayraklar: Sensörün raporlama modunu ve sensörün bir uyandırma sensörü olup olmadığını tanımlayan bu sensör için bayraklar . Örneğin, tek atımlık bir uyandırma sensörünün flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP olacaktır flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Mevcut HAL sürümünde kullanılmayan bayrağın bitleri 0'a eşit bırakılmalıdır.

maxRange: Sensörün bildirilen değerlerle aynı birimde rapor edebileceği maksimum değer. Sensör, [-maxRange; maxRange] . Bunun, genel anlamda sensörün toplam aralığının 2*maxRange olduğu anlamına geldiğini 2*maxRange . Sensör birkaç eksende değerler bildirdiğinde, aralık her eksene uygulanır. Örneğin, "+/- 2g" ivmeölçer maxRange = 2*9.81 = 2g raporlayacaktır.

çözünürlük: Sensörün ölçebileceği en küçük değer farkı. Genellikle maxRange ve bit sayısına göre hesaplanır.

güç: Sensörün miliAmps cinsinden etkinleştirilmesinin güç maliyeti. Bu neredeyse her zaman temel sensörün veri sayfasında bildirilen güç tüketiminden daha fazladır. Daha fazla ayrıntı için Temel sensörler! = Fiziksel sensörler bölümüne ve bir sensörün güç tüketiminin nasıl ölçüleceğine ilişkin ayrıntılar için Güç ölçüm sürecine bakın. Sensörün güç tüketimi, aygıtın hareket edip etmediğine bağlıysa, hareket halindeyken güç tüketimi, power alanında rapor edilen miktardır.

minDelay: Sürekli sensörler için, sensörün desteklediği en hızlı hıza karşılık gelen, mikrosaniye cinsinden örnekleme süresi. Bu değerin nasıl kullanıldığına ilişkin ayrıntılar için örnekleme_dönemine bakın. minDelay mikrosaniye cinsinden ifade edildiğine, sampling_period_ns ise nanosaniye cinsinden ifade edildiğine dikkat edin. Değiştirildiğinde ve özel raporlama modu sensörleri için, aksi belirtilmedikçe minDelay 0 olmalıdır. Tek adımlı sensörler için -1 olmalıdır.

maxDelay: Sürekli ve değişimli sensörler için, sensörün desteklediği en yavaş hıza karşılık gelen mikrosaniye cinsinden örnekleme süresi. Bu değerin nasıl kullanıldığına ilişkin ayrıntılar için örnekleme_dönemine bakın. maxDelay mikrosaniye cinsinden ifade edilirken, sampling_period_ns nanosaniye cinsinden ifade edildiğine dikkat edin. Özel ve tek adımlı sensörler için maxDelay 0 olmalıdır.

fifoReservedEventCount: FIFO donanımında bu sensör için ayrılan olay sayısı. Bu sensör için özel bir FIFO varsa, fifoReservedEventCount bu özel fifoReservedEventCount boyutudur. FIFO diğer sensörlerle paylaşılıyorsa, fifoReservedEventCount , fifoReservedEventCount o sensör için ayrılan kısmının boyutudur. Çoğu paylaşılan FIFO sisteminde ve donanım FIFO'su olmayan sistemlerde bu değer 0'dır.

fifoMaxEventCount: Bu sensör için FIFO'larda saklanabilecek maksimum olay sayısı. Bu her zaman fifoReservedEventCount eşit veya daha fifoReservedEventCount . Bu değer, sensöre belirli bir hızda kayıt yapılırken FIFO'nun ne kadar çabuk dolacağını tahmin etmek için kullanılır, başka sensörlerin etkinleştirilmediğini varsayarsak. Bir donanım FIFO yok sistemlerde, fifoMaxEventCount 0. Bkz olan Harmanlama fazla ayrıntı için.

Resmi sensör tipine sahip sensörler için çerçeve tarafından bazı alanların üzerine yazılır. Örneğin, ivmeölçer sensörleri sürekli bir raporlama moduna zorlanır ve kalp atış hızı monitörleri SENSOR_PERMISSION_BODY_SENSORS izni ile korunmaya zorlanır.

sensörler_event_t

Android sensörler tarafından oluşturulan ve anket işlevi aracılığıyla bildirilen sensör olayları, sensörler_event_t type sensors_event_t . sensors_event_t bazı önemli alanları sensors_event_t :

sürüm: sizeof(struct sensors_event_t)

sensor: sensor_t.handle tanımlandığı şekliyle olayı oluşturan sensörün sensor_t.handle .

type: sensor_t.type tanımlandığı şekliyle, olayı oluşturan sensörün sensör türü.

zaman damgası: Etkinliğin nanosaniye cinsinden zaman damgası. Bu, olayın gerçekleştiği zamandır (bir adım atılmıştır veya ivmeölçer ölçümü yapılmıştır), olayın rapor edildiği zaman değildir. timestamp , geçen elapsedRealtimeNano saati ile senkronize edilmelidir ve sürekli sensörler söz konusu olduğunda seğirme küçük olmalıdır. Zaman Damgası filtreleme damgaları ayarlamak için zaman çok yüksek titremeleri neden kesme sadece SoC'u kullanarak ve gelen de-senkronizasyon neden olabilir damgaları ayarlamak için sadece sensör çipi zamanı kullanma gibi CDD gereksinimleri karşılamak için bazen gereklidir elapsedRealtimeNano olarak, saat sensör saati kayıyor.

veriler ve örtüşen alanlar: Sensör tarafından ölçülen değerler. Bu alanların anlamı ve birimleri her sensör türüne özeldir. Veri alanlarının açıklaması için sensörler.h ve farklı Sensör türlerinin tanımına bakın. Bazı sensörler için, okumaların doğruluğu da bir status alanı aracılığıyla verilerin bir parçası olarak rapor edilir. Bu alan, yalnızca SDK katmanında bir doğruluk değeri olarak görünen belirli sensör türleri için aktarılır. Bu sensörler için, durum alanının ayarlanması gerektiği gerçeği sensör tipi tanımlarında belirtilmiştir.

Meta veri temizleme tamamlandı olayları

Meta veri olayları, normal sensör olayları ile aynı türe sahiptir: sensors_event_meta_data_t = sensors_event_t . Anket yoluyla diğer sensör olayları ile birlikte döndürülürler. Aşağıdaki alanlara sahiptirler:

sürüm: META_DATA_VERSION

tür: SENSOR_TYPE_META_DATA

sensör, ayrılmış ve zaman damgası : 0 olmalıdır

meta_data.what: Bu olay için meta veri türünü içerir. Şu anda tek bir geçerli meta veri türü var: META_DATA_FLUSH_COMPLETE .

META_DATA_FLUSH_COMPLETE olayları, bir sensör FIFO'sunun yıkamasının tamamlanmasını temsil eder. meta_data.what=META_DATA_FLUSH_COMPLETE , meta_data.what=META_DATA_FLUSH_COMPLETE , meta_data.sensor sensörün tutamacına ayarlanmalıdır. Sadece ve sadece bir sensörde flush çağrıldığında oluşturulurlar. Daha fazla bilgi için yıkama işlevi bölümüne bakın.