Czujniki HAL 1.0

Interfejs HAL Sensors zadeklarowany w pliku sensors.h reprezentuje interfejs między platformą Androida a platformą konkretnego oprogramowania. Implementacja HAL musi definiować każdą funkcję zadeklarowane w sensors.h. Główne funkcje to:

  • get_sensors_list – zwraca listę wszystkich czujników.
  • activate – uruchamia lub zatrzymuje czujnik.
  • batch – ustawia parametry czujnika, takie jak częstotliwość próbkowania i maksymalna. opóźnienia w raportowaniu.
  • setDelay – używany tylko w wersji HAL 1.0. Ustawia częstotliwość próbkowania dla danego czujnika.
  • flush – opróżnia FIFO określonego czujnika i zgłasza zakończenie czyszczenia. .
  • poll – zwraca dostępne zdarzenia z czujnika.

Implementacja musi być bezpieczna w wątku i umożliwiać wywoływanie tych funkcji z różnych wątków.

Interfejs definiuje również kilka typów używanych przez te funkcje. Główny typy:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Więcej informacji o tych typach znajdziesz na stronie sensors.h.

get_sensors_list(lista)

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

Udostępnia listę czujników wdrożonych przez HAL. Szczegółowe informacje o definiowaniu czujników znajdziesz w sekcji sensor_t.

Czujniki na liście pojawiają się w kolejności, w jakiej będą przesyłane do aplikacji. Zwykle są widoczne a po nim czujniki złożone.

Jeśli kilka czujników ma ten sam typ i właściwości wybudzania, pierwszy czujnik na liście jest nazywany „domyślnym”. To ten zwrócony przez getDefaultSensor(int sensorType, bool wakeUp)

Ta funkcja zwraca liczbę czujników na liście.

aktywuj(czujnik, prawda/fałsz)

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

Aktywuje lub dezaktywuje czujnik.

sensor_handle to uchwyt czujnika służący do aktywacji lub dezaktywacji. Czujnik uchwyt jest zdefiniowany przez pole handle jego struktury sensor_t.

enabled ma wartość 1, aby włączyć, lub 0, aby wyłączyć czujnik.

Czujniki jednego uderzenia dezaktywują się automatycznie po otrzymaniu informacji o zdarzeniu. i muszą je zaakceptować, aby można było dezaktywować, używając wywołania activate(..., enabled=0).

Czujniki wybudzania nigdy nie zapobiegają przechodzeniu układu SOC w tryb zawieszenia. które jest, HAL nie może stosować częściowej blokady uśpienia w imieniu aplikacji.

Czujniki wybudzania podczas ciągłego dostarczania zdarzeń mogą uniemożliwić układowi SOC przechodzi w tryb zawieszenia, ale jeśli nie trzeba dostarczyć żadnego zdarzenia, blokada wybudzania musi być zdjęta.

Jeśli enabled ma wartość 1, a czujnik jest już włączony, ta funkcja jest w trybie braku działania. i osiągać sukces.

Jeśli enabled ma wartość 0, a czujnik jest już wyłączony, ta funkcja jest wyłączona. i osiągać sukces.

Ta funkcja zwraca 0 w przypadku powodzenia, a w przeciwnym razie zwraca ujemną liczbę błędów.

wsad(czujnik, flagi, okres próbkowania, maksymalny czas oczekiwania na raport)

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

Ustawia parametry czujnika, w tym częstotliwość próbkowania oraz Raport o maksymalnej liczbie wyświetleń Tę funkcję można wywołać, gdy czujnik jest aktywny, w w którym to przypadku nie może powodować utraty pomiarów z czujnika: przejście nie mogą powodować utraty zdarzeń. przejście z dużego maksymalnego czasu oczekiwania na raport o niskim maksymalnym czasie oczekiwania opóźnienia.

sensor_handle to uchwyt czujnika do skonfigurowania.

Konto flags nie jest obecnie używane.

sampling_period_ns to okres próbkowania, w którym czujnik powinien działać w nanosekundach. Zobacz sampling_period_ns dla .

max_report_latency_ns to maksymalny czas, do którego mogą być rejestrowane zdarzenia jest opóźniony przed raportowaniem przez HAL, w nanosekundach. Zobacz max_report_latency_ns .

Ta funkcja zwraca 0 w przypadku powodzenia, a w przeciwnym razie zwraca ujemną liczbę błędów.

