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