שידורי HAL ברדיו

הקטעים הבאים מתארים איך לעבוד עם שכבת הפשטה של החומרה (HAL) כדי: להטמיע רדיו שמשודר.

ממשק HAL לשידור רדיו

פרוטוקול HAL של תחנת הרדיו Broadcast מספק מבני נתונים וממשקים ברמת החומרה כדי להטמיע רדיו משודר, כמו רדיו AM/FM ו-DAB.

ממשקי HIDL 2.0 ו-AIDL

פרוטוקול HAL של רדיו השידורים משתמש בממשקים שמתוארים בסעיפים הבאים.

IMessagementListener

IAnnouncementListener הוא ממשק הקריאה החוזרת (callback) של אוזן ההודעות, ניתן להירשם בתקשורת HAL לשידורים של הודעות כדי לקבל הודעות. בממשק יש את הפרטים הבאים אמצעי תשלום:

IMessagementListener
תיאור: תתבצע שיחה בכל פעם שיש ברשימת ההודעות השתנה.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle הוא נקודת האחיזה הגנרית הקרובה כדי להסיר קריאה חוזרת (callback) שלא מצריכה ממשק פעיל.

ICloseHandle
תיאור: סגירת נקודת האחיזה.
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback הוא ממשק הקריאה החוזרת (callback) שנקרא על ידי HAL של הרדיו שמשודר אל שליחת עדכונים לשירות לקוח HAL.

