Radio HAL z transmisją

W sekcjach poniżej opisujemy, jak korzystać z warstwy abstrakcji sprzętowej (HAL), aby i wdrożyć rozgłośnie radiowe.

Interfejs transmisji HAL radia

HAL radiowy nadajnik udostępnia struktury i interfejsy danych na poziomie sprzętowym, aby wdrożyć radio naziemne, takie jak radio AM/FM lub DAB.

Interfejsy HIDL 2.0 i AIDL

HAL transmisji radiowej wykorzystuje interfejsy opisane w poniższych sekcjach.

Detektor komunikatów

IAnnouncementListener to interfejs wywołania zwrotnego dla detektora powiadomień, który można zarejestrować się w radiu HAL, aby otrzymywać powiadomienia. Interfejs ma te elementy metody:

Detektor komunikatów
Opis: wywołany za każdym razem, gdy na liście ogłoszeń została zmieniona.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle to ogólny uchwyt zamykający służący do usuwania wywołania zwrotnego, który nie wymaga parametru przy użyciu aktywnego interfejsu.

ICloseHandle
Opis: zamknij nick.
HIDL 2.0 close()
AIDL void close()

Wywołanie zwrotne ITuner

ITunerCallback to interfejs wywołania zwrotnego wywoływany przez radio HAL do wysyłać aktualizacje do obsługi klienta HAL.

