Android CarService关于电源管理的部分

2020-04-10  本文已影响0人  棒棒0_0

在android P的CarService中关于电源管理的流程如下:
1.VehicleService有数据变化时,会触发HalClient中的VehicleCallback的onPropertyEvent

        @Override
        public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
            mHandler.sendMessage(Message.obtain(
                    mHandler, CallbackHandler.MSG_ON_PROPERTY_EVENT, propValues));
        }

2.在HalClient的CallbackHandler中处理MSG_ON_PROPERTY_EVENT,这里的mCallback指的是VehicleHal

@Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            try {
                switch (msg.what) {
                    case MSG_ON_PROPERTY_EVENT:
                        mCallback.onPropertyEvent((ArrayList<VehiclePropValue>) msg.obj);
                        break;
                    case MSG_ON_PROPERTY_SET:
                        mCallback.onPropertySet((VehiclePropValue) msg.obj);
                        break;
                    case MSG_ON_SET_ERROR:
                        PropertySetError obj = (PropertySetError) msg.obj;
                        mCallback.onPropertySetError(obj.errorCode, obj.propId, obj.areaId);
                        break;
                    default:
                        Log.e(CarLog.TAG_HAL, "Unexpected message: " + msg.what);
                }
            } catch (RemoteException e) {
                Log.e(CarLog.TAG_HAL, "Message failed: " + msg.what);
            }
        }

3.VehicleHal中的onPropertyEvent被触发

   @Override
    public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
        synchronized (this) {
            for (VehiclePropValue v : propValues) {
                HalServiceBase service = mPropertyHandlers.get(v.prop);
                if(service == null) {
                    Log.e(CarLog.TAG_HAL, "HalService not found for prop: 0x"
                        + toHexString(v.prop));
                    continue;
                }
                service.getDispatchList().add(v);
                mServicesToDispatch.add(service);
                VehiclePropertyEventInfo info = mEventLog.get(v.prop);
                if (info == null) {
                    info = new VehiclePropertyEventInfo(v);
                    mEventLog.put(v.prop, info);
                } else {
                    info.addNewEvent(v);
                }
            }
        }
        for (HalServiceBase s : mServicesToDispatch) {
            s.handleHalEvents(s.getDispatchList());
            s.getDispatchList().clear();
        }
        mServicesToDispatch.clear();
    }

4.根据不同Value的prop属性查找那些service监听改属性的变化,然后触发不同service的handleHalEvents,比如在PowerHalService中

    @Override
    public void handleHalEvents(List<VehiclePropValue> values) {
        PowerEventListener listener;
        synchronized (this) {
            if (mListener == null) {
                if (mQueuedEvents == null) {
                    mQueuedEvents = new LinkedList<>();
                }
                mQueuedEvents.addAll(values);
                return;
            }
            listener = mListener;
        }
        dispatchEvents(values, listener);
    }

5.在handleHalEvents中调用dispatchEvents进行事件的分发

    private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
        for (VehiclePropValue v : values) {
            switch (v.prop) {
                case AP_POWER_BOOTUP_REASON:
                    int reason = v.value.int32Values.get(0);
                    Log.i(CarLog.TAG_POWER, "Received AP_POWER_BOOTUP_REASON=" + reason);
                    listener.onBootReasonReceived(reason);
                    break;
                case AP_POWER_STATE_REQ:
                    int state = v.value.int32Values.get(VehicleApPowerStateReqIndex.STATE);
                    int param = v.value.int32Values.get(VehicleApPowerStateReqIndex.ADDITIONAL);
                    Log.i(CarLog.TAG_POWER, "Received AP_POWER_STATE_REQ=" + state
                            + " param=" + param);
                    listener.onApPowerStateChange(new PowerState(state, param));
                    break;
                case DISPLAY_BRIGHTNESS:
                {
                    int maxBrightness;
                    synchronized (this) {
                        maxBrightness = mMaxDisplayBrightness;
                    }
                    int brightness = v.value.int32Values.get(0) * MAX_BRIGHTNESS / maxBrightness;
                    if (brightness < 0) {
                        Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to 0");
                        brightness = 0;
                    } else if (brightness > MAX_BRIGHTNESS) {
                        Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to "
                                + MAX_BRIGHTNESS);
                        brightness = MAX_BRIGHTNESS;
                    }
                    Log.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);
                    listener.onDisplayBrightnessChange(brightness);
                }
                    break;
            }
        }
    }