ITunerCallback
תיאור: מופעל על ידי HAL במהלך פעולת כוונון (כוונון, דילוג (ב-AIDL) או סריקה (ב-HIDL) והשלב נכשלים באופן אסינכרוני.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: הקריאה מופעלת בזמן כוונון, דילוג (ב-AIDL) או סריקה (ב-HIDL), או שהשלב מצליח.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
תיאור: הקריאה מופעלת בזמן כוונון, דילוג (ב-AIDL) או סריקה (ב-HIDL), או שהשלב מצליח.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: מופעל כשרשימת התוכניות מתעדכנת. ה הגודל של כל מקטע צריך להיות מוגבל ל-500KiB.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
תיאור: מופעלת כשהאנטנה מחוברת או מנותק.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
תיאור: נשלחת קריאה כשפרמטר ספציפי לספק הערכים מתעדכנים באופן פנימי ב-HAL (אין להפעיל אותו לאחר הקריאה setParameters על ידי לקוח HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
תיאור: חדש ב-AIDL. מתבצעת קריאה כאשר דגל ההגדרה הוא עודכן באופן פנימי ב-HAL (לא אמור להיות הופעלה אחרי קריאה אל setConfigFlag באמצעות לקוח HAL).
HIDL 2.0 לא ישים.
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio הוא הממשק הראשי לשידור חי של רדיו. ב-HIDL 2.0 HAL, שימוש בממשק ITunerSession לטיונר לביצוע פעולות. אבל, במקרה רוב טיונר אחד פעיל בו-זמנית (בתנאי שכל מופע HAL של רדיו משודר כולל רק טיונר אחד ). בוצעה הסרה של ITunerSession מהממשקים של AIDL והממשקים שלו הועברו אל IBroadcastRadio.

IBroadcastRadio
תיאור: הצגת התיאור של המודול יכולות.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
תיאור: אחזור ה-AM/FM הנוכחי או האפשרי הגדרת האזור.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
תיאור: אחזור אזור DAB הנוכחי הגדרה אישית.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
תיאור: קבלת תמונה מהמטמון של מודול הרדיו. ב-AIDL, גודל התמונה חייב להיות קטן מ-1MB בגלל מגבלה קשיחה על מאגר הנתונים הזמני של הקלסר.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AIDL byte[] getImage(in int id)
תיאור: רישום האזנה להודעה.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
תיאור:
  • HIDL HAL: כשפותחים סשן של טיונר חדש, יש לסיים את הסשן הישן.
  • AIDL HAL: מכיוון שאין סשן של טיונר זמין, יש להגדיר רק את הקריאה החוזרת של הטיונר. אם היא קיימת, הקריאה החוזרת (callback) הישנה צריכה להיות לא מוגדרת.
HIDL 2.0 openSession(ITunerCallback callback) יוצר (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
תיאור:
  • HIDL HAL: סגירת סשן של טיונר לא יכולה להיכשל ויש לבצע אותה רק פעם אחת.
  • AIDL HAL: אין טיונר ורק צריך לבטל את ההגדרה של הקריאה החוזרת של הטיונר.
HIDL 2.0 close()
AIDL unsetTunerCallback()
תיאור: התאמה לתוכנית ספציפית.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AIDL void tune(in ProgramSelector program)
תיאור: חיפוש התוכנית החוקית הבאה air. כדי למנוע בלבול ב-AIDL, השם של scan השתנה ל-seek.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
תיאור: שלבים לערוץ הקרוב, שאולי לא להיות חלק מתוכנית כלשהי.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
תיאור: ביטול של כוונון עדין, סריקה (ב-HIDL) או דילוג (ב-AIDL) או פעולות של שלבים.
HIDL 2.0 cancel()
AIDL void cancel()
תיאור: המערכת מחילה מסנן על רשימת התוכניות מתחיל לשלוח עדכונים של רשימת התוכניות התקשרות חזרה onProgramListUpdated.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
תיאור: העדכונים על רשימת התוכניות יופסקו.
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
תיאור: אחזור ההגדרה הנוכחית של מאפיין נתון דגל config.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AIDL boolean isConfigFlagSet(in ConfigFlag flag)
Description: מגדיר את דגל config הנתון.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
Description: הגדרת ערכי פרמטרים ספציפיים לספק.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

יוצר,

(vec<VendorKeyValue> results)
AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
תיאור: מאחזר ערכי פרמטרים ספציפיים לספק.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AIDL VendorKeyValue[] getParameters(in String[] keys)

הבהרות בממשק

התנהגות אסינכרונית

מכיוון שכל פעולת כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או דילוג (ב-AIDL) וצעד, עשויים צריך להיות גוזל זמן רב ואין לחסום את ה-thread למשך זמן רב, הפעולה לתזמן פעולות שצורכות זמן רב כך שיתרחשו מאוחר יותר ויחזירו במהירות סטטוס או תוצאה. בפירוט, כל פעולה צריכה:

  • ביטול כל פעולות הכוונון שבהמתנה.
  • לבדוק אם אפשר לעבד את הפעולה בהתאם לקלט של השיטה ולסטטוס של בטיונר.
  • מתזמנים את משימת הכוונון ומחזירים את הערך Result (ב-HIDL) או status (ב-AIDL) באופן מיידי. אם הערך של Result או של status הוא OK, הקריאה החוזרת של הטיונר צריך לקרוא אל tuneFailed או currentProgramInfoChanged בזמן הכוונון נכשלה (לדוגמה, בגלל שעבר הזמן הקצוב לתפוגה) או שהיא הושלמה.

באופן דומה, startProgramListUpdates מתזמנת גם את המשימה שגוזלת זמן לעדכן את רשימת התוכניות כך שתבוצע מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. השיטה תחילה מבטל בקשות עדכון בהמתנה, ולאחר מכן מתזמנ את משימת העדכון ומחזיר במהירות תוצאה אחת.

גזע

בגלל ההתנהגות האסינכרונית של פעולות הכוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) ובשלב), יש מרוץ תהליכים בין ביטול הפעולה לבין הכוונון ב-AI. אם מתבצעת קריאה אל cancel אחרי ש-HAL משלים פעולת כוונון ולפני כשהקריאה החוזרת תסתיים, אפשר להתעלם מהביטול והקריאה החוזרת צריכה להסתיים ולקבלה. על ידי לקוח HAL.

באופן דומה, אם מתבצעת קריאה אל stopProgramListUpdates אחרי שהושלמה תוכנית HAL ולפני שהקריאה החוזרת של onCurrentProgramInfoChanged תסתיים, אפשר להתעלם מ-stopProgramListUpdates והקריאה החוזרת צריכה להסתיים.

מגבלת גודל הנתונים

מכיוון שיש מגבלה קשיחה על מאגר הנתונים הזמני של קלסר, מגבלת הנתונים בחלק מהממשק טכנולוגיית AIDL HAL מבהירה שיטות להעברת נתונים בגודל שעשוי להיות גדול.

  • כדי להשתמש בפונקציה getImage צריך להחזיר תמונה בגודל של פחות מ-1MB.
  • הפונקציה onProgramListUpdate מחייבת שכל chunk יהיה קטן מ-500kiB. צריך לפצל רשימות גדולות יותר של תוכניות על ידי הטמעת HAL למספר מקטעים ולשלוח אותם מספר קריאות חוזרות (callback).

שינויים במבני הנתונים של AIDL HAL

נוסף לשינויים בממשקים, השינויים האלה הוחלו על מבני הנתונים מוגדר ברדיו AIDL HAL שמשודר בשידור, שמנצל את ה-AIDL.

  • מסירים את הערך Constant enum ב-AIDL ומוגדר כ-int ב- IBroadcastRadio. בינתיים, השם ANTENNA_DISCONNECTED_TIMEOUT_MS השתנה אל ANTENNA_STATE_CHANGE_TIMEOUT_MS. ערך קבוע חדש TUNER_TIMEOUT_MS הוא נוסף. יש להשלים את כל פעולות הכוונון, הדילוג והצעד בפרק הזמן הזה.
  • הערכים של הטיפוס RDS ו-Deemphasis מוסרים ב-AIDL ומוגדרים כ-int. ב-AmFmRegionConfig. במקביל, גם fmDeemphasis וגם fmRds ב-ProgramInfo הוצהרו כ-int, תוצאת חישוב ביט של הדגלים המתאימים. בינתיים, השמות של D50 ושל D75 השתנו ל- DEEMPHASIS_D50 ו-DEEMPHASIS_D75, בהתאמה.
  • הערכים של הטיפוס ProgramInfoFlags מסירים ב-AIDL ומוגדרים כ-inst ב- ProgramInfo עם התחילית FLAG_ נוספה. בהתאם, infoFlags ב-ProgramInfo מוצהר כ-int, תוצאת חישוב של ביט של דגלים. גם השם TUNED השתנה ל-FLAG_TUNABLE כדי לתאר טוב יותר את ההגדרה שלו, שאפשר לכוונן את התחנה לפיה.
  • ב-AmFmBandRange, השם של scanSpacing השתנה ל- seekSpacing, כי השם של scan השתנה ל-seek ב-AIDL.
  • מכיוון שהמושג איחוד נכלל ב-AIDL, ב-MetadataKey Metadata שהוגדרו ב-HIDL HAL כבר לא בשימוש. איחוד AIDL Metadata מוגדרת ב-AIDL HAL. כל ערך enum שהיה קודם ב-MetadataKey הוא עכשיו שדה ב- Metadata מסוג מחרוזת או Int, בהתאם להגדרות שלהם.