Sensörler HAL 1.0

Sensors.h dosyasında bildirilen Sensors HAL arayüzü, Android çerçevesi ile donanıma özel yazılım arasındaki arayüzü temsil eder. Bir HAL uygulamasının, sensörler.h'de bildirilen her işlevi tanımlaması gerekir. 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 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 temizler ve bu yapıldığında bir temizleme tamamlandı olayı bildirir.
  • poll - Mevcut sensör olaylarını döndürür.

Uygulama iş parçacığı açısından güvenli olmalı ve bu işlevlerin farklı iş parçacıklarından çağrılmasına izin vermelidir.

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

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Bu türler hakkında daha fazla bilgi için aşağıdaki bölümlere ek olarak, 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ığıyla ilgili ayrıntılar için sensör_t'ye bakın.

Sensörlerin listede görünme sırası, sensörlerin uygulamalara bildirilme sırasıdır. Genellikle ilk önce temel sensörler, ardından kompozit sensörler görünür.

Birden fazla 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ülen değerdir.

Bu fonksiyon 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 kullanılan tutamaçtır. Bir sensörün tanıtıcısı, sensör_t yapısının handle alanıyla tanımlanır.

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

Tek atımlık sensörler bir olay aldıklarında kendilerini otomatik olarak devre dışı bırakırlar ve yine de 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 kilidi tutmaz.

Uyandırma sensörleri, olayları sürekli olarak iletirken SoC'nin askıya alma moduna geçmesini engelleyebilir, 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ıdır.

enabled 0 ise ve sensör zaten devre dışıysa, bu işlev çalışmaz ve başarılı olur.

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

