Sensörler HAL 1.0

Sensors.h içinde bildirilen Sensors HAL arabirimi, Android çerçevesi ile donanıma özel yazılım arasındaki arabirimi temsil eder. Bir HAL uygulaması, sensor.h içinde bildirilen her 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 temizler ve bu yapıldığında bir yıkama tamamlandı olayı bildirir.
  • poll - Mevcut sensör olaylarını döndürür.

Uygulama iş parçacığı için 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. Başlıca türleri şunlardır:

  • 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 sensor.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 sensor_t'ye bakın.

Sensörlerin listede göründüğü sıra, sensörlerin uygulamalara bildirileceği sıradır. Genellikle, önce temel sensörler, ardından bileşik 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 , etkinleştirmek/devre dışı bırakmak için sensörün tutamacıdı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 seferlik sensörler, bir olay aldıklarında kendilerini otomatik olarak devre dışı bırakırlar ve yine de bir activate(..., enabled=0) .

Uyanmayan 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 iletirken, SoC'nin askıya alma moduna geçmesini önleyebilir, ancak herhangi bir olayın iletilmesi gerekmiyorsa, kısmi uyandırma kilidi serbest bırakılmalıdır.

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ışıysa, bu işlev işlemsizdir ve başarılı olur.

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

toplu (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 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 olmaz veya yüksek bir maksimum rapor gecikmesinden düşük bir gecikmeye geçişe neden olamaz. maksimum rapor gecikmesi.

sensor_handle , yapılandırılacak sensörün tutamacıdır.

flags şu anda kullanılmamaktadır.

sampling_period_ns , sensörün nanosaniye cinsinden çalışması gereken örnekleme periyodudur. Daha fazla ayrıntı için sample_period_ns 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 takdirde 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ı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, 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 boşaltır; bu olaylar her zamanki gibi (yani maksimum raporlama gecikmesinin süresi dolmuş gibi) iletilir ve FIFO'dan kaldırılır.

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ün FIFO'su yoksa (arabelleğe alma mümkün değil) veya FIFO çağrı 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 seferlik 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 temizleme olayı olsa bile, ek bir tane oluşturulmalı ve FIFO'nun sonuna eklenmeli ve FIFO boşaltılmalıdır. Temizleme çağrılarının sayısı, oluşturulan flush tamamlama olaylarının sayısına eşit olmalıdır.

flush tek seferlik sensörler için geçerli değildir; sensor_handle tek seferlik bir sensöre atıfta bulunuyorsa, flush -EINVAL döndürmeli ve herhangi bir boşaltma tamamlandı meta veri olayı oluşturmamalıdır.

Bu işlev, başarılı olduğunda 0, belirtilen sensör tek seferlik 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);

Veri bağımsız değişkenini doldurarak bir dizi sensör data döndürür. Bu fonksiyon, olaylar mevcut olana kadar engellemelidir. Başarı durumunda okunan olay sayısını veya bir hata durumunda negatif bir hata numarasını döndürür.

data döndürülen olay sayısı, count bağımsız değişkenine eşit veya daha az 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, istenen parametrelerle batch işlev çağrılacak ve ardından activate(..., enable=1) .

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

Bir sensör aktifken istenilen özellikler değiştiğinde batch fonksiyon çağrılır.

flush , etkin olmayan sensörlerde bile herhangi bir zamanda çağrılabilir (bu durumda -EINVAL döndürmesi gerekir)

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

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

sensor_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 nesnesi tanımlamalıdır. Daha fazla bilgi için sensors_module_t içindeki sensor_module_t tanımına ve hw_module_t tanımına bakın.

sensor_poll_device_t / sensor_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ı tarafından görülebilen bir dize. Bu dizi genellikle alttaki sensörün parça adını, sensörün tipini 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ü”

tutamaç: Kaydolurken veya ondan olaylar oluştururken sensöre atıfta bulunmak için kullanılan tam sayı.

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

stringType: Bir dizi olarak sensörün 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 etki alanı adıyla başlamalıdır. Örneğin, Fictional-Company'deki Cool-product ekibi tarafından tanımlanan bir sensör (örneğin 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 dizi türleri hakkında daha fazla bilgi için sensor.h'ye bakın.

