מדיניות אספקת החשמל

כדי לוודא שרכיבי החומרה והתוכנה (כגון מסך, אודיו ואינטראקציה קולית) מופעלות ומושבתות באופן סלקטיבי לפי הצורך, AAOS מספקת מדיניות בנושא אספקת חשמל סט של מצבי הפעלה וכיבוי צפויים עבור רכיבי חומרה ותוכנה. VHAL, או שירותי ספק בעלי הרשאות מערכת, יכולים להחיל מדיניות אספקת חשמל חדשה כאשר מצב הטעינה של Android או כשהתנאים שהם מחכים להם מתקיימים.

החלת מדיניות חשמל מותרת במצב המתנה ל-VHAL וגם מופעל (לפעמים עם הגבלות מסוימות). במצב הכנה לכיבוי, מצב החניה פועל לא יופרע על ידי שינוי מצב הטעינה. למרות שלא ניתן להחיל מדיניות אספקת חשמל רגילה, מדיניות אספקת חשמל מיוחדת, שהיא מדיניות ההפעלה של המערכת שנקראת 'ללא אינטראקציה עם משתמש', מיושמת מתכוננים לכיבוי.

מצב הספק AAOS

מכשירי AAOS פועלים לפי התרשים הבא של מצב אספקת החשמל:

תרשים מצב ההספק של AAOS

איור 1. תרשים מצב ההספק של AAOS.

כל מצב של אספקת חשמל מתואר בהמשך:

ערך תיאור
מושבתת
  • אספקת חשמל לא מסופקת פיזית למעבד האפליקציות (AP), לזיכרון ול ציוד היקפי.
המתנה ל-VHAL
  • כשהנהג יוצר אינטראקציה עם הרכב (לדוגמה: פתיחת דלת), מתבצעת הפעלה של ה-VMCU ל-AP, לזיכרון. וציוד היקפי.
  • AAOS עובר מאחד מתוך שלושה מצבים (מושבת, השעיה ל-RAM (STR, המתנה לסיום של VHAL)) ואז נכנס אל Wait for VHAL, שממתין לתיאום עם ה-VHAL.
מצב פעיל
  • ה-VHAL מורה ל-AAOS להיכנס למצב מופעל. במצב הזה, מערכת AAOS פועלת באופן מלא באינטראקציה עם הנהג.
  • המסך נשלט על ידי מדיניות ההפעלה, ולא על ידי הפעלת/כיבוי של צג Android גורמי צורה.
הכנה לכיבוי
  • כשהנהג מפסיק לנסוע, ה-VHAL מורה ל-AAOS להיכנס להכנה לכיבוי. במצב הזה, המסך והאודיו מושבתים ו-AAOS לא מבצע אינטראקציה עם לנהגים. מערכת Android עדיין פועלת ויכולה לעדכן אפליקציות ואת מערכת Android. אחרי השלמת עדכונים (אם בכלל), מערכת Android מזינים את הערך Wait for VHAL Finish.
צריך להמתין עד ש-VHAL יסתיים
  • AAOS מודיעה ל-VHAL שאפשר להשבית אותו. יחידת המיקרו-בקר לרכב (VMCU) היא המערכת צפויה להעביר את המערכת על שבב (SoC) ל'שינה עמוקה' ולנתק את אספקת החשמל מ-AP. AAOS יהיה במצב STR, אבל לא מופעל קוד.
  • אם VHAL לא מסתיים והנהג חוזר, היחידה הראשית (HU) אמורה לעבור ישירות להמתין ל-VHAL.
השעיה ל-RAM (STR)
  • הרכב וה-AP כבויים, לא מופעל קוד, והמערכת שומרת על אספקת החשמל ל-AP RAM.
השעיה לדיסק (STD)
  • הרכב וה-AP כבויים, לא מופעל קוד, לא מתבצעת תחזוקה בחשמל ליחידת העיבוד ול-RAM של ה-AP.

איך מוגדרת מדיניות אספקת החשמל?

מיישמים מגדירים מדיניות אספקת חשמל ב-/vendor/etc/automotive/power_policy.xml, אשר:

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

מדיניות אספקת החשמל

מדיניות השימוש באספקת החשמל מורכבת מקבוצה של מצבי חשמל צפויים של רכיבי חומרה ותוכנה. AAOS תומך ברכיבים הבאים במדיניות אספקת החשמל:

אודיו
מדיה
רשת המדיה
BLUETOOTH
Wi-Fi
תאית
אתרנט
תחזית
NFC
קלט
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
מיקום
מיקרופון
מעבד (CPU)

ספקים יכולים גם להגדיר רכיבי כוח מותאמים אישית משלהם לשימוש עם מדיניות חשמל. הגדרה רכיבי כוח בהתאמה אישית באותו קובץ XML כמו מדיניות הספק, כמו בדוגמה הזו:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

קבוצת מדיניות חזקה

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

מדיניות בנושא אספקת החשמל למערכת

ב-AAOS יש תמיכה בשני כללי מדיניות של המערכת בנוגע לאספקת חשמל, שהם ללא אינטראקציה עם המשתמשים להשעות הכנה. מדיניות אספקת החשמל של המערכת חלה כאשר המכשיר נכנס 'מצב שקט', 'מצב חנייה', 'השעיה ל-RAM' או 'השעיה לדיסק'.

בטבלאות הבאות מפורטת ההתנהגות של כל רכיב במדיניות אספקת החשמל של המערכת. מטמיעי אפליקציות יכולים לבטל את הזיהוי של Bluetooth, NFC ו'מכשירים מהימנים' מדיניות אספקת החשמל של המערכת: ללא אינטראקציה עם משתמשים. השינויים חלים ב: /vendor/etc/power_policy.xml

