simulated_radio.js revision bf40f252c66f13c51fb113c343e1728f8a86662a
114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Copyright (C) 2010 The Android Open Source Project
314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *
414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Licensed under the Apache License, Version 2.0 (the "License");
514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * you may not use this file except in compliance with the License.
614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * You may obtain a copy of the License at
714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *
814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *      http://www.apache.org/licenses/LICENSE-2.0
914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *
1014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Unless required by applicable law or agreed to in writing, software
1114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * distributed under the License is distributed on an "AS IS" BASIS,
1214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * See the License for the specific language governing permissions and
1414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * limitations under the License.
1514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
1614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
1714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
1814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * The Radio object contains a set of methods and objects to handle ril request
1914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * which is passed from simulatedRadioWorker queue. The global object initialize
2014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * an instance of Radio object by calling "new Radio". For each ril request,
2114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * rilDispatchTable gets searched and the corresponding method is called.
2214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Extra requests are also defined to process unsolicited rerequests.
2314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *
2414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * The rilDispatchTable is an array indexed by RIL_REQUEST_* or REQUEST_UNSOL_*,
2514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * in which each request corresponds to a functions defined in the Radio object.
2614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * We need to pay attention when using "this" within those functions. When they are
2714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * called in "this.process" using
2814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *               result = this.radioDispatchTable[req.reqNum])(req);
2914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * this scope of "this" within those functions are the radioDispatchTable, not the
3014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * object that "this.process" belongs to. Using "this." to access other
3114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * functions in the object may cause trouble.
3214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * To avoid that, the object is passed in when those functions are called as
3314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * shown in the following:
3414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *                 result = (this.radioDispatchTable[req.reqNum]).call(this, req);
3514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
3614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
3714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
3814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Set radio state
3914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
4014171dca025273fb64b239c1ec86ed7d4b677343Xia Wangfunction setRadioState(newState) {
4114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    newRadioState = newState;
4214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    if (typeof newState == 'string') {
4314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        newRadioState = globals[newState];
4414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (typeof newRadioState == 'undefined') {
4514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            throw('setRadioState: Unknow string: ' + newState);
4614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
4714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
4814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    if ((newRadioState < RADIOSTATE_OFF) || (newRadioState > RADIOSTATE_NV_READY)) {
4914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        throw('setRadioState: newRadioState: ' + newRadioState + ' is invalid');
5014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
5114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    gRadioState = newRadioState;
5214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED);
5314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang}
5414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
5514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
5614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Create a call.
5714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang *
5814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * @return a RilCall
5914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
6014171dca025273fb64b239c1ec86ed7d4b677343Xia Wangfunction RilCall(state, phoneNumber, callerName) {
6114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.state = state;
6214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.index = 0;
6314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.toa = 0;
6414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.isMpty = false;
6514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.isMt = false;
6614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.als = 0;
6714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.isVoice = true;
6814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.isVoicePrivacy = false;
6914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.number = phoneNumber;
7014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.numberPresentation = 0;
7114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.name = callerName;
7214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang}
7314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
7414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
7514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Simulated Radio
7614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
7714171dca025273fb64b239c1ec86ed7d4b677343Xia Wangfunction Radio() {
7814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var registrationState = '1';
7914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var lac = '0';
8014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var cid = '0';
8114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var radioTechnology = '3';
8214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var baseStationId = NULL_RESPONSE_STRING;
8314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var baseStationLatitude = NULL_RESPONSE_STRING;
8414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var baseStationLongitude = NULL_RESPONSE_STRING;
8514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var concurrentServices = NULL_RESPONSE_STRING;
8614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var systemId  = NULL_RESPONSE_STRING;
8714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var networkId = NULL_RESPONSE_STRING;
8814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var roamingIndicator = NULL_RESPONSE_STRING;
8914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var prlActive = NULL_RESPONSE_STRING;
9014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var defaultRoamingIndicator = NULL_RESPONSE_STRING;
9114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var registrationDeniedReason = NULL_RESPONSE_STRING;
9214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var primaryScrambingCode = NULL_RESPONSE_STRING;
9314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
9414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var NETWORK_SELECTION_MODE_AUTOMATIC = 0;
9514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var NETWORK_SELECTION_MODE_MANUAL = 1;
9614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var networkSelectionMode = NETWORK_SELECTION_MODE_AUTOMATIC;
9714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
9814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var muteState = 0;   // disable mute
9914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
10014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    // Number of active calls in calls
10114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var numberActiveCalls = 0;
10214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
10314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    // Maximum number of active calls
10414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var maxNumberActiveCalls = 7;
10514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var maxConnectionsPerCall = 5; // only 5 connections allowed per call
10614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
107bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    // Flag to denote whether an incoming/waiting call is answered
108bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    var incomingCallIsAnswered = false;
10914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
11014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    // Array of "active" calls
11114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var calls = Array(maxNumberActiveCalls + 1);
11214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
11314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    // The result returned by the request handlers
11414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var result = new Object();
11514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
11614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    function GWSignalStrength() {
11714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.signalStrength = 10;  // 10 * 2 + (-113) = -93dBm, make it three bars
11814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.bitErrorRate = 0;
11914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
12014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
12114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    function CDMASignalStrength() {
12214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.dbm = -1;
12314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.ecio = -1;
12414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
12514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
12614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    function EVDOSignalStrength() {
12714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.dbm = -1;
12814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.ecio = -1;
12914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.signalNoiseRatio = 0;
13014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
13114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
13214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var gwSignalStrength = new GWSignalStrength;
13314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var cdmaSignalStrength = new CDMASignalStrength();
13414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    var evdoSignalStrength = new EVDOSignalStrength();
13514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
13614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
13714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * The the array of calls, this is a sparse
13814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * array and some elements maybe 'undefined'.
13914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
14014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @return Array of RilCall's
14114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
14214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.getCalls =  function() {
14314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return calls;
14414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
14514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
14614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
14714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @return the RilCall at calls[index] or null if undefined.
14814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
14914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.getCall = function(index) {
15014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var c = null;
15114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        try {
15214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            c = calls[index];
15314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (typeof c == 'undefined') {
15414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                c = null;
15514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
15614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } catch (err) {
15714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            c = null;
15814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
15914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return c;
16014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
16114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
16214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /** Add an active call
16314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
16414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @return a RilCall or null if too many active calls.
16514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
16614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.addCall = function(state, phoneNumber, callerName) {
16714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: addCall');
16814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var c = null;
16914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (numberActiveCalls < maxNumberActiveCalls) {
17014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            numberActiveCalls += 1;
17114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            c = new RilCall(state, phoneNumber, callerName);
17214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // call index should fall in the closure of [1, 7]
17314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // Search for an "undefined" element in the array and insert the call
17414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            for (var i = 1; i < (maxNumberActiveCalls + 1); i++) {
17514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                print('Radio: addCall, i=' + i);
17614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (typeof calls[i] == 'undefined') {
17714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    print('Radio: addCall, calls[' + i + '] is undefined');
17814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    c.index = i;
17914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    calls[i] = c;
18014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    break;
18114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                }
18214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
18314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            this.printCalls(calls);
18414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
18514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return c;
18614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
18714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
18814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
18914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Remove the call, does nothing if the call is undefined.
19014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
19114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param index into calls to remove.
19214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @return the call removed or null if did not exist
19314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
19414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.removeCall =  function(index) {
19514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var c = null;
19614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if ((numberActiveCalls > 0)
19714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                 && (index < calls.length)
19814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                 && (typeof calls[index] != 'undefined')) {
19914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            c = calls[index];
20014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            delete calls[index];
20114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            numberActiveCalls -= 1;
20214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (numberActiveCalls == 0) {
20314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                calls = new Array();
20414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
20514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
20614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            c = null;
20714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
20814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return c;
20914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
21014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
21114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
21214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Print the call
21314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
21414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param c is the RilCall to print
21514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
21614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.printCall = function(c) {
21714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if ((c != null) && (typeof c != 'undefined')) {
21814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            print('c[' + c.index + ']: index=' + c.index + ' state=' + c.state +
21914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                  ' number=' + c.number + ' name=' + c.name);
22014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
22114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
22214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
22314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
22414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Print all the calls.
22514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
22614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param callArray is an Array of RilCall's
22714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
22814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.printCalls = function(callArray) {
22914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (typeof callArray == 'undefined') {
23014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            callArray = calls;
23114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
23214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('callArray.length=' + callArray.length);
23314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        for (var i = 0; i < callArray.length; i++) {
23414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if ((callArray[i] == null) || (typeof callArray[i] == 'undefined')) {
23514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                print('c[' + i + ']: undefined');
23614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } else {
23714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.printCall(callArray[i]);
23814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
23914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
24014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
24114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
24214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
24314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Print signal strength
24414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
24514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.printSignalStrength = function() {
24614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('rssi: '         + gwSignalStrength.signalStrength);
24714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('bitErrorRate: ' + gwSignalStrength.bitErrorRate);
24814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('cdmaDbm: '  +  cdmaSignalStrength.dbm);
24914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('cdmaEcio: ' + cdmaSignalStrength.ecio);
25014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('evdoRssi: ' + evdoSignalStrength.dbm);
25114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('evdoEcio: ' + evdoSignalStrength.ecio);
25214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('evdoSnr: '  + evdoSignalStrength.signalNoiseRatio);
25314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
25414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
25514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
25614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * set signal strength
25714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
25814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param rssi and bitErrorRate are signal strength parameters for GSM
25914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *        cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, evdoSnr are parameters for CDMA & EVDO
26014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
26114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.setSignalStrength = function(rssi, bitErrorRate, cdmaDbm, cdmaEcio, evdoRssi,
26214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                      evdoEcio, evdoSnr) {
26314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('setSignalStrength E');
26414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
26514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (rssi != 99) {
26614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if ((rssi < 0) || (rssi > 31)) {
26714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                throw ('not a valid signal strength');
26814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
26914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
27014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // update signal strength
27114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        gwSignalStrength.signalStrength = rssi;
27214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        gwSignalStrength.bitErrorRate = bitErrorRate;
27314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        cdmaSignalStrength.dbm = cdmaDbm;
27414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        cdmaSignalStrength.ecio = cdmaEcio;
27514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        evdoSignalStrength.dbm = evdoRssi;
27614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        evdoSignalStrength.ecio = evdoEcio;
27714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        evdoSignalStrength.signalNoiseRatio = evdoSnr;
27814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
27914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // pack the signal strength into RspSignalStrength and send a unsolicited response
28014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
28114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
28214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.gwSignalstrength = gwSignalStrength;
28314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.cdmSignalstrength = cdmaSignalStrength;
28414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.evdoSignalstrength = evdoSignalStrength;
28514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
28614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var response = rilSchema[packageNameAndSeperator +
28714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                             'RspSignalStrength'].serialize(rsp);
28814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
28914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        sendRilUnsolicitedResponse(RIL_UNSOL_SIGNAL_STRENGTH, response);
29014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
29114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // send the unsolicited signal strength every 1 minute.
29214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.addDelayed(
29314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            {'reqNum' : CMD_UNSOL_SIGNAL_STRENGTH}, 60000);
29414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('setSignalStrength X');
29514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
29614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
29714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
29814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_GET_CURRENT_CALL
29914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
30014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
30114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
30214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestGetCurrentCalls = function(req) { // 9
30314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestGetCurrentCalls E');
30414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
30514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
30614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // pack calls into rsp.calls
30714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.calls = new Array();
30814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var i;
30914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var j;
31014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        for (i = 0, j = 0; i < calls.length; i++) {
31114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (typeof calls[i] != 'undefined') {
31214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                rsp.calls[j++] = calls[i];
31314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
31414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
31514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
31614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                            'RspGetCurrentCalls'].serialize(rsp);
31714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
31814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
31914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
32014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
32114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_DIAL
32214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
32314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
32414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
32514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestDial = function(req) { // 10
32614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestDial E');
32714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var newCall = new Object();
32814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        newCall = this.addCall(CALLSTATE_DIALING, req.data.address, '');
32914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (newCall == null) {
33014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
33114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            return result;
33214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
33314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        this.printCalls(calls);
33414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
33514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('after add the call');
33614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Set call state to dialing
33714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
33814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        {'reqNum' : CMD_CALL_STATE_CHANGE,
33914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callType' : OUTGOING,
34014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callIndex' : newCall.index,
34114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'nextState' : CALLSTATE_DIALING});
34214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Update call state to alerting after 1 second
34314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang       simulatedRadioWorker.addDelayed(
34414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        {'reqNum' : CMD_CALL_STATE_CHANGE,
34514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callType' : OUTGOING,
34614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callIndex' : newCall.index,
34714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'nextState' : CALLSTATE_ALERTING}, 1000);
34814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang       // Update call state to active after 2 seconds
34914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.addDelayed(
35014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        {'reqNum' : CMD_CALL_STATE_CHANGE,
35114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callType' : OUTGOING,
35214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'callIndex': newCall.index,
35314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                         'nextState' : CALLSTATE_ACTIVE}, 2000);
35414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
35514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
35614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
35714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
35814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_HANG_UP
35914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
36014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
36114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
36214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestHangUp = function(req) { // 12
36314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestHangUp data.connection_index=' + req.data.connectionIndex);
36414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (this.removeCall(req.data.connectionIndex) == null) {
36514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
36614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            print('no connection to hangup');
36714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
36814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
36914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
37014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
37114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
37214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND
37314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *        Hang up waiting or held
37414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
37514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
37614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
37714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestHangupWaitingOrBackground = function(req) { // 13
37814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestHangupWaitingOrBackground');
37914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (numberActiveCalls <= 0) {
38014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          result.rilErrCode = RIL_E_GENERIC_FAILURE;
38114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
38214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            for (var i = 0; i < calls.length; i++) {
38314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (typeof calls[i] != 'undefined') {
38414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    switch (calls[i].state) {
38514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_HOLDING:
38614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_WAITING:
387bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        case CALLSTATE_INCOMING:
38814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            this.removeCall(i);
389bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                            incomingCallIsAnswered = true;
39014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
39114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        default:
39214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            result.rilErrCode = RIL_E_GENERIC_FAILURE;
39314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
39414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
39514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    this.printCalls(calls);
39614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if(result.rilErrCode == RIL_E_GENERIC_FAILURE) {
39714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        return result;
39814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
39914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                } // end of processing call[i]
40014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } // end of for
40114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
40214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned
40314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
40414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
40514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
40614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
40714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
40814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
40914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND
41014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *   release all active calls (if any exist) and resume held or waiting calls.
41114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
41214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
41314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestHangUpForegroundResumeBackground = function(req) { //14
41414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestHangUpForegroundResumeBackground');
41514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (numberActiveCalls <= 0) {
41614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
41714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
41814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            for (var i = 0; i < calls.length; i++) {
41914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (typeof calls[i] != 'undefined') {
42014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    switch (calls[i].state) {
42114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_ACTIVE:
42214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            this.removeCall(i);
42314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
42414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_HOLDING:
42514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_WAITING:
42614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                          calls[i].state = CALLSTATE_ACTIVE;
42714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
42814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        default:
42914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            result.rilErrCode = RIL_E_GENERIC_FAILURE;
43014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
43114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
43214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    this.printCalls(calls);
43314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if(result.rilErrCode == RIL_E_GENERIC_FAILURE) {
43414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        return result;
43514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
43614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                } // end of processing call[i]
43714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
43814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
43914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned
44014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
44114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
44214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
44314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
44414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
44514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
44614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE
44714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
44814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *     BEFORE                               AFTER
44914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Call 1   Call 2                 Call 1       Call 2
45014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * ACTIVE   HOLDING                HOLDING     ACTIVE
45114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * ACTIVE   WAITING                HOLDING     ACTIVE
45214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * HOLDING  WAITING                HOLDING     ACTIVE
45314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * ACTIVE   IDLE                   HOLDING     IDLE
45414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * IDLE     IDLE                   IDLE        IDLE
45514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
45614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
45714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
45814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestSwitchWaitingOrHoldingAndActive = function(req) {  // 15
45914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestSwitchWaitingOrHoldingAndActive');
46014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: lastReq = ' + lastReq);
46114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: req.reqNum = ' + req.reqNum);
46214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (lastReq == req.reqNum) {
46314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            print('Radio: called twice');
46414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            return result;
46514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
46614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
46714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (numberActiveCalls <= 0) {
46814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
46914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
47014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            for (var i = 0; i < calls.length; i++) {
47114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (typeof calls[i] != 'undefined') {
47214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    switch (calls[i].state) {
47314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_ACTIVE:
47414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            calls[i].state = CALLSTATE_HOLDING;
47514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
47614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_HOLDING:
47714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        case CALLSTATE_WAITING:
47814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            calls[i].state = CALLSTATE_ACTIVE;
47914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
48014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        default:
48114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            result.rilErrCode = RIL_E_GENERIC_FAILURE;
48214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            break;
48314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
48414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    this.printCalls(calls);
48514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if(result.rilErrCode == RIL_E_GENERIC_FAILURE) {
48614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        return result;
48714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
48814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                } // end of processing call[i]
48914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } // end of for
49014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
49114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned
49214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
49314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
49414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
49514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
49614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
49714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
49814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_CONFERENCE
49914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Conference holding and active
50014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
50114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
50214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
50314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestConference = function(req) {  // 16
50414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestConference E');
50514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if ((numberActiveCalls <= 0) || (numberActiveCalls > maxConnectionsPerCall)) {
50614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // The maximum number of connections within a call is 5
50714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
50814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            return result;
50914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
51014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            var numCallsInBadState = 0;
51114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            for (var i = 0; i < calls.length; i++) {
51214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (typeof calls[i] != 'undefined') {
51314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if ((calls[i].state != CALLSTATE_ACTIVE) &&
51414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            (calls[i].state != CALLSTATE_HOLDING)) {
51514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        numCallsInBadState++;
51614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
51714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                }
51814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
51914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
52014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // if there are calls not in ACITVE or HOLDING state, return error
52114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (numCallsInBadState > 0) {
52214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                result.rilErrCode = RIL_E_GENERIC_FAILURE;
52314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                return result;
52414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } else { // conference ACTIVE and HOLDING calls
52514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                for (var i = 0; i < calls.length; i++) {
52614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if (typeof calls[i] != 'undefined') {
52714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        switch (calls[i].state) {
52814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            case CALLSTATE_ACTIVE:
52914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                break;
53014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            case CALLSTATE_HOLDING:
53114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                calls[i].state = CALLSTATE_ACTIVE;
53214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                break;
53314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            default:
53414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                result.rilErrCode = RIL_E_GENERIC_FAILURE;
53514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                break;
53614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        }
53714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
53814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    this.printCalls(calls);
53914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if(result.rilErrCode == RIL_E_GENERIC_FAILURE) {
54014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        return result;
54114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
54214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                }
54314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
54414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
54514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
54614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Only if conferencing is successful,
54714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned
54814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
54914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
55014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
55114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
55214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
55314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
55414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SIGNAL_STRENGTH
55514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
55614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
55714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
55814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestSignalStrength = function(req) { // 19
55914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestSignalStrength E');
56014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
56114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
56214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // pack the signal strength into RspSignalStrength
56314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.gwSignalstrength = gwSignalStrength;
56414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.cdmaSignalstrength = cdmaSignalStrength;
56514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.evdoSignalstrength = evdoSignalStrength;
56614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
56714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
56814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                            'RspSignalStrength'].serialize(rsp);
56914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
57014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
57114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
57214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
57314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_REGISTRATION_STATE
57414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
57514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
57614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
57714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestRegistrationState = function(req) { // 20
57814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestRegistrationState');
57914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
58014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
58114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings = Array();
58214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[0] = registrationState;
58314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[1] = lac;
58414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[2] = cid;
58514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[3] = radioTechnology;
58614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[4] = baseStationId;
58714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[5] = baseStationLatitude;
58814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[6] = baseStationLongitude;
58914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[7] = concurrentServices;
59014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[8] = systemId;
59114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[9] = networkId;
59214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[10] = roamingIndicator;
59314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[11] = prlActive;
59414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[12] = defaultRoamingIndicator;
59514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[13] = registrationDeniedReason;
59614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[14] = primaryScrambingCode;
59714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
59814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
59914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                 'RspStrings'].serialize(rsp);
60014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
60114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
60214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
60314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
60414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_GPRS_REGISTRATION_STATE
60514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
60614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
60714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
60814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestGprsRegistrationState = function(req) { // 21
60914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestGprsRegistrationState');
61014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
61114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
61214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings = Array();
61314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[0] = registrationState;
61414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[1] = lac;
61514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[2] = cid;
61614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[3] = radioTechnology;
61714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
61814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
61914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                 'RspStrings'].serialize(rsp);
62014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
62114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
62214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
62314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
624bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     * Handle RIL_REQUEST_ANSWER
625bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     *
626bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     * @param req is the Request
627bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     */
628bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    this.rilRequestAnswer = function(req) { // 40
629bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        print('Radio: rilRequestAnswer');
630bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
631bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        if (numberActiveCalls != 1) {
632bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
633bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang            return result;
634bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        } else {
635bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang            for (var i = 0; i < calls.length; i++) {
636bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                if (typeof calls[i] != 'undefined') {
637bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    if (calls[i].state == CALLSTATE_INCOMING) {
638bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        calls[i].state = CALLSTATE_ACTIVE;
639bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        break;
640bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    } else {
641bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        result.rilErrCode = RIL_E_GENERIC_FAILURE;
642bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        this.removeCall(i);
643bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                        return result;
644bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    }
645bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                } // end of processing call[i]
646bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang            } // end of for
647bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        }
648bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        incomingCallIsAnswered = true;
649bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang        return result;
650bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    }
651bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
652bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    /**
65314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE
65414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
65514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
65614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
65714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestQueryNeworkSelectionMode = function(req) { // 45
65814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestQueryNeworkSelectionMode');
65914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
66014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
66114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.integers = Array();
66214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.integers[0] = networkSelectionMode;
66314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
66414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
66514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                 'RspIntegers'].serialize(rsp);
66614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
66714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
66814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
66914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
67014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC
67114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
67214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
67314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
67414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestSetNeworkSelectionAutomatic = function(req) { // 46
67514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestSetNeworkSelectionAutomatic');
67614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
67714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        networkSelectionMode = NETWORK_SELECTION_MODE_AUTOMATIC;
67814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
67914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
68014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
68114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
68214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
68314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_BASE_BAND_VERSION
68414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
68514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
68614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
68714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestBaseBandVersion = function(req) { // 51
68814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestBaseBandVersion');
68914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var rsp = new Object();
69014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings = Array();
69114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        rsp.strings[0] = gBaseBandVersion;
69214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
69314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        result.responseProtobuf = rilSchema[packageNameAndSeperator +
69414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                 'RspStrings'].serialize(rsp);
69514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
69614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
69714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
69814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
69914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SEPRATE_CONNECTION
70014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Separate a party from a multiparty call placing the multiparty call
70114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * (less the specified party) on hold and leaving the specified party
70214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * as the only other member of the current (active) call
70314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
70414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * See TS 22.084 1.3.8.2 (iii)
70514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
70614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
70714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
70814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilReqestSeparateConnection = function(req) {  // 52
70914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilReqestSeparateConnection');
71014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        var index = req.data.index;
71114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
71214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (numberActiveCalls <= 0) {
71314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_GENERIC_FAILURE;
71414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            return result;
71514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } else {
71614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // get the connection to separate
71714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            var separateConn = this.getCall(req.data.index);
71814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (separateConn == null) {
71914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                result.rilErrCode = RIL_E_GENERIC_FAILURE;
72014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                return result;
72114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } else {
72214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                if (separateConn.state != CALLSTATE_ACTIVE) {
72314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    result.rilErrCode = RIL_E_GENERIC_FAILURE;
72414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    return result;
72514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                }
72614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                // Put all other connections in hold.
72714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                for (var i = 0; i < calls.length; i++) {
72814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    if (index != i) {
72914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        // put all the active call to hold
73014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        if (typeof calls[i] != 'undefined') {
73114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            switch (calls[i].state) {
73214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                case CALLSTATE_ACTIVE:
73314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                    calls[i].state = CALLSTATE_HOLDING;
73414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                    break;
73514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                default:
73614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                    result.rilErrCode = RIL_E_GENERIC_FAILURE;
73714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                    break;
73814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            }
73914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            this.printCalls(calls);
74014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            if(result.rilErrCode == RIL_E_GENERIC_FAILURE) {
74114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                                return result;
74214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                            }
74314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                        }  // end of processing call[i]
74414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    }
74514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                }  // end of for
74614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
74714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
74814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
74914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned
75014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        simulatedRadioWorker.add(
75114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang          {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
75214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
75314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
75414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
75514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
75614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SET_MUTE
75714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
75814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestSetMute = function(req) { // 53
75914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestSetMute: req.data.state=' + req.data.state);
76014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        muteState = req.data.state;
76114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        if (gRadioState == RADIOSTATE_UNAVAILABLE) {
76214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_RADIO_NOT_AVAILABLE;
76314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
76414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
76514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
76614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
76714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
76814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Handle RIL_REQUEST_SCREEN_STATE
76914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     *
77014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * @param req is the Request
77114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
77214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.rilRequestScreenState = function(req) { // 61
77314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        print('Radio: rilRequestScreenState: req.data.state=' + req.data.state);
77414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        screenState = req.data.state;
77514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        return result;
77614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
77714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
77814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
77914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Delay test
78014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
78114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     this.cmdDelayTest = function(req) { // 2000
78214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdDelayTest: req.hello=' + req.hello);
78314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         result.sendResponse = false;
78414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         return result;
78514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     }
78614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
78714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     /**
78814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * Delay for RIL_UNSOL_SIGNAL_STRENGTH
78914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * TODO: Simulate signal strength changes:
79014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * Method 1: provide an array for signal strength, and send the unsolicited
79114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      *           reponse periodically (the period can also be simulated)
79214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * Method 2: Simulate signal strength randomly (within a certain range) and
79314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      *           send the response periodically.
79414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      */
79514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     this.cmdUnsolSignalStrength = function(req) { // 2001
79614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdUnsolSignalStrength: req.reqNum=' + req.reqNum);
79714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         var rsp = new Object();
79814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
79914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // pack the signal strength into RspSignalStrength
80014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         rsp.gwSignalstrength = gwSignalStrength;
80114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         rsp.cdmaSignalstrength = cdmaSignalStrength;
80214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         rsp.evdoSignalstrength = evdoSignalStrength;
80314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
80414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         response = rilSchema[packageNameAndSeperator +
80514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                              'RspSignalStrength'].serialize(rsp);
80614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
80714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // upldate signal strength
80814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         sendRilUnsolicitedResponse(RIL_UNSOL_SIGNAL_STRENGTH, response);
80914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
81014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // Send the unsolicited signal strength every 1 minute.
81114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         simulatedRadioWorker.addDelayed(
81214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang             {'reqNum' : CMD_UNSOL_SIGNAL_STRENGTH}, 60000);
81314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
81414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // this is not a request, no response is needed
81514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         result.sendResponse = false;
81614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         return result;
81714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     }
81814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
81914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     /**
82014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * Send RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
82114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      */
82214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     this.cmdUnsolCallStateChanged = function(req) { // 2002
82314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdUnsolCallStateChanged: req.reqNum=' + req.reqNum);
82414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED);
82514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         result.sendResponse = false;
82614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         return result;
82714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     }
82814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
82914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     /**
83014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      * Simulate call state change
83114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang      */
83214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     this.cmdCallStateChange = function(req) { // 2003
83314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdCallStateChange: req.reqNum=' + req.reqNum);
83414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdCallStateChange: req.callType=' + req.callType);
83514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdCallStateChange: req.callIndex=' + req.callIndex);
83614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         print('cmdCallStateChange: req.nextState=' + req.nextState);
83714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
83814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // if it is an outgoing call, update the call state of the call
83914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // Send out call state changed flag
84014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         var curCall = this.getCall(req.callIndex);
84114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         this.printCall(curCall);
84214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
84314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         if (curCall != null) {
84414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang             curCall.state = req.nextState;
84514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         } else {
84614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang             this.removeCall(req.callIndex);
84714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         }
84814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
84914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // TODO: if it is an incoming call, update the call state of the call
85014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // Send out call state change flag
85114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         // Send out RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
85214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         simulatedRadioWorker.add(
85314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang           {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED});
85414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         result.sendResponse = false;
85514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang         return result;
85614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     }
857bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
858bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     /**
859bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      * send UNSOL_CALL_STATE_CHANGED and UNSOL_CALL_RING
860bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      */
861bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     this.cmdUnsolCallRing = function(req) { // 2004
862bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         print('cmdUnsolCallRing: req.reqNum=' + req.reqNum);
863bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED);
864bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         sendRilUnsolicitedResponse(RIL_UNSOL_CALL_RING);
865bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
866bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         // Send the next alert in 3 seconds. [refer to ril.h definition]
867bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         simulatedRadioWorker.addDelayed(
868bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             {'reqNum' : CMD_UNSOL_CALL_RING}, 3000);
869bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         result.sendResponse = false;
870bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         return result;
871bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     }
872bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
873bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     /**
874bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      * Create an incoming call for the giving number
875bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      * return CTRL_STATUS_ERR if there is already a call in any of the states of
876bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      * dialing, alerting, incoming, waiting [TS 22 030 6.5] , else
877bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      * return CTRL_STATUS_OK and update the call state
878bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang      */
879bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     this.ctrlServerCmdStartInComingCall = function(req) {  // 1001
880bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         print('ctrlServerCmdStartInComingCall: req.reqNum:' + req.reqNum);
881bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         print('ctrlServerCmdStartInComingCall: req.data.phonenumber:' + req.data.phoneNumber);
882bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
883bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         var phoneNumber = req.data.phoneNumber;
884bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         var state;
885bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
886bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         if (numberActiveCalls <= 0) {
887bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             // If there is no connection in use, the call state is INCOMING
888bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             state = CALLSTATE_INCOMING;
889bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         } else {
890bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             // If there is call in any of the states of dialing, alerting, incoming
891bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             // waiting, this MT call can not be set
892bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             for (var i  = 0; i < calls.length; i++) {
893bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                 if (typeof calls[i] != 'undefined') {
894bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                     if ( (calls[i].state == CALLSTATE_DIALING) ||
895bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                          (calls[i].state == CALLSTATE_ALERTING) ||
896bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                          (calls[i].state == CALLSTATE_INCOMING) ||
897bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                          (calls[i].state == CALLSTATE_WAITING))
898bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                     {
899bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                         result.rilErrCode = CTRL_STATUS_ERR;
900bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                         return result;
901bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                     }
902bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                 }
903bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             }
904bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             // If the incoming call is a second call, the state is WAITING
905bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang             state = CALLSTATE_WAITING;
906bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         }
907bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
908bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         // Add call to the call array
909bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         this.addCall(state, phoneNumber, '');
910bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
911bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         // set the incomingCallIsAnswered flag to be false
912bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         incomingCallIsAnswered = false;
913bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
914bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         simulatedRadioWorker.add(
915bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang           {'reqNum' : CMD_UNSOL_CALL_RING});
916bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
917bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         result.rilErrCode = CTRL_STATUS_OK;
918bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang         return result;
919bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang     }
920bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
92114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
92214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Process the request by dispatching to the request handlers
92314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
92414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.process = function(req) {
92514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        try {
92614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            //print('Radio E: req.reqNum=' + req.reqNum + ' req.token=' + req.token);
92714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
92814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            // Assume the result will be true, successful and nothing to return
92914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.sendResponse = true;
93014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.rilErrCode = RIL_E_SUCCESS;
93114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            result.responseProtobuf = emptyProtobuf;
93214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
93314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            try {
93414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                // Pass "this" object to each ril request call such that
93514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                // they have the same scope
936bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                if ((req.reqNum == CMD_UNSOL_CALL_RING) && incomingCallIsAnswered) {
937bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    print('no need to send UNSOL_CALL_RING');
938bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                } else {
939bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    result = (this.radioDispatchTable[req.reqNum]).call(this, req);
940bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                }
94114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            } catch (err) {
94214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                print('Radio:process err = ' + err);
94314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                print('Radio: Unknown reqNum=' + req.reqNum);
94414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                result.rilErrCode = RIL_E_REQUEST_NOT_SUPPORTED;
94514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
94614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
94714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (req.reqNum < 200) {
94814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                lastReq = req.reqNum;
94914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
95014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            if (result.sendResponse) {
951bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                if (isCtrlServerDispatchCommand(req.reqNum)) {
952bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    print('Command ' + req.reqNum + ' is a control server command');
953bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    sendCtrlRequestComplete(result.rilErrCode, req.reqNum,
954bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                      req.token, result.responseProtobuf);
955bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                } else {
956bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    print('Request ' + req.reqNum + ' is a ril request');
957bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                    sendRilRequestComplete(result.rilErrCode, req.reqNum,
958bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                      req.token, result.responseProtobuf);
959bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                }
96014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            }
96114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            //print('Radio X: req.reqNum=' + req.reqNum + ' req.token=' + req.token);
96214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        } catch (err) {
96314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang            print('Radio: Exception req.reqNum=' +
96414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                    req.reqNum + ' req.token=' + req.token + ' err=' + err);
96514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang        }
96614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    }
96714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
96814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    /**
96914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     * Construct the simulated radio
97014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang     */
97114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    print('Radio: constructor E');
97214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable = new Array();
97314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_GET_CURRENT_CALLS] = // 9
97414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestGetCurrentCalls;
97514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_DIAL] = // 10
97614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestDial;
97714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_HANGUP] =  // 12
97814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestHangUp;
97914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = // 13
98014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestHangupWaitingOrBackground;
98114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] =  // 14
98214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestHangUpForegroundResumeBackground;
98314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] =  // 15
98414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestSwitchWaitingOrHoldingAndActive;
98514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_CONFERENCE] = // 16
98614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestConference;
98714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SIGNAL_STRENGTH] = // 19
98814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestSignalStrength;
98914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_REGISTRATION_STATE] = // 20
99014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestRegistrationState;
99114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_GPRS_REGISTRATION_STATE] = // 21
99214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestGprsRegistrationState;
993bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    this.radioDispatchTable[RIL_REQUEST_ANSWER] = // 40
994bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                this.rilRequestAnswer;
99514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = // 45
99614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestQueryNeworkSelectionMode;
99714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = // 46
99814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestSetNeworkSelectionAutomatic;
99914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_BASEBAND_VERSION] = // 51
100014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestBaseBandVersion;
100114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SEPARATE_CONNECTION] = // 52
100214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilReqestSeparateConnection;
100314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SET_MUTE] = // 53
100414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestSetMute;
100514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[RIL_REQUEST_SCREEN_STATE] = // 61
100614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.rilRequestScreenState;
100714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
1008bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    this.radioDispatchTable[CTRL_CMD_SET_MT_CALL] = //1001
1009bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                this.ctrlServerCmdStartInComingCall;
1010bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
101114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[CMD_DELAY_TEST] = // 2000
101214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.cmdDelayTest;
101314171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[CMD_UNSOL_SIGNAL_STRENGTH] =  // 2001
101414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.cmdUnsolSignalStrength;
101514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[CMD_UNSOL_CALL_STATE_CHANGED] =  // 2002
101614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.cmdUnsolCallStateChanged;
101714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    this.radioDispatchTable[CMD_CALL_STATE_CHANGE] = //2003
101814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang                this.cmdCallStateChange;
1019bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    this.radioDispatchTable[CMD_UNSOL_CALL_RING] = //2004
1020bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                this.cmdUnsolCallRing;
1021bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang
1022bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang    this.radioDispatchTable[CTRL_CMD_SET_MT_CALL] = //1001
1023bf40f252c66f13c51fb113c343e1728f8a86662aXia Wang                this.ctrlServerCmdStartInComingCall;
102414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
102514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    print('Radio: constructor X');
102614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang}
102714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
102814171dca025273fb64b239c1ec86ed7d4b677343Xia Wang// The simulated radio instance and its associated Worker
102914171dca025273fb64b239c1ec86ed7d4b677343Xia Wangvar simulatedRadio = new Radio();
103014171dca025273fb64b239c1ec86ed7d4b677343Xia Wangvar simulatedRadioWorker = new Worker(function (req) {
103114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    simulatedRadio.process(req);
103214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang});
103314171dca025273fb64b239c1ec86ed7d4b677343Xia WangsimulatedRadioWorker.run();
103414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
103514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang// TODO: this is a workaround for bug http://b/issue?id=3001613
103614171dca025273fb64b239c1ec86ed7d4b677343Xia Wang// When adding a new all, two RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE
103714171dca025273fb64b239c1ec86ed7d4b677343Xia Wang// will be sent from the framework.
103814171dca025273fb64b239c1ec86ed7d4b677343Xia Wangvar lastReq = 0;
103914171dca025273fb64b239c1ec86ed7d4b677343Xia Wang
104014171dca025273fb64b239c1ec86ed7d4b677343Xia Wang/**
104114171dca025273fb64b239c1ec86ed7d4b677343Xia Wang * Optional tests
104214171dca025273fb64b239c1ec86ed7d4b677343Xia Wang */
104314171dca025273fb64b239c1ec86ed7d4b677343Xia Wangif (false) {
104414171dca025273fb64b239c1ec86ed7d4b677343Xia Wang    include("simulated_radio_tests.js");
104514171dca025273fb64b239c1ec86ed7d4b677343Xia Wang}
1046