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.