אין אינטראקציה של משתמשים

ההתנהגות של מדיניות ההפעלה של המערכת ללא אינטראקציה עם משתמשים מוגדרת כאן טבלה:

רכיבים מצב חשמל ניתן להגדרה
אודיו מושבתת לא
מדיה מושבתת לא
מסך מושבתת לא
‫Bluetooth מושבתת כן
Wi-Fi מצב פעיל לא
רשת סלולרית מצב פעיל לא
אתרנט מצב פעיל לא
תחזית מושבתת לא
NFC מושבתת כן
קלט מושבתת לא
Assistant מושבתת לא
אינטראקציה של משתמשים מושבתת לא
זיהוי מכשירים מהימנים להתחברות של משתמשים מצב פעיל כן
מיקום מושבתת לא
מיקרופון מושבתת לא
CPU מצב פעיל לא

השעיית הכנה

ההתנהגות של מדיניות השעייה מראש של אספקת החשמל למערכת מוגדרת בטבלה הזו:

רכיבים מצב הפעלה ניתן להגדרה על ידי ה-OEM
אודיו מושבתת לא
מדיה לא רלוונטי לא
מסך לא רלוונטי לא
‫Bluetooth מושבתת לא
Wi-Fi מושבתת לא
רשת סלולרית לא רלוונטי לא
אתרנט לא רלוונטי לא
תחזית לא רלוונטי לא
NFC לא רלוונטי לא
קלט לא רלוונטי לא
Assistant לא רלוונטי לא
אינטראקציה של משתמשים לא רלוונטי לא
זיהוי מכשירים מהימנים להתחברות של משתמשים לא רלוונטי לא
מיקום מושבתת לא
מיקרופון מושבתת לא
CPU מושבתת לא

אינטראקציה עם VHAL

הדימון (daemon) של מדיניות החשמל של הרכב שרץ בשכבת המערכת רושם שני מאפיינים להאזנה בקשות מ-VHAL:

  • POWER_POLICY_REQ ה-VHAL כותב מזהה מדיניות עוצמה של נכס זה.
  • POWER_POLICY_GROUP_REQ ה-VHAL כותב את מזהה הקבוצה של מדיניות החשמל לנכס הזה.

אפשר לשנות את מדיניות אספקת החשמל הנוכחית במערכת באמצעות מודולים שאינם VHAL. במקרה הזה, הדימון (daemon) של מדיניות החשמל של הרכב מעדכן את הנכס CURRENT_POWER_POLICY כדי להודיע ל-VHAL.

אינטראקציה עם תהליכים מותאמים

כפי שצוין למעלה, הדימון (daemon) של מדיניות החשמל של הרכב פועל בשכבת המערכת, ומבחינת חשמל לניהול מדיניות, מספק כמעט את אותה פונקציונליות כמו CPMS שפועל בשכבת המסגרת. כמו כן, נניח שהדימון (daemon) של מדיניות החשמל ברכב וה-CPMS מסונכרנים באופן מלא.

הדימון (daemon) של מדיניות האנרגיה של הרכב מייצא ממשקי AIDL לשימוש של HALs ותהליכים מקוריים אחרים. הם יכולים לקבל התראה כשמדיניות אספקת חשמל חדשה משתנה. במילים אחרות, מתי כל אחד מהם צריך להשתנות את מצב האנרגיה שלו.

ICarPowerPolicyServer.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
  import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
  import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
  import android.frameworks.automotive.powerpolicy.PowerComponent;

  /**
   * ICarPowerPolicyServer is an interface implemented by the power policy daemon.
   * VHAL changes the power policy and the power policy daemon notifies the change to
   * registered subscribers. When subscribing to policy changes, a filter can be specified so
   * that the registered callbacks can listen only to a specific power component's change.
   */

  @VintfStability
  interface ICarPowerPolicyServer {
    /**
     * Gets the current power policy.
     * @throws IllegalStateException if the current policy is not set.
     */
    CarPowerPolicy getCurrentPowerPolicy();

    /**
     * Gets whether the power component is turned on or off.
     *
     * @param componentId Power component ID defined in PowerComponent.aidl to check power
     * state.
     * @return True if the component's power state is on.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    boolean getPowerComponentState(in PowerComponent componentId);

    /**
     * Subscribes to power policy change.
     * Notification is sent to the registered callback when the power policy changes and the
     * power state of the components which the callback is interested in changes.
     *
     * @param callback Callback that is invoked when the power policy changes.
     * @param filter The list of components which the callback is interested in.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
        in CarPowerPolicyFilter filter);

    /**
     * Unsubscribes from power policy change.
     *
     * @param callback Callback that doesn't want to receive power policy change.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

ICarPowerPolicyChangeCallback.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;

  /**
   * ICarPowerPolicyChangeCallback is notified when a power policy changes.
   */

  @VintfStability
  oneway interface ICarPowerPolicyChangeCallback {
    /**
     * Called when a power policy is fully changed.
     *
     * @param policy The current policy.
     */
    void onPolicyChanged(in CarPowerPolicy policy);
  }

אינטראקציה עם מודולים של Java

ב-CarPowerManager יש שיטות להפעלה של ניהול מדיניות צריכת החשמל:

  • קבלת מדיניות אספקת החשמל הנוכחית
  • החלת מדיניות אספקת חשמל חדשה
  • הגדרה של קבוצה חדשה של מדיניות חזקה

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