gerekli İzin: 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 izin gerektirmediği anlamına gelir. Kalp atış hızı monitörü gibi bazı sensör türlerinin zorunlu bir requiredPermission İzni vardır. Hassas kullanıcı bilgileri (kalp hızı gibi) sağlayan tüm sensörler bir izinle korunmalıdır.

flags: Bu sensör için, 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ünün flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Geçerli HAL sürümünde kullanılmayan bayrağın bitleri 0'a eşit bırakılmalıdır.

maxRange: Sensörün rapor edebileceği maksimum değer, rapor edilen değerlerle aynı birimde. 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 birkaç eksen üzerinden değerler rapor ettiğinde, aralık her eksen için geçerlidir. Örneğin, bir "+/- 2g" ivmeölçer, maxRange = 2*9.81 = 2g bildirir.

çözünürlük: Sensörün ölçebileceğ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 miliAmper cinsinden güç maliyeti. Bu, neredeyse her zaman, temeldeki 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 bakın ve bir sensörün güç tüketiminin nasıl ölçüleceğine ilişkin ayrıntılar için Güç ölçüm işlemi bölümüne bakın. Sensörün güç tüketimi, cihazın hareket edip etmemesine bağlıysa, hareket halindeki güç tüketimi, power alanında bildirilendir.

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 bakın. sampling_period_ns nanosaniye cinsinden iken minDelay mikrosaniye cinsinden ifade edildiğine dikkat edin. On-change ve özel raporlama modu sensörleri için aksi belirtilmedikçe minDelay 0 olmalıdır. One-shot 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 sample_period_ns bakın. sampling_period_ns nanosaniye cinsinden iken maxDelay mikrosaniye cinsinden ifade edildiğine dikkat edin. Özel ve tek seferlik sensörler için maxDelay 0 olmalıdır.

fifoReservedEventCount: Donanım FIFO'sunda bu sensör için ayrılmış 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 , FIFO'nun o sensör için ayrılmış bölümü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 değerinden büyük veya eşittir. Bu değer, başka hiçbir sensörün etkinleştirilmediğini varsayarak, sensöre belirli bir oranda kaydolurken FIFO'nun ne kadar çabuk 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 tarafından bazı alanların üzerine yazılır. Örneğin, ivmeölçer sensörleri sürekli bir 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 yoklama işlevi aracılığıyla bildirilen sensör olayları, type sensors_event_t . İşte bazı önemli sensors_event_t alanları:

sürüm: sizeof(struct sensors_event_t)

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

type: olayı oluşturan sensörün sensor_t.type tarafından tanımlandığı şekilde sensör tipi.

zaman damgası: Olayın nanosaniye cinsinden zaman damgası. Bu, olayın gerçekleştiği zamandır (bir adım atıldığı veya bir ivmeölçer ölçümünün yapıldığı), olayın bildirildiği zaman değil. timestamp , geçen elapsedRealtimeNano saati ile senkronize edilmelidir ve sürekli sensörler durumunda, titreşim küçük olmalıdır. Zaman damgalarını ayarlamak için yalnızca SoC kesme süresinin kullanılması çok yüksek titreşime neden olduğundan ve zaman damgalarını ayarlamak için yalnızca sensör çipi süresinin kullanılması, geçen elapsedRealtimeNano saatinden senkronizasyonun bozulmasına neden olabileceğinden, CDD gereksinimlerini karşılamak için zaman damgası filtrelemesi bazen gereklidir. 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 da bir status alanı aracılığıyla verilerin bir parçası olarak rapor edilir. Bu alan yalnızca SDK katmanında doğruluk değeri olarak görünen seçili sensör türleri için iletilir. Bu sensörler için durum alanının ayarlanması gerektiği, sensör tipi tanımında belirtilmiştir.

Meta veri temizleme tamamlama olayları

Meta veri olayları, normal sensör olaylarıyla aynı türe sahiptir: sensors_event_meta_data_t = sensors_event_t . Yoklama yoluyla diğer sensör olaylarıyla 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ü vardır: META_DATA_FLUSH_COMPLETE .

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