setDelay(czujnik; okres próbkowania)

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

W wersjach HAL 1.0 ta funkcja jest wycofana i nigdy nie jest wywoływana. Zamiast tego funkcja batch jest wywoływana w celu ustawienia atrybutu sampling_period_ns.

W wersji HAL 1.0 do ustawienia parametru sampling_period_ns użyto parametru setDelay zamiast wsadu.

flush(czujnik)

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

Dodaj zdarzenie flash complete na końcu sprzętowego FIFO określonego czujnika i usuwa FIFO. te zdarzenia są dostarczane w zwykły sposób (tj. tak, jakby maksymalny czas oczekiwania na raportowanie stracił ważność) i został usunięty z FIFO.

Usuwanie danych odbywa się asynchronicznie (tj. ta funkcja musi wrócić natychmiast). Jeśli w implementacji używany jest jeden FIFO dla kilku czujników, opróżniono, a zdarzenie zakończenia opróżniania jest dodawane tylko dla określonego czujnika.

Jeśli określony czujnik nie ma FIFO (brak możliwości buforowania) lub jeśli FIFO, było puste w momencie wywołania, flush musi mimo to potwierdzić i wysyła zdarzenie opróżnienia dla tego czujnika. Dotyczy to wszystkich czujników, a inne niż czujniki 1 ujęcia.

Gdy wywołanie flush jest wywoływane, nawet jeśli zdarzenie flush jest już w FIFO dla tego czujnika, należy utworzyć dodatkowy i dodać go na końcu a FIFO i FIFO muszą być usunięte. Liczba: flush muszą być równe liczbie utworzonych zdarzeń całkowitego usunięcia.

flush nie dotyczy one-shot czujniki; jeśli sensor_handle odnosi się do czujnika pojedynczego, Funkcja flush musi zwrócić wartość -EINVAL i nie może generować żadnych flush pełne zdarzenie metadanych.

Ta funkcja zwraca 0 w przypadku powodzenia, -EINVAL, jeśli podany czujnik jest z czujnikiem jednorazowym lub nie został włączony, a w przeciwnym razie wartość błędu była ujemna.

ankieta()

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

Zwraca tablicę danych czujnika przez wypełnienie argumentu data. Ta funkcja musi blokować do momentu, gdy zdarzenia będą dostępne. Zwraca liczbę przeczytanych zdarzeń w przypadku powodzenia, a ujemna – w przypadku błędu.

Liczba zdarzeń zwracanych w funkcji data nie może być większa niż argumentu count. Ta funkcja nigdy nie zwraca 0 (brak zdarzenia).

Kolejność połączeń

Po uruchomieniu urządzenia wywoływane jest get_sensors_list.

Po aktywowaniu czujnika funkcja batch jest wywoływana za pomocą żądane parametry, po których następuje znak activate(..., enable=1).

Zauważ, że w wersji HAL 1_0 kolejność była odwrotna: activate pierwszy, a po nim set_delay.

Gdy żądane parametry czujnika zmieniają się, gdy jest włączony aktywowany, zostaje wywołana funkcja batch.

flush można wywołać w dowolnym momencie, nawet z nieaktywnych czujników (w takim przypadku musi zwracać wartość -EINVAL)

Gdy czujnik zostanie wyłączony, wywołana jest funkcja activate(..., enable=0).

Równolegle do tych wywołań funkcja poll będzie wielokrotnie wywoływana w celu żądania danych. Funkcja poll może zostać wywołana nawet wtedy, gdy nie są włączone żadne czujniki.

czujniki_moduł_t

sensors_module_t to typ używany do tworzenia sprzętu z Androidem dla czujników. Implementacja HAL musi definiować obiekt HAL_MODULE_INFO_SYM tego typu do udostępniania funkcji get_sensors_list. Zobacz definicja elementu sensors_module_t w pliku sensors.h i definicja obiektu hw_module_t .

czujniki_poll_device_t / czujniki_poll_device_1_t

Pole sensors_poll_device_1_t zawiera pozostałe metody zdefiniowane powyżej: activate, batch, flush i poll. Jego pole common (typu hw_device_t) określa numer wersji HAL.

czujnik_t

sensor_t reprezentuje Androida . Oto kilka jego ważnych pól:

