您的位置:首页 > 编程语言 > Java开发

关于ServiceStateTracker.java中setPowerStateToDesired函数的疑问

2010-05-29 15:34 267 查看
   该函数在关闭radio或者说打开飞行模式的时候,会调用到。。原来源代码,如下。

   @Override

    protected void setPowerStateToDesired() {

        // If we want it on and it's off, turn it on

        if (mDesiredPowerState

            && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {

            cm.setRadioPower(true, null);

        } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
            DataConnectionTracker dcTracker = phone.mDataConnection;

            if (! dcTracker.isDataConnectionAsDesired()) {

                EventLog.List val = new EventLog.List(

                        dcTracker.getStateInString(),

                        (dcTracker.getAnyDataEnabled() ? 1 : 0) );

                EventLog.writeEvent(TelephonyEventLog.EVENT_LOG_DATA_STATE_RADIO_OFF, val);

            }

            Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);

            msg.arg1 = 1; // tearDown is true

            msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;

            dcTracker.sendMessage(msg);

            // Poll data state up to 15 times, with a 100ms delay

            // totaling 1.5 sec. Normal data disable action will finish in 100ms.

            for (int i = 0; i < MAX_NUM_DATA_STATE_READS; i++) {

                DataConnectionTracker.State currentState = dcTracker.getState();

                if (currentState != DataConnectionTracker.State.CONNECTED

                        && currentState != DataConnectionTracker.State.DISCONNECTING) {

                    if (DBG) log("Data shutdown complete.");

                    break;

                }

                SystemClock.sleep(DATA_STATE_POLL_SLEEP_MS);

            }

            // If it's on and available and we want it off..

            cm.setRadioPower(false, null);

        } // Otherwise, we're in the desired state

    }

 

   在项目实际过程中,发现红色部分是有问题的。GSM模块没有发现问题,在CDMA中出现了问题。

   在高通6085模块中,每当PPP拨号时,我们去打开飞行模式,发送AT+CFUN=0时,返回+CME ERROR:36。

   其实,该函数的原意是很明确的,即当数据通道Connection的时候,我们需要先断开数据连接,然后才radio power off。

            /*Send message to clean up connection*/

            Message msg = dcTracker.obtainMessage(DataConnectionTracker.EVENT_CLEAN_UP_CONNECTION);

            msg.arg1 = 1; // tearDown is true

            msg.obj = CDMAPhone.REASON_RADIO_TURNED_OFF;

            dcTracker.sendMessage(msg);

但是按照源代码,这个clean up connection操作根本就不可能有时间执行。

后面这段代码的废的。。也就是根本就没有

clean up connection,就直接

cm.setRadioPower(false, null)了。

导致
发送AT+CFUN=0时,返回+CME ERROR:36。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  up null delay action