6.比如我们关注电源状态的变化,则CarPowerManagementService中onApPowerStateChange被触发

    @Override
    public void onApPowerStateChange(PowerState state) {
        PowerHandler handler;
        synchronized (this) {
            mPendingPowerStates.addFirst(state);
            handler = mHandler;
        }
        handler.handlePowerStateChange();
    }

7.在onApPowerStateChange中把数据插入到mPendingPowerStates,然后调用PowerHandler的handlePowerStateChange

    private void handlePowerStateChange() {
        Message msg = obtainMessage(MSG_POWER_STATE_CHANGE);
        sendMessage(msg);
    }

8.通过sendMessage把消息插入的Looper的MessageQueue里面,然后触发PowerHandler的handleMessage

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_POWER_STATE_CHANGE:
                    doHandlePowerStateChange();
                    break;
                case MSG_DISPLAY_BRIGHTNESS_CHANGE:
                    doHandleDisplayBrightnessChange(msg.arg1);
                    break;
                case MSG_MAIN_DISPLAY_STATE_CHANGE:
                    doHandleMainDisplayStateChange((Boolean) msg.obj);
                    break;
                case MSG_PROCESSING_COMPLETE:
                    doHandleProcessingComplete(msg.arg1 == 1);
                    break;
                case MSG_NOTIFY_POWER_ON:
                    doHandleNotifyPowerOn();
                    break;
            }
        }

9.在handleMessage中触发doHandlePowerStateChange

    private void doHandlePowerStateChange() {
        PowerState state = null;
        PowerHandler handler;
        synchronized (this) {
            state = mPendingPowerStates.peekFirst();
            mPendingPowerStates.clear();
            if (state == null) {
                return;
            }
            if (!needPowerStateChange(state)) {
                return;
            }
            // now real power change happens. Whatever was queued before should be all cancelled.
            releaseTimerLocked();
            handler = mHandler;
        }
        handler.cancelProcessingComplete();

        Log.i(CarLog.TAG_POWER, "Power state change:" + state);
        switch (state.mState) {
            case PowerHalService.STATE_ON_DISP_OFF:
                handleDisplayOff(state);
                notifyPowerOn(false);
                break;
            case PowerHalService.STATE_ON_FULL:
                handleFullOn(state);
                notifyPowerOn(true);
                break;
            case PowerHalService.STATE_SHUTDOWN_PREPARE:
                handleShutdownPrepare(state);
                break;
        }
    }

10.根据不同的电源状态,进行不同的处理,比如display off时,首先handleDisplayOff(state);保存当前电源状态信息,然后mSystemInterface.setDisplayState(false);这里mSystemInterface是com.android.car.systeminterface.SystemInterface。

    @Override
    public void setDisplayState(boolean on) {
        mDisplayInterface.setDisplayState(on);
    }

此处的mDisplayInterface是com.android.car.systeminterface.DisplayInterface

        @Override
        public void setDisplayState(boolean on) {
            synchronized (this) {
                mDisplayStateSet = on;
            }
            if (on) {
                mWakeLockInterface.switchToFullWakeLock();
                Log.i(CarLog.TAG_POWER, "on display");
                mPowerManager.wakeUp(SystemClock.uptimeMillis());
            } else {
                mWakeLockInterface.switchToPartialWakeLock();
                Log.i(CarLog.TAG_POWER, "off display");
                mPowerManager.goToSleep(SystemClock.uptimeMillis());
            }
        }

在此处调用原生的PowerService设置为wakeUp或者goToSleep

上一篇下一篇

猜你喜欢

热点阅读