name: widoczny dla użytkownika ciąg znaków reprezentujący czujnik. Ten ciąg jest często zawiera nazwę części i typ czujnika oraz czy to czujnik wybudzania. Na przykład „Akcelerometr LIS2HH12”, „MAX21000 Uncalibrated Gyrosscope”, „BMP280 Wake-up Barometer”, „MPU6515 Game” Wektor obrotu”

handle:liczba całkowita używana do odwoływania się do czujnika podczas rejestracji lub i generowanie z niego zdarzeń.

type:typ czujnika. Zobacz opis czujnika wpisz Co to są czujniki Androida?, aby uzyskać więcej informacji, i zapoznaj się z Typy czujników, aby poznać oficjalne typy czujników. Dla: nieoficjalne typy czujników, type musi zaczynać się od SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: typ czujnika w postaci ciągu znaków. Gdy czujnik ma oficjalny typ ustawiony na SENSOR_STRING_TYPE_*. Kiedy czujnik ma typ konkretnego producenta, stringType musi zaczyna się od odwrotnej nazwy domeny producenta. Na przykład czujnik (np. wykrywacz jednorożców) zdefiniowany przez zespół Cool-product na stronie Fikcyjna firma może użyć stringType=”com.fictional_company.cool_product.unicorn_detector” stringType służy do jednoznacznej identyfikacji nieoficjalnych czujników . Więcej informacji na temat typów i ciągów znajdziesz na stronie sensors.h. .

requiredPermission: ciąg znaków reprezentujący uprawnienie które aplikacje muszą mieć, aby mieć dostęp do czujnika, zarejestrować się w nim i odbierać swoje dane. Pusty ciąg oznacza, że aplikacje nie wymagają uprawnień do na dostęp do tego czujnika. Niektóre typy czujników, np. pulsometr, mają obowiązkowo requiredPermission. Wszystkie czujniki zapewniające czułość informacje o użytkowniku (takie jak tętno) muszą być chronione przez uprawnienia.

flags: flagi, które określają tryb raportowania czujnika i określają, czy czujnik wybudzania. Może to być na przykład czujnik wybudzania za jednym razem. będzie mieć flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP. Fragmenty flaga, która nie jest używana w bieżącej wersji HAL, musi mieć wartość 0.

maxRange: maksymalna wartość, jaką czujnik może zgłosić, w tej samej jednostce co wartość raportowanych wartości. Czujnik musi mieć możliwość raportowania wartości bez nasycenia w ciągu [-maxRange; maxRange]. Pamiętaj, że oznacza to całkowity zakres czujnik w ogólnym sensie to 2*maxRange. Gdy czujnik wskaże wartości przekraczające kilku osi, zakres odnosi się do każdej z nich. Na przykład: „+/- 2g” akcelerometr wskaże maxRange = 2*9.81 = 2g.

Rozdzielczość: najmniejsza różnica w wartości, jaką czujnik może zmierzyć. Zwykle jest obliczany na podstawie parametru maxRange i liczby bitów w pomiarze.

power: koszt zasilania czujnika (miliAmp). To prawie zawsze większe niż zużycie energii podawane w danych czujnika. Sprawdź czujniki podstawowe != fizyczne , aby dowiedzieć się więcej, i przeczytaj artykuł na temat pomiaru mocy). , aby dowiedzieć się, jak zmierzyć zużycie energii przez czujnik. Jeśli zużycie energii przez czujnik zależy od tego, czy urządzenie się porusza, zużycie energii podczas ruchu jest zgodne z zużyciem energii w aplikacji power .

minDelay: w przypadku czujników ciągłych jest to okres próbkowania w mikrosekundach, co odpowiada najszybszej szybkości obsługiwanej przez czujnik. Zobacz sampling_period_ns dla o sposobie wykorzystania tej wartości. Pamiętaj, że minDelay wyrażony w mikrosekundach, podczas gdy sampling_period_ns jest w nanosekund. W przypadku czujników przy zmianie oraz specjalnego trybu raportowania, chyba że w innym przypadku wartość minDelay musi wynosić 0. Czujnik jednego uderzenia musi wynosić -1.

maxDelay: w przypadku czujników ciągłych i zmian zmian próbkowanie okresu wyrażonego w mikrosekundach, czyli najwolniejszego czasu czujnika. obsługuje. Zobacz sampling_period_ns dla o sposobie wykorzystania tej wartości. Pamiętaj, że maxDelay wyrażony w mikrosekundach, podczas gdy sampling_period_ns jest w nanosekund. Czujniki specjalne i jednorazowe muszą mieć parametr maxDelay 0.

