Stany zasilania SoC
Stany zasilania systemu na chipie (SoC) to: włączony, bezczynny i zawieszony. „Wł.” oznacza, że SoC jest uruchomiony. „Idle” to tryb średniego poboru mocy, w którym SoC jest zasilany, ale nie wykonuje żadnych zadań. „Zawieszenie” to tryb niskiego poboru mocy, w którym SoC nie jest zasilany. Pobór mocy urządzenia w tym trybie jest zwykle 100 razy mniejszy niż w trybie „Włączony”.
Czujniki niewybudzające się
Czujniki niewybudzające to czujniki, które nie zapobiegają przejściu SoC w tryb wstrzymania i nie budzą SoC w celu przesłania danych. W szczególności kierowcom nie wolno trzymać blokady wybudzania. Za utrzymanie częściowej blokady wybudzania odpowiadają aplikacje, jeśli chcą otrzymywać zdarzenia z czujników innych niż wybudzanie, gdy ekran jest wyłączony. Gdy SoC znajduje się w trybie zawieszenia, czujniki muszą nadal działać i generować zdarzenia, które są umieszczane w sprzętowym FIFO. (Więcej szczegółów można znaleźć w sekcji Batchowanie .) Zdarzenia w FIFO są dostarczane do aplikacji, gdy SoC się budzi. Jeśli FIFO jest zbyt małe, aby przechowywać wszystkie zdarzenia, starsze zdarzenia zostaną utracone; najstarsze dane są usuwane, aby uwzględnić najnowsze dane. W skrajnym przypadku, gdy FIFO nie istnieje, wszystkie zdarzenia wygenerowane, gdy SoC jest w trybie zawieszenia, zostaną utracone. Jedynym wyjątkiem jest najnowsze zdarzenie z każdego czujnika zmiany: ostatnie zdarzenie musi zostać zapisane poza FIFO, aby nie można było go utracić.
Gdy tylko SoC wyjdzie z trybu zawieszenia, wszystkie zdarzenia z FIFO zostaną zgłoszone i działanie zostanie wznowione normalnie.
Aplikacje korzystające z czujników innych niż wybudzanie powinny albo posiadać blokadę wybudzenia, aby zapewnić, że system nie przejdzie w stan zawieszenia, wyrejestrować się z czujników, gdy ich nie potrzebują, albo spodziewać się utraty zdarzeń, gdy SoC będzie w trybie zawieszenia.
Czujniki budzenia
W przeciwieństwie do czujników niewybudzających, czujniki wybudzające zapewniają dostarczanie danych niezależnie od stanu SoC. Gdy SoC jest wybudzony, czujniki budzenia zachowują się jak czujniki inne niż czujniki budzenia. Kiedy SoC śpi, czujniki budzenia muszą obudzić SoC, aby dostarczyć zdarzenia. Muszą nadal pozwolić SoC przejść w tryb zawieszenia, ale muszą go także obudzić, gdy trzeba zgłosić zdarzenie. Oznacza to, że czujnik musi obudzić SoC i dostarczyć zdarzenia, zanim upłynie maksymalne opóźnienie raportowania lub zapełni się sprzętowy FIFO. Aby uzyskać więcej informacji, zobacz Dozowanie wsadowe .
Aby mieć pewność, że aplikacje będą miały czas na odebranie zdarzenia, zanim SoC ponownie przejdzie w tryb uśpienia, sterownik musi przytrzymać „blokadę wybudzania po przekroczeniu limitu czasu” przez 200 milisekund za każdym razem, gdy zgłaszane jest zdarzenie. Oznacza to, że SoC nie powinien mieć możliwości ponownego uśpienia w ciągu 200 milisekund po przerwaniu budzenia. To wymaganie zniknie w przyszłej wersji Androida i do tego czasu potrzebujemy blokady wybudzania po przekroczeniu limitu czasu.
Jak zdefiniować czujniki wybudzenia i niewybudzenia?
Aż do KitKata to, czy czujnik był czujnikiem wybudzającym, czy nie, było podyktowane typem czujnika: większość z nich to czujniki niebudzące, z wyjątkiem czujnika zbliżeniowego i istotnego czujnika ruchu .
Zaczynając od L, czy dany czujnik jest czujnikiem wybudzenia, czy nie, określa się flagą w definicji czujnika. Większość czujników można zdefiniować jako pary wariantów tego samego czujnika z funkcją wybudzenia i bez wybudzenia, w takim przypadku muszą one zachowywać się jak dwa niezależne czujniki, nie oddziałujące ze sobą. Aby uzyskać więcej informacji, zobacz Interakcja .
O ile w definicji typu czujnika nie określono inaczej, zaleca się zastosowanie jednego czujnika wybudzającego i jednego czujnika niewybudzającego dla każdego typu czujnika wymienionego w Typy czujników . W każdej definicji typu czujnika zobacz, który czujnik (obudzony czy nie) zostanie zwrócony przez SensorManager.getDefaultSensor(sensorType)
. Jest to czujnik, z którego będzie korzystać większość aplikacji.