Wywołanie zwrotne ITuner
Opis: wywoływany przez HAL podczas operacji dostrajania (dostrajanie, przewijanie (w AIDL) lub skanowanie (w HIDL) i udany krok) kończy się asynchronicznie.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany w przypadku dostrajania, przewijania (w AIDL) lub skanowania (w HIDL), albo krok powiódł się.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
Opis: wywoływany w przypadku dostrajania, przewijania (w AIDL) lub skanowania (w HIDL), albo krok powiódł się.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany po aktualizacji listy programów. każdy fragment powinien być ograniczony do 500 kiB.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
Opis: wywołanie po podłączeniu anteny lub – rozłączono.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Opis: wywoływany w przypadku parametru danego dostawcy wartości są aktualizowane wewnętrznie w HAL (nie wywoływaj po wywołaniu setParameters przez klienta HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Opis: nowości w AIDL. Wywoływana, gdy flaga konfiguracji ma wartość aktualizowane wewnętrznie w HAL (nie należy wywołany po wywołaniu funkcji setConfigFlag przez klienta HAL).
HIDL 2.0 Nie dotyczy.
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

Radio Nowy Świat

IBroadcastRadio jest głównym interfejsem HAL radiowego. W ramach HIDL 2.0 HAL, użyj interfejsu ITunerSession dostrajania, aby wywoływać operacje. Jednak na stronie w danym momencie aktywna jest większość tunera HAL (pod warunkiem, że każde wystąpienie HAL ma tylko jeden tuner ). Interfejs ITunerSession został usunięty z interfejsów AIDL i przeniesiony do IBroadcastRadio

Radio Nowy Świat
Opis: zapoznaj się z opisem modułu i jego opisu. funkcje zabezpieczeń.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Opis: pobiera bieżącą lub możliwą częstotliwość AM/FM konfiguracji regionu.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Opis: Pobiera bieżący region DAB konfiguracji.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
Opis: pobiera obraz z pamięci podręcznej modułu radiowego. W AIDL rozmiar obrazu musi być mniejszy niż 1 MB z powodu sztywnego limitu w buforze transakcji powiązania.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
Opis: rejestruje detektor ogłoszenia.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Opis:
  • HIDL HAL: po otwarciu nowej sesji dostrajania poprzednia sesja musi zostać zakończona.
  • AIDL HAL: ponieważ nie jest dostępna sesja tunera, należy ustawić tylko wywołanie zwrotne tunera. Jeśli istnieje, stare wywołanie zwrotne powinno być nieustawione.
HIDL 2.0 openSession(ITunerCallback callback) generuje (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Opis:
  • HIDL HAL: zamknięcie sesji dostrajania nie może kończyć się niepowodzeniem i musi zostać wysłane tylko raz.
  • AIDL HAL: nie ma tunera i należy wyłączyć tylko wywołanie zwrotne tunera.
HIDL 2.0 close()
AIDL unsetTunerCallback()
Opis: dostraja do określonego programu.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
Opis: szuka następnego prawidłowego programu na powietrza. Aby uniknąć nieporozumień w AIDL, Nazwa scan została zmieniona na seek.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
Opis: kroki dotyczące sąsiedniego kanału, które mogą nie być zajmowane przez jakikolwiek program.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Opis: anuluje oczekujące dostrajanie, skanowanie (w HIDL) lub przewijanie (w AIDL) czy operacji krokowych.
HIDL 2.0 cancel()
AIDL void cancel()
Opis: stosuje filtr do listy programów oraz rozpoczyna wysyłanie aktualizacji list programów przez onProgramListUpdated oddzwonienie.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
Opis: przestaje wysyłać aktualizacje listy programów.
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
Opis: Pobiera bieżące ustawienie danej wartości config.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
Opis: ustawia daną flagę konfiguracji.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
Opis: ustawia wartości parametrów właściwe dla dostawcy.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

generuje,

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Opis: pobiera wartości parametrów związane z dostawcą.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

Wyjaśnienia dotyczące interfejsu

Zachowanie asynchroniczne

Każda operacja dostrajania (na przykład dostrajanie, skanowanie (w HIDL) lub przewijanie (w AIDL) i krok może jest czasochłonne, a wątek nie powinien być blokowany na długi czas, operacja zaplanować późniejsze wykonanie czasochłonnych operacji i szybko zwrócić stan lub wynik. Więcej informacji: każda operacja powinna:

  • Anuluj wszystkie oczekujące operacje dostrajania.
  • Sprawdź, czy operacja może zostać przetworzona w zależności od danych wejściowych metody i stanu w tunerze.
  • Zaplanuj zadanie dostrajania, a następnie zwróć Result (w HIDL) lub status (w AIDL) natychmiast. Jeśli Result lub status to OK, wywołanie zwrotne dostrajania Podczas dostrajania należy wywołać funkcję tuneFailed lub currentProgramInfoChanged nie udało się wykonać zadania (np. z powodu przekroczenia limitu czasu oczekiwania) lub już się zakończyło.

Podobnie startProgramListUpdates planuje również czasochłonne zadanie: zaktualizowanie listy programów tak, aby odbyło się później i szybko zwrócić stan lub wynik; Metoda najpierw anuluje oczekujące żądania aktualizacji, a następnie planuje zadanie aktualizacji i szybko zwraca wynik.

Warunek wyścigu

Ze względu na asynchroniczne zachowanie operacji dostrajania (na przykład dostrajania, skanowania (w HIDL) lub przewijania) (w AIDL) i kroku), między anulowaniem operacji a dostrajaniem istnieje warunek wyścigu. operacji. Jeśli funkcja cancel jest wywoływana po zakończeniu operacji dostrajania HAL, ale przed gdy oddzwanianie zostanie ukończone, możesz zignorować anulowanie i oddzwonić. przez klienta HAL.

Podobnie, jeśli funkcja stopProgramListUpdates jest wywoływana po zakończeniu programu przez HAL a przed zakończeniem wywołania zwrotnego onCurrentProgramInfoChanged, Działanie stopProgramListUpdates można zignorować, a wywołanie zwrotne zostanie wykonane.

Limit rozmiaru danych

Ponieważ bufor transakcji powiązania ma stały limit, limit danych w niektórym interfejsie metody przekazywania danych o potencjalnie dużej wielkości zostały wyjaśnione w zbiorze HAL AIDL.

  • Funkcja getImage wymaga, aby obraz był o rozmiarze mniejszym niż 1 MB.
  • onProgramListUpdate wymaga, aby wartość każdej kolumny chunk była mniejsza niż 500 kiB. Większe listy programów muszą zostać podzielone przez wdrożenie HAL na wiele części i wysyłane przez wiele wywołań zwrotnych.

Zmiany w strukturach danych HAL AIDL

Oprócz zmian w interfejsach zmiany te zostały również zastosowane do struktur danych. zdefiniowane w radiu AIDL HAL, który korzysta z AIDL.

  • Wyliczenie Constant zostało usunięte z AIDL i zdefiniowane jako stałe int w IBroadcastRadio W międzyczasie nazwa ANTENNA_DISCONNECTED_TIMEOUT_MS została zmieniona do: ANTENNA_STATE_CHANGE_TIMEOUT_MS. Nowa liczba całkowita stałej TUNER_TIMEOUT_MS to – dodano. Wszystkie operacje dostrajania, przewijania i kroków muszą zostać wykonane w tym czasie.
  • Wyliczenia RDS i Deemphasis zostały usunięte w AIDL i zdefiniowane jako stałe int w aplikacji AmFmRegionConfig. Zarówno fmDeemphasis, jak i fmRds w ProgramInfo są zadeklarowane jako liczba całkowita, wynik obliczeń bitowych odpowiednie flagi. W międzyczasie nazwy D50 i D75 zostały zmienione na DEEMPHASIS_D50 i DEEMPHASIS_D75.
  • Wyliczenie ProgramInfoFlags zostało usunięte w AIDL i zdefiniowane jako stałe int w ProgramInfo z prefiksem FLAG_. Parametr infoFlags w polu ProgramInfo jest zadeklarowany jako liczba całkowita (bitowe obliczenia) flag. Nazwa TUNED została również zmieniona na FLAG_TUNABLE, aby lepiej opisać swoją definicję, do której można nastroić stację.
  • W AmFmBandRange nazwa scanSpacing została zmieniona na seekSpacing, ponieważ nazwa scan została zmieniona na seek w AIDL.
  • Ponieważ koncepcja union została wprowadzona w AIDL, MetadataKey Parametry Metadata zdefiniowane w HAL HIDL nie są już używane. Związek AIDL Metadata jest zdefiniowane w interfejsie AIDL HAL. Każda wartość wyliczenia wcześniej w MetadataKey jest teraz polem w Metadata z typem ciągu znaków lub liczbą całkowitą, w zależności od ich definicji.