fifoReserveEventCount: liczba zdarzeń zarezerwowanych dla tego czujnika w sprzętowy FIFO. Jeśli dla tego czujnika jest dedykowany FIFO, fifoReservedEventCount to rozmiar dedykowanej ustawy FIFO. Jeśli FIFO jest udostępniane innym czujnikom, fifoReservedEventCount to rozmiar części FIFO, który jest zarezerwowany dla tego czujnika. W większości systemów FIFO oraz wł. w systemach bez sprzętowego FIFO ta wartość wynosi 0.

fifoMaxEventCount: maksymalna liczba zdarzeń, które mogą będą przechowywane w FIFO dla tego czujnika. Jest to zawsze większe lub równe fifoReservedEventCount Ta wartość służy do oszacowania, FIFO będzie się zapełniać po zarejestrowaniu na czujniku jeśli żadne inne czujniki nie zostały aktywowane. W systemach, w których sprzętowy FIFO, fifoMaxEventCount ma wartość 0. Więcej informacji znajdziesz w sekcji Grupowanie wsadowe.

W przypadku czujników z oficjalnym typem czujnika niektóre pola zostały zastąpione w ramach platformy. Przykład: czujniki akcelerometru muszą działać w trybie raportowania ciągłego, a monitory tętna musi być chroniona przez SENSOR_PERMISSION_BODY_SENSORS uprawnienia.

czujniki_zdarzenie_t

Zdarzenia z czujników generowane przez czujniki Androida i zgłaszane za pomocą funkcji ankiety mają wartość type sensors_event_t. Oto kilka ważnych pól sensors_event_t:

wersja: wymagana to sizeof(struct sensors_event_t)

czujnik: uchwyt czujnika, który wywołał zdarzenie, określony za pomocą funkcji sensor_t.handle

type:typ czujnika czujnika, który wywołał zdarzenie, określony za pomocą funkcji sensor_t.type

timestamp: sygnatura czasowa zdarzenia w nanosekundach. To czas, w którym zdarzenie (zrobienie kroku lub pomiar przy użyciu akcelerometru), a nie czas zgłoszenia zdarzenia. Pole timestamp musi być zsynchronizowane z zegara elapsedRealtimeNano, a w przypadku czujników ciągłych zakłócenia. muszą być małe. Filtrowanie sygnatury czasowej jest czasami niezbędne, aby spełnić wymagania CDD. takich jak używanie wyłącznie czasu przerwania układu SoC do ustawiania sygnatur czasowych. powoduje zbyt duże zakłócenia i używa czasu układu czujnika do ustawienia mogą powodować desynchronizację elapsedRealtimeNano.

danych i nakładających się pól: wartości mierzone przez parametr . Znaczenie i jednostki tych pól są różne dla każdego czujnika typu. Na stronie sensors.h oraz definicji różnych typów czujników znajdziesz opis pola danych. W przypadku niektórych czujników podawana jest również dokładność odczytów jako część danych, za pomocą pola status. To pole jest tylko dla tych wybranych typów czujników, pojawiając się w warstwie SDK jako wartość dokładności. W przypadku tych czujników fakt, że pole stanu musi być ustawione jest wymienione w typie czujnika definicji.

Zdarzenia zakończenia usuwania metadanych

Zdarzenia metadanych mają ten sam typ co zwykłe zdarzenia z czujnika: sensors_event_meta_data_t = sensors_event_t Zwracane są razem z: innych zdarzeń z czujników. Zawierają te pola:

wersja: wymagana to META_DATA_VERSION

type:musi mieć wartość SENSOR_TYPE_META_DATA.

sensor, zarezerwowane i timestamp: musi mieć wartość 0.

meta_data.what: zawiera typ metadanych zdarzenia. Obecnie istnieje jeden prawidłowy typ metadanych: META_DATA_FLUSH_COMPLETE.

Zdarzenia (META_DATA_FLUSH_COMPLETE) odpowiadają zakończeniem opróżnienia czujnik FIFO. Gdy meta_data.what=META_DATA_FLUSH_COMPLETE, meta_data.sensor musi być ustawiona na uchwyt czujnika, który został opróżniony. Są generowane tylko po wywołaniu funkcji flush przez czujnik. Zapoznaj się z sekcją na temat: użyj funkcji flush.