toplu iş (sensör, işaretler, ö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 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ş olay kaybına neden olamaz veya yüksek bir maksimum rapor gecikmesinden düşük bir rapor gecikmesine geçiş olamaz. maksimum rapor gecikmesi.

sensor_handle , yapılandırılacak sensörün tanıtıcısıdır.

flags şu anda kullanılmıyor.

sampling_period_ns , sensörün nanosaniye cinsinden çalışması gereken örnekleme dönemidir. Daha fazla ayrıntı için sample_period_ns'ye bakın.

max_report_latency_ns , olayların HAL aracılığıyla raporlanmadan önce nanosaniye cinsinden 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 halde negatif bir hata numarası döndürür.

setDelay(sensör, örnekleme periyodu)

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ıldı ve hiçbir zaman çağrılmadı. Bunun yerine, sampling_period_ns parametresini ayarlamak için batch işlevi çağrılır.

HAL sürüm 1.0'da, sample_period_ns öğesini ayarlamak için toplu iş yerine setDelay kullanıldı.

yıkama (sensör)

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

Belirtilen sensör için donanım FIFO'sunun sonuna bir temizleme tamamlandı olayı ekleyin ve FIFO'yu temizleyin; bu olaylar her zamanki gibi iletilir (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 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örde FIFO yoksa (ara belleğe alma mümkün değil) veya çağrı sırasında FIFO boşsa, flush yine de başarılı olmalı ve bu sensör için bir temizleme tamamlandı olayı gönderilmelidir. Bu, tek atımlı sensörler dışındaki tüm sensörler için geçerlidir.

flush çağrıldığında, o sensör için FIFO'da zaten bir floş olayı olsa bile, FIFO'nun sonuna ek bir tane oluşturulup eklenmesi ve FIFO'nun temizlenmesi gerekir. 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 atımlı sensörler için geçerli değildir; sensor_handle tek seferlik bir sensörü ifade ediyorsa, flush -EINVAL değerini döndürmeli ve herhangi bir temizleme tamamlandı meta veri olayı oluşturmamalıdır.

Bu işlev başarı durumunda 0'ı, eğer belirtilen sensör tek atımlık bir sensörse veya etkinleştirilmemişse -EINVAL , aksi takdirde negatif bir hata numarasını 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 dizi sensör verisini döndürür. Bu işlev, olaylar mevcut olana kadar engellenmelidir. Başarı durumunda okunan olay sayısını veya hata durumunda negatif hata numarasını döndürür.

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

Arama sırası

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

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

HAL sürüm 1_0'da sıranın tam tersi olduğunu unutmayın: önce activate çağrıldı, ardından set_delay çağrıldı.

Bir sensörün istenen özellikleri, aktif hale getirildiğinde değiştiğinde batch fonksiyon çağrılır.

flush , etkinleştirilmemiş sensörlerde bile herhangi bir zamanda çağrılabilir (bu durumda -EINVAL değerini döndürmesi gerekir)

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

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

sensörler_module_t

sensors_module_t , sensörler için Android donanım modülünü oluşturmak için kullanılan türdür. HAL uygulamasının get_sensors_list işlevini ortaya çıkarmak için bu türden bir HAL_MODULE_INFO_SYM nesnesini tanımlaması gerekir. Daha fazla bilgi için sensörler.h dosyasındaki sensors_module_t tanımına ve hw_module_t tanımına bakın.

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ünde) HAL'ın sürüm numarasını tanımlar.

sensör_t

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

ad: Sensörü temsil eden, kullanıcının görebileceği bir dize. Bu dize genellikle altta yatan sensörün parça adını, sensörün tipini ve bunun 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ü”

tanıtıcı: Kayıt olurken veya ondan olaylar oluştururken sensöre atıfta bulunmak için kullanılan tamsayı.

type: Sensörün türü. Android sensörleri nelerdir? bölümünde sensör türünün açıklamasına bakın. daha fazla ayrıntı için bkz. Resmi sensör türleri için sensör türleri . Resmi olmayan sensör türleri için type , SENSOR_TYPE_DEVICE_PRIVATE_BASE ile başlamalıdır

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

gerekliPermission: Uygulamaların sensörü görmek, ona kaydolmak ve verilerini almak için sahip olması gereken izni temsil eden bir dize. Boş bir dize, uygulamaların bu sensöre erişmek için herhangi bir izne ihtiyaç duymadığı anlamına gelir. Kalp atış hızı monitörü gibi bazı sensör türlerinin zorunlu bir requiredPermission vardır. Hassas kullanıcı bilgileri (kalp atış hızı gibi) sağlayan tüm sensörlerin bir izinle korunması gerekir.

flags: Bu sensöre ait, sensörün raporlama modunu ve sensörün uyandırma sensörü olup olmadığını tanımlayan bayraklar. Örneğin, tek seferlik bir uyandırma sensöründe flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Bayrağın mevcut HAL versiyonunda kullanılmayan 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 unutmayın. Sensör birden fazla eksen üzerinden değer bildirdiğinde aralık her eksen için geçerli olur. Örneğin, bir "+/- 2g" ivmeölçer maxRange = 2*9.81 = 2g rapor edecektir.

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

güç: Sensörü etkinleştirmenin miliAmp cinsinden güç maliyeti. Bu neredeyse her zaman altta yatan sensörün veri sayfasında bildirilen güç tüketiminden daha fazladır. Daha fazla ayrıntı için bkz . Temel sensörler != fiziksel sensörler ve bir sensörün güç tüketiminin nasıl ölçüleceğine ilişkin ayrıntılar için bkz . Güç ölçüm süreci . Sensörün güç tüketimi cihazın hareket edip etmediğine bağlıysa, hareket halindeki güç tüketimi, power alanında bildirilen tüketimdir.

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 sample_period_ns'ye bakın. minDelay mikrosaniye cinsinden ifade edildiğine, sampling_period_ns ise nanosaniye cinsinden ifade edildiğine dikkat edin. Değişim ve özel raporlama modlu sensörler için aksi belirtilmedikçe minDelay 0 olmalıdır. Tek atımlı sensörler için -1 olmalıdır.

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

fifoReservedEventCount: Donanım FIFO'sunda bu sensör için ayrılan olayların sayısı. Bu sensör için özel bir FIFO varsa fifoReservedEventCount , bu özel FIFO'nun boyutudur. FIFO diğer sensörlerle paylaşılıyorsa fifoReservedEventCount , FIFO'nun o sensör için ayrılan kısmının boyutudur. Paylaşımlı FIFO sistemlerinin çoğunda 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 büyük veya eşittir. Bu değer, başka hiçbir sensörün etkinleştirilmediğini varsayarsak, sensöre belirli bir hızda kaydolurken FIFO'nun ne kadar hızlı dolacağını tahmin etmek için kullanılır. Donanım FIFO'su olmayan sistemlerde fifoMaxEventCount 0'dır. Daha fazla ayrıntı için bkz .

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

sensörler_event_t

Android sensörleri tarafından oluşturulan ve anket işlevi aracılığıyla rapor edilen sensör olayları, type sensors_event_t . sensors_event_t bazı önemli alanları şunlardır:

sürüm: sizeof(struct sensors_event_t) olmalıdır

sensör: sensor_t.handle tarafından tanımlandığı şekliyle, olayı oluşturan sensörün tanıtıcısı.

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

zaman damgası: Etkinliğin nanosaniye cinsinden zaman damgası. Bu, olayın rapor edildiği zaman değil, olayın meydana geldiği zamandır (bir adımın atıldığı veya ivmeölçer ölçümü yapıldığı zamandır). timestamp elapsedRealtimeNano saati ile senkronize edilmeli ve sürekli sensörler durumunda titreşim küçük olmalıdır. Zaman damgalarını ayarlamak için yalnızca SoC kesme süresini kullanmak çok yüksek titreşime neden olduğundan ve zaman damgalarını ayarlamak için yalnızca sensör çipi süresini kullanmak, elapsedRealtimeNano saatinden senkronizasyonun bozulmasına neden olabileceğinden, CDD gereksinimlerini karşılamak için bazen zaman damgası filtreleme gerekli olabilir. 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 tipine özeldir. Veri alanlarının açıklaması için sensörler.h'ye ve farklı Sensör türlerinin tanımına bakın. Bazı sensörler için okumaların doğruluğu, bir status alanı aracılığıyla verilerin bir parçası olarak da raporlanır. Bu alan yalnızca seçilen sensör türleri için aktarılır ve SDK katmanında doğruluk değeri olarak görünür. Bu sensörler için durum alanının ayarlanması gerektiği sensör tipi tanımında belirtilmiştir.

Meta veri temizleme tamamlama etkinlikleri

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

sürüm: META_DATA_VERSION olmalıdır

tür: SENSOR_TYPE_META_DATA olmalıdır

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

meta_data.what: Bu olaya ilişkin 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 temizlenmesinin tamamlandığını temsil eder. meta_data.what=META_DATA_FLUSH_COMPLETE olduğunda, meta_data.sensor temizlenen sensörün tanıtıcısına ayarlanmalıdır. Bunlar yalnızca bir sensörde flush çağrıldığında oluşturulur. Daha fazla bilgi için yıkama işlevi bölümüne bakın.