In den folgenden Abschnitten wird beschrieben, wie Sie mit der Hardwareabstraktionsschicht (HAL) arbeiten, um Radiofunk implementieren.
HAL-Schnittstelle für Funkschnittstelle
HAL stellt Datenstrukturen und Schnittstellen auf Hardwareebene bereit, Radiosender implementieren, z. B. AM/FM und DAB.
HIDL 2.0- und AIDL-Schnittstellen
Der HAL verwendet die in den folgenden Abschnitten beschriebenen Schnittstellen.
IAnkündigungListener
IAnnouncementListener
ist die Callback-Oberfläche für den Ankündigungs-Listener, die
können beim Rundfunkradio HAL für den Empfang von Ankündigungen registriert werden. Die Benutzeroberfläche hat Folgendes:
Methoden:
IAnkündigungListener | ||
---|---|---|
Beschreibung: Wird immer aufgerufen, wenn in der Ankündigungsliste geändert. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
Logo: AIDL | oneway void onListUpdated(in Announcement[] announcements) |
Geschlossener Griff
ICloseHandle
ist das allgemeine Handle zum Schließen eines Callbacks, für den kein
aktive Oberfläche.
Geschlossener Griff | ||
---|---|---|
Beschreibung:Schließe den Ziehpunkt. | ||
HIDL 2.0 | close() |
|
Logo: AIDL | void close() |
ITunerCallback
ITunerCallback
ist die Callback-Schnittstelle, die vom Broadcast-Radio HAL aufgerufen wird,
Aktualisierungen an den HAL-Clientdienst senden.
ITunerCallback | ||
---|---|---|
Beschreibung:Wird vom HAL bei einem Abstimmungsvorgang aufgerufen (Abstimmung, Suche (in AIDL) oder Scan (in HIDL) und Schritt erfolgreich) schlägt asynchron fehl. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
Logo: AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Beschreibung: Wird beim Abstimmen, Suchen (in AIDL) oder Scan aufgerufen (in HIDL) oder der Schritt erfolgreich ist. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
Logo: AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Beschreibung: Wird beim Abstimmen, Suchen (in AIDL) oder Scan aufgerufen (in HIDL) oder der Schritt erfolgreich ist. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
Logo: AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Beschreibung: Wird bei der Aktualisierung der Programmliste aufgerufen. die sollte die Größe jedes Blocks auf 500 KiB begrenzt werden. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Logo: AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Beschreibung:Wird aufgerufen, wenn die Antenne verbunden ist oder nicht verbunden. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
Logo: AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Beschreibung: Wird aufgerufen, wenn anbieterspezifischer Parameter
werden intern im HAL aktualisiert (nicht nach Aufruf von
setParameters durch HAL-Client). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
Logo: AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Beschreibung: Neu in AIDL. Wird aufgerufen, wenn das Konfigurations-Flag
intern im HAL aktualisiert werden (sollte nicht
aufgerufen wird, nachdem setConfigFlag durch den HAL-Client aufgerufen wurde). |
||
HIDL 2.0 | Nicht zutreffend | |
Logo: AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
iBroadcastRadio
IBroadcastRadio
ist die primäre Schnittstelle für das HAL. Im HIDL
2.0 HAL, verwende die ITunerSession
-Schnittstelle zum Tuner, um Vorgänge aufzurufen. In
die meisten Tuner gleichzeitig aktiv sind (vorausgesetzt, dass jede HAL-Instanz des Radiosenders nur einen Tuner hat)
Chip).
ITunerSession
wurde aus den AIDL-Schnittstellen entfernt und ihre Schnittstellen wurden verschoben nach
IBroadcastRadio
.
iBroadcastRadio | ||
---|---|---|
Beschreibung: Rufen Sie die Beschreibung eines Moduls und Funktionen. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
Logo: AIDL | Properties getProperties() |
|
Beschreibung:Ruft den aktuellen oder möglichen AM/FM ab Konfiguration der Region. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
Logo: AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Beschreibung: Ruft die aktuelle DAB-Region ab Konfiguration. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
Logo: AIDL | DabTableEntry[] getDabRegionConfig() |
|
Beschreibung: Ruft ein Bild aus dem Cache des Funkmoduls ab. In AIDL muss die Bildgröße kleiner als 1 MB sein aufgrund eines festen Limits für den Zwischenspeicher-Transaktionspuffer. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
Logo: AIDL | byte[] getImage(in int id) |
|
Beschreibung: Registriert den Ankündigungs-Listener. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
Logo: AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Beschreibung:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) generiert
(Result result, ITunerSession session) |
|
Logo: AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Beschreibung:
|
||
HIDL 2.0 | close() |
|
Logo: AIDL | unsetTunerCallback() |
|
Beschreibung: Passt auf ein bestimmtes Programm an. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
Logo: AIDL | void tune(in ProgramSelector program) |
|
Beschreibung: Sucht nach dem nächsten gültigen Programm auf der
air. Um Verwirrung in AIDL zu vermeiden,
scan wurde in seek umbenannt.
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
Logo: AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Beschreibung:Schritte zum angrenzenden Kanal, der unter Umständen nicht Programm beschäftigt sein. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
Logo: AIDL | void step(in boolean directionUp) |
|
Beschreibung:Bricht die ausstehende Feinabstimmung, den Scan (in HIDL) oder die Suche ab. (in AIDL) oder Schrittvorgängen. | ||
HIDL 2.0 | cancel() |
|
Logo: AIDL | void cancel() |
|
Beschreibung: Wendet einen Filter auf die Programmliste an und
sendet Aktualisierungen der Programmliste über
onProgramListUpdated -Callback. |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
Logo: AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Beschreibung: Es werden keine Aktualisierungen der Programmliste mehr gesendet. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
Logo: AIDL | void stopProgramListUpdates() |
|
Beschreibung: Ruft die aktuelle Einstellung einer bestimmten config an. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
Logo: AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Beschreibung: Legt das angegebene Konfigurations-Flag fest. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
Logo: AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Beschreibung: Legt anbieterspezifische Parameterwerte fest. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
generiert, (vec<VendorKeyValue> results) |
|
Logo: AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Beschreibung: Ruft anbieterspezifische Parameterwerte ab. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
Logo: AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Erläuterungen zur Benutzeroberfläche
Asynchrones Verhalten
Da jeder Abstimmungsvorgang (z. B. Feinabstimmung, Scan (in HIDL) oder Suche (in AIDL) und Schritt) zeitraubend sein und der Thread nicht für lange Zeit blockiert sein sollte, sollte der Vorgang zeitraubende Vorgänge später einplanen und schnell einen Status oder ein Ergebnis zurückgeben. Im Detail sollte jeder Vorgang:
- Brechen Sie alle ausstehenden Abstimmungsvorgänge ab.
- Prüfen Sie anhand der Methodeneingaben und des Status der Methode, ob der Vorgang verarbeitet werden kann. Tuner.
- Plane die Abstimmungsaufgabe und gib dann
Result
(in HIDL) oderstatus
(in AIDL) sofort. WennResult
oderstatus
den WertOK
hat, ist der Tuner-CallbacktuneFailed
odercurrentProgramInfoChanged
muss bei der Abstimmung aufgerufen werden Aufgabe fehlgeschlagen (z. B. aufgrund einer Zeitüberschreitung) oder abgeschlossen ist.
In ähnlicher Weise plant startProgramListUpdates
auch die zeitaufwendige Aufgabe der
Aktualisierung der Programmliste so, dass sie später stattfindet und um schnell einen Status oder ein Ergebnis zurückzugeben. Die Methode
bricht zuerst ausstehende Aktualisierungsanfragen ab, plant dann die Aktualisierungsaufgabe und gibt schnell den
Ergebnis.
Race-Bedingung
Aufgrund des asynchronen Verhaltens von Abstimmungsvorgängen (z. B. Feinabstimmung, Scan (in HIDL) oder Suche
(in AIDL) und Schritt), gibt es eine Wettlaufbedingung zwischen dem Abbruch des Vorgangs und der Abstimmung.
Geschäftsabläufe. Wenn cancel
aufgerufen wird, nachdem der HAL einen Abstimmungsvorgang abgeschlossen hat und bevor
der Callback abgeschlossen ist, kann der Abbruch ignoriert werden und der Callback sollte abgeschlossen sein und empfangen werden.
durch den HAL-Client.
Das Gleiche gilt, wenn stopProgramListUpdates
aufgerufen wird, nachdem der HAL ein Programm abgeschlossen hat
und bevor der onCurrentProgramInfoChanged
-Callback abgeschlossen ist,
stopProgramListUpdates
kann ignoriert werden und der Callback sollte abgeschlossen sein.
Limit für Datengröße
Da es ein festes Limit für den Binder-Transaktionszwischenspeicher gibt, -Methoden, die Daten einer potenziell großen Größe übergeben, werden in AIDL HAL erläutert.
getImage
erfordert, dass das zurückgegebene Bild kleiner als 1 MB ist.onProgramListUpdate
erfordert, dass jedechunk
kleiner als 500 KiB sein muss. Größere Programmlisten müssen durch die HAL-Implementierung in mehrere Blöcke aufgeteilt und mehrere Callbacks verwenden.
Änderungen an AIDL HAL-Datenstrukturen
Diese Änderungen wurden nicht nur an der Benutzeroberfläche, sondern auch auf die Datenstrukturen definiert in Rundfunk-AIDL HAL, das AIDL nutzt.
- Die Aufzählung
Constant
wird in AIDL entfernt und in „const int“ als „const int“ definiertIBroadcastRadio
.ANTENNA_DISCONNECTED_TIMEOUT_MS
wurde umbenannt anANTENNA_STATE_CHANGE_TIMEOUT_MS
. Eine neue Konstante intTUNER_TIMEOUT_MS
ist hinzugefügt. Alle Feinabstimmungs-, Such- und Schrittvorgänge müssen innerhalb dieser Zeit abgeschlossen sein. - Enum
RDS
undDeemphasis
werden in AIDL entfernt und als const int definiert inAmFmRegionConfig
. Entsprechend sind sowohlfmDeemphasis
als auchfmRds
inProgramInfo
werden als Ganzzahl deklariert, ein Bit-Berechnungsergebnis von die entsprechenden Flags. In der Zwischenzeit werdenD50
undD75
umbenannt inDEEMPHASIS_D50
bzw.DEEMPHASIS_D75
. - Die Aufzählung
ProgramInfoFlags
wird in AIDL entfernt und in „const int“ als „const int“ definiertProgramInfo
mit dem PräfixFLAG_
hinzugefügt. EntsprechendinfoFlags
inProgramInfo
wird als Ganzzahl deklariert, ein Bit-Berechnungsergebnis. von Flags.TUNED
wurde ebenfalls inFLAG_TUNABLE
umbenannt, um die Beschreibung besser zu beschreiben dessen Definition, auf die der Sender abgestimmt werden kann. - Im
AmFmBandRange
wirdscanSpacing
umbenannt inseekSpacing
, dascan
in AIDL inseek
umbenannt wurde. - Da das Konzept der Union in AIDL eingeführt wurde, können
MetadataKey
undMetadata
, die in HIDL HAL definiert sind, werden nicht mehr verwendet. AIDL-Union-Metadata
ist in AIDL HAL definiert. Jeder Aufzählungswert, der zuvor inMetadataKey
enthalten war, ist jetzt ein Feld inMetadata
durch den String- oder Ganzzahltyp, je nach deren Definitionen.