diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c index e0294eee6bdd42d2c8ade43e79c0792cfad324bc..f4b7e5400ef29e00a09121dde5232b1ea06e950c 100644 --- a/fm_hci/fm_hci.c +++ b/fm_hci/fm_hci.c @@ -478,7 +478,7 @@ err: return -1; } -void enqueue_fm_tx_cmd(FM_HDR *pbuf) +int enqueue_fm_tx_cmd(FM_HDR *pbuf) { pthread_mutex_lock(&fmHCIControlBlock.tx_q_lock); @@ -486,36 +486,40 @@ void enqueue_fm_tx_cmd(FM_HDR *pbuf) if (!fmHCIControlBlock.first) { fmHCIControlBlock.first = (TX_Q *) malloc(sizeof(TX_Q)); if (!fmHCIControlBlock.first) { - printf("Failed to allocate memory for first!!\n"); + ALOGI("Failed to allocate memory for first!!\n"); pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock); - return; + return FM_HC_STATUS_NOMEM; } fmHCIControlBlock.first->hdr = pbuf; fmHCIControlBlock.first->next = NULL; fmHCIControlBlock.last = fmHCIControlBlock.first; - ALOGI("%s: FM-CMD ENQUEUED SUCCESSFULLY", __func__); + ALOGI("%s: FM-CMD ENQUEUED SUCCESSFULLY", __func__); } else { TX_Q *element = (TX_Q *) malloc(sizeof(TX_Q)); if (!element) { - printf("Failed to allocate memory for element!!\n"); + ALOGI("Failed to allocate memory for element!!\n"); pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock); - return; + return FM_HC_STATUS_NOMEM; } fmHCIControlBlock.last->next = element; element->hdr = pbuf; element->next = NULL; fmHCIControlBlock.last = element; - ALOGI("%s: fm-cmd enqueued successfully", __func__); + ALOGI("%s: fm-cmd enqueued successfully", __func__); } pthread_mutex_unlock(&fmHCIControlBlock.tx_q_lock); + return FM_HC_STATUS_SUCCESS; } /** Transmit frame */ -void transmit(FM_HDR *pbuf) +int transmit(FM_HDR *pbuf) { - enqueue_fm_tx_cmd(pbuf); - event_notification(HC_EVENT_TX); + int status = FM_HC_STATUS_FAIL; + + if ((status = enqueue_fm_tx_cmd(pbuf)) == FM_HC_STATUS_SUCCESS) + event_notification(HC_EVENT_TX); + return status; } void userial_close_reader(void) { diff --git a/fm_hci/fm_hci.h b/fm_hci/fm_hci.h index 8ffbf04732b1bbeae7916aade6e3594fbd719119..2d5e4a157c1e90ea20b12d2e16596ce4f6466494 100644 --- a/fm_hci/fm_hci.h +++ b/fm_hci/fm_hci.h @@ -45,8 +45,8 @@ typedef enum { } fm_hc_status_t; typedef enum { - FM_RADIO_DISABLE, - FM_RADIO_ENABLE + FM_RADIO_DISABLE, + FM_RADIO_ENABLE }fm_power_state; /* Host/Controller lib internal event ID */ @@ -94,11 +94,11 @@ typedef struct { typedef struct hdr { - FM_HDR *hdr; - struct hdr *next; + FM_HDR *hdr; + struct hdr *next; } TX_Q; -void transmit(FM_HDR *pbuf); +int transmit(FM_HDR *pbuf); int fm_hci_init(fm_hal_cb *); void fm_power(fm_power_state state); int open_serial_port(void); diff --git a/fmapp2/res/values/arrays.xml b/fmapp2/res/values/arrays.xml index 16b48e42d5026939024bf85e194dad4dc84f0675..ad30a859da2e6df99805b50ff1e674366bd8265c 100644 --- a/fmapp2/res/values/arrays.xml +++ b/fmapp2/res/values/arrays.xml @@ -392,6 +392,36 @@ <item> RF Statistics</item> </string-array> + <string-array name="cfg_rf4"> + <item> Select Option</item> + <item> Set SINR Samples Count</item> + <item> Set SINR Threshold</item> + <item> Set IntfDetoutLow Threshold</item> + <item> Set IntfDetoutHigh Threshold</item> + <item> Set SinrFirstStage</item> + <item> Set RmssiFirstStage</item> + <item> Set CF0Th12</item> + <item> Set SearchAlgo Type</item> + <item> Get SINR Samples Count</item> + <item> Get SINR Threshold</item> + <item> Get SinrFirstStage</item> + <item> Get RmssiFirstStage</item> + <item> Get CF0Th12</item> + <item> Get Search Algo Type</item> + <item> Set AfJmpRmssi Threshold</item> + <item> Set GoodChRmssi Threshold</item> + <item> Set AfJmpRmssi Samples count</item> + <item> Get AfJmpRmssi Threshold</item> + <item> Get GoodChRmssi Threshold</item> + <item> Get AfJmpRmssi Samples count</item> + <item> Set RXREPEAT Count</item> + <item> Set Sig Blend SinrHi</item> + <item> Get Sig Blend SinrHi</item> + <item> Set Sig Blend RmssiHi</item> + <item> Get Sig Blend RmssiHi</item> + <item> RF Statistics</item> + </string-array> + <string-array name="stats_options"> <item> Select the option</item> <item> Configure Performance parameters</item> diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java index ee8ef3d5037407a5e6b4ef84280eaccea5eb55a2..f83a0d0a2e99018bea111f96b4b06cb513b75ca1 100644 --- a/fmapp2/src/com/caf/fmradio/FMRadio.java +++ b/fmapp2/src/com/caf/fmradio/FMRadio.java @@ -2118,7 +2118,7 @@ public class FMRadio extends Activity display = station.getName(); if (display.length() > 6) display = display.substring(0,6)+"..."; - mPresetButtons[buttonIndex].setEllipsize(TextUtils.TruncateAt.END); + mPresetButtons[buttonIndex].setEllipsize(TextUtils.TruncateAt.END); mPresetButtons[buttonIndex].setText(display); mPresetButtons[buttonIndex].setTag(station); addedStations++; @@ -2753,7 +2753,7 @@ public class FMRadio extends Activity mRadioTextTV.setText(""); mRadioTextScroller.mOriginalString = ""; }else { - //Log.d(LOGTAG, "mUpdateRadioText: Leaving old string " + mRadioTextTV.getText()); + Log.v(LOGTAG, "mUpdateRadioText: Leaving old string " + mRadioTextTV.getText()); } /* Get PTY and PI and update the display */ @@ -3225,6 +3225,40 @@ public class FMRadio extends Activity mSpeakerButton.setClickable(false); mMuteButton.setClickable(false); } + /* Not used in FmRadio */ + public void getSigThCb(int val, int status) { + Log.d(LOGTAG,"get Sig Thres callback"); + } + public void getChDetThCb(int val, int status) { + Log.d(LOGTAG, "get Channel Det Threshold Callback"); + } + public void setChDetThCb(int status) + { + Log.d(LOGTAG, "set channel Det Threshold Callback"); + } + public void DefDataRdCb(int val, int status) { + Log.d(LOGTAG, "Def data Read callback"); + } + public void DefDataWrtCb(int status) + { + Log.d(LOGTAG, "DefDataWrt"); + } + public void getBlendCb(int val, int status) + { + Log.d(LOGTAG, "get blend callback"); + } + public void setBlendCb(int status) + { + Log.d(LOGTAG, "set blend callback"); + } + public void getStationParamCb(int val, int status) + { + Log.d(LOGTAG, "getStationParam"); + } + public void getStationDbgParamCb(int val, int status) + { + Log.d(LOGTAG, "getStationDbgParam"); + } }; private void registerFMSettingListner() { diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java index f4b24fb7f9846506405b4d2214ebaa05b7fac4fb..b238e538c3372b0a562efd542d72626fe04b0bc4 100644 --- a/fmapp2/src/com/caf/fmradio/FMRadioService.java +++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java @@ -1952,10 +1952,18 @@ public class FMRadioService extends Service { return (mService.get().setIntfDetLowTh(intfLowTh)); } + public boolean getIntfDetLowTh() + { + return (mService.get().getIntfDetLowTh()); + } public boolean setIntfDetHighTh(int intfHighTh) { return (mService.get().setIntfDetHighTh(intfHighTh)); } + public boolean getIntfDetHighTh() + { + return (mService.get().getIntfDetHighTh()); + } public int getSearchAlgoType() { return (mService.get().getSearchAlgoType()); @@ -2024,6 +2032,10 @@ public class FMRadioService extends Service { return (mService.get().setRxRepeatCount(count)); } + public boolean getRxRepeatCount() + { + return (mService.get().getRxRepeatCount()); + } public long getRecordingStartTime() { return (mService.get().getRecordingStartTime()); @@ -3151,10 +3163,113 @@ public class FMRadioService extends Service Log.d(LOGTAG, "FmRxEvServiceAvailable: Tuned frequency is below signal threshold level"); } } - public void FmRxEvGetSignalThreshold() + public void FmRxEvGetSignalThreshold(int val, int status) { Log.d(LOGTAG, "FmRxEvGetSignalThreshold"); + + if (mCallbacks != null) { + try { + mCallbacks.getSigThCb(val, status); + } catch (RemoteException e) { + Log.e(LOGTAG, "FmRxEvGetSignalThreshold: Exception:" + e.toString()); + } + } + } + + public void FmRxEvGetChDetThreshold(int val, int status) + { + Log.e(LOGTAG, "FmRxEvGetChDetThreshold"); + if (mCallbacks != null) { + try { + mCallbacks.getChDetThCb(val, status); + } catch (RemoteException e) { + Log.e(LOGTAG, "FmRxEvGetChDetThreshold: Exception = " + e.toString()); + } + } + } + + public void FmRxEvSetChDetThreshold(int status) + { + Log.e(LOGTAG, "FmRxEvSetChDetThreshold"); + if (mCallbacks != null) { + try { + mCallbacks.setChDetThCb(status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void FmRxEvDefDataRead(int val, int status) { + Log.e(LOGTAG, "FmRxEvDefDataRead"); + if (mCallbacks != null) { + try { + mCallbacks.DefDataRdCb(val, status); + } catch (RemoteException e) { + Log.e(LOGTAG, "FmRxEvDefDataRead: Exception = " + e.toString()); + } + } + } + + public void FmRxEvDefDataWrite(int status) + { + Log.e(LOGTAG, "FmRxEvDefDataWrite"); + if (mCallbacks != null) { + try { + mCallbacks.DefDataWrtCb(status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void FmRxEvGetBlend(int val, int status) + { + Log.e(LOGTAG, "FmRxEvGetBlend"); + + if (mCallbacks != null) { + try { + mCallbacks.getBlendCb(val, status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void FmRxEvSetBlend(int status) + { + Log.e(LOGTAG, "FmRxEvSetBlend"); + if (mCallbacks != null) { + try { + mCallbacks.setBlendCb(status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void FmRxGetStationParam(int val, int status) + { + if (mCallbacks != null) { + try { + mCallbacks.getStationParamCb(val, status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public void FmRxGetStationDbgParam(int val, int status) + { + if (mCallbacks != null) { + try { + mCallbacks.getStationDbgParamCb(val, status); + } catch (RemoteException e) { + e.printStackTrace(); + } + } } + public void FmRxEvSearchInProgress() { Log.d(LOGTAG, "FmRxEvSearchInProgress"); @@ -3402,12 +3517,26 @@ public class FMRadioService extends Service else return false; } + public boolean getIntfDetLowTh() + { + if (mReceiver != null) + return mReceiver.getOnChannelThreshold(); + else + return false; + } public boolean setIntfDetHighTh(int intfHighTh) { if(mReceiver != null) return mReceiver.setOffChannelThreshold(intfHighTh); else return false; } + public boolean getIntfDetHighTh() + { + if (mReceiver != null) + return mReceiver.getOffChannelThreshold(); + else + return false; + } public int getSearchAlgoType() { if(mReceiver != null) return mReceiver.getSearchAlgoType(); @@ -3556,7 +3685,12 @@ public class FMRadioService extends Service else return false; } - + public boolean getRxRepeatCount() { + if(mReceiver != null) + return mReceiver.getPSRxRepeatCount(); + else + return false; + } public long getRecordingStartTime() { return mSampleStart; } diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java index 75ba4c686f9f13e810f00c9667e0c1833297e461..1c506c4a5047e9e75146f2b097c596aa6687cb5f 100644 --- a/fmapp2/src/com/caf/fmradio/FMStats.java +++ b/fmapp2/src/com/caf/fmradio/FMStats.java @@ -59,6 +59,8 @@ import android.app.AlertDialog; import android.app.Dialog; import android.view.LayoutInflater; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.app.AlarmManager; @@ -173,6 +175,7 @@ public class FMStats extends Activity { CfgRfItemSelectedListener1 mSpinCfgRfListener1 = null; CfgRfItemSelectedListener2 mSpinCfgRfListener2 = null; CfgRfItemSelectedListener3 mSpinCfgRfListener3 = null; + CfgRfItemSelectedListener4 mSpinCfgRfListener4 = null; BandSweepMthdsSelectedListener mSweepMthdsListener = new BandSweepMthdsSelectedListener(); @@ -210,6 +213,27 @@ public class FMStats extends Activity { ArrayAdapter<CharSequence> bandSweepMthds; private static boolean mIsTransportSMD = false; + private static boolean setCmdSent = false; + private static int lastCmdSent = 0; + private final int CMD_CHDET_SINR_TH = 1; + private final int CMD_CHDET_SINR_SAMPLE = 2; + private final int CMD_CHDET_INTF_TH_LOW = 3; + private final int CMD_CHDET_INTF_TH_HIGH = 4; + private final int CMD_DEFRD_AF_RMSSI_TH = 5; + private final int CMD_DEFRD_AF_RMSSI_SAMPLE = 6; + private final int CMD_DEFRD_GD_CH_RMSSI_TH = 7; + private final int CMD_DEFRD_SEARCH_ALGO = 8; + private final int CMD_DEFRD_SINR_FIRST_STAGE = 9; + private final int CMD_DEFRD_RMSSI_FIRST_STAGE = 10; + private final int CMD_DEFRD_CF0TH12 = 11; + private final int CMD_DEFRD_TUNE_POWER = 12; + private final int CMD_DEFRD_REPEATCOUNT = 13; + private final int CMD_BLENDTBL_SINR_HI = 14; + private final int CMD_BLENDTBL_RMSSI_HI = 15; + private final int CMD_STNPARAM_SINR = 16; + private final int CMD_STNPARAM_RSSI = 17; + private final int CMD_STNDBGPARAM_IOVERC = 18; + private final int CMD_STNDBGPARAM_INFDETOUT = 19; private static final int MPX_DCC = 0; private static final int SINR_INTF = 1; @@ -247,8 +271,11 @@ public class FMStats extends Activity { private int prevSweepMthd = 0; //Manual (using band min, max) private int curSweepMthd = 0; + private int textBoxVal = 0; + private int algo_type = -1; private Thread mRecordUpdateHandlerThread = null; + private Thread mRunTestThread = null; boolean mRecording = false; @@ -268,6 +295,21 @@ public class FMStats extends Activity { private GetNextFreqInterface mNextFreqInterface; private CommaSeparatedFreqFileReader mFreqFileReader; + private final int SIGNAL_THRESHOLD = 1; + private final int GET_CHANNEL_DET_THRESHOLD = 2; + private final int DEFAULT_DATA_READ = 3; + private final int GET_BLEND_TBL = 4; + private final int SET_CHANNEL_DET_THRESHOLD = 5; + private final int DEFAULT_DATA_WRITE = 6; + private final int SET_BLEND_TBL = 7; + private final int GET_STATION_PARAM = 8; + private final int GET_STATION_DBG_PARAM = 9; + private Object obj = new Object(); + private int nRssi = 0; + private int nIoC = 0; + private int nIntDet = 0; + private int nMpxDcc = 0; + private int nSINR = 0; @Override public void onCreate(Bundle savedInstanceState) { @@ -289,8 +331,14 @@ public class FMStats extends Activity { (this, R.array.band_sweep_methods, android.R.layout.simple_spinner_item); + Log.d(LOGTAG, "oncreate"); checkTransportLayer(); - if (isRomeChip()) { + if (isCherokeeChip()) { + mSpinCfgRfListener4 = new CfgRfItemSelectedListener4(); + adaptCfgRf = ArrayAdapter.createFromResource( + this, R.array.cfg_rf4, + android.R.layout.simple_spinner_item); + } else if (isRomeChip()) { mSpinCfgRfListener3 = new CfgRfItemSelectedListener3(); adaptCfgRf = ArrayAdapter.createFromResource( this, R.array.cfg_rf3, @@ -333,12 +381,6 @@ public class FMStats extends Activity { mCurrentFileName = null; } - if (false == bindToService(this, osc)) { - Log.d(LOGTAG, "onCreate: Failed to Start Service"); - }else { - Log.d(LOGTAG, "onCreate: Start Service completed successfully"); - } - /*Initialize the column header with constant values*/ if (isRomeChip()) { @@ -367,9 +409,104 @@ public class FMStats extends Activity { registerBandSweepDwellExprdListener(); } + private final Handler mCallbackHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + Log.e(LOGTAG, "mCallbackHandler: msg.what = " + msg.what); + int val, status; + tv1 = (TextView)findViewById(R.id.label); + switch (msg.what) { + case SIGNAL_THRESHOLD: + case GET_CHANNEL_DET_THRESHOLD: + case GET_BLEND_TBL: + status = msg.arg2; + if (status != 0) { + tv1.setText("Error:" + String.valueOf(status)); + } else { + val = msg.arg1; + tv1.setText(String.valueOf(val)); + } + break; + case DEFAULT_DATA_READ: + status = msg.arg2; + if (status != 0) { + tv1.setText("Error:" + String.valueOf(status)); + } else { + val = msg.arg1; + if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO && val == MPX_DCC) { + tv1.setText(R.string.search_algo_mpx); + } else if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO && val == SINR_INTF) { + tv1.setText(R.string.search_algo_sinrint); + } else { + tv1.setText(String.valueOf(val)); + } + lastCmdSent = 0; + } + break; + case SET_CHANNEL_DET_THRESHOLD: + case DEFAULT_DATA_WRITE: + case SET_BLEND_TBL: + tv1.setVisibility(View.VISIBLE); + status = msg.arg1; + if (status != 0) + tv1.setText("Error:" + String.valueOf(status)); + else + tv1.setText("Success"); + break; + case GET_STATION_PARAM: + status = msg.arg2; + if (status != 0) { + Log.e(LOGTAG, "GET_STATION_DBG_PARAM: status = " + status); + nRssi = Integer.MAX_VALUE; + nSINR = Integer.MAX_VALUE; + } else { + if (lastCmdSent == CMD_STNPARAM_RSSI) + nRssi = msg.arg1; + if (lastCmdSent == CMD_STNPARAM_SINR) + nSINR = msg.arg1; + } + if (mRunTestThread != null) { + synchronized (obj) { + obj.notify(); + } + } + lastCmdSent = 0; + break; + case GET_STATION_DBG_PARAM: + status = msg.arg2; + if (status != 0) { + Log.e(LOGTAG, "GET_STATION_DBG_PARAM: status = " + status); + nIoC = Integer.MAX_VALUE; + nIntDet = Integer.MAX_VALUE; + } else { + if (lastCmdSent == CMD_STNDBGPARAM_IOVERC) + nIoC = msg.arg1; + if (lastCmdSent == CMD_STNDBGPARAM_INFDETOUT) + nIntDet = msg.arg1; + } + if (mRunTestThread != null) { + synchronized (obj) { + mRunTestThread.notify(); + } + } + break; + default: + Log.e(LOGTAG, "mCallbackHandler:Default"); + break; + } + Log.e(LOGTAG, "mCallbackHandler--"); + } + }; + @Override public void onStart() { super.onStart(); + + if (false == bindToService(this, osc)) { + Log.e(LOGTAG, "onCreate: Failed to Start Service"); + }else { + Log.d(LOGTAG, "onCreate: Start Service completed successfully"); + } if(isRecording()) { Log.d(LOGTAG, "onStart"); initiateRecordThread(); @@ -420,24 +557,45 @@ public class FMStats extends Activity { super.onDestroy(); } + private Runnable mRunTest = new Runnable(){ + public void run() { + runCurrentTest(); + } + }; + private View.OnClickListener mOnRunListener = new View.OnClickListener() { public void onClick(View v) { + Log.d(LOGTAG, "mTestRunning=" + mTestRunning); if(false == mTestRunning) { clearPreviousTestResults(); mTestRunning = true; if(mTestSelected == SWEEP_TEST) { disableBandSweepSetting(); } - runCurrentTest(); - }else { + SetButtonState(false); + createResult(mColumnHeader); + if ((mRunTestThread == null) || (mRunTestThread.getState() == Thread.State.TERMINATED)) { + mRunTestThread = new Thread(mRunTest, + "mRunTestThread"); + } else { + Log.e(LOGTAG, "Error: Thread is already running"); + return; + } + if (mRunTestThread != null) { + mRunTestThread.start(); + } else { + SetButtonState(true); + Log.e(LOGTAG, "RunTestThread: new Thread failed"); + return; + } + } else { mTestRunning = false; SetButtonState(true); /*Stop the thread by interrupting it*/ - if(mMultiUpdateThread != null) { - mMultiUpdateThread.interrupt(); - mMultiUpdateThread = null; + if (mRunTestThread != null) { + mRunTestThread.interrupt(); + mRunTestThread = null; } - if(SEARCH_TEST == mTestSelected) { try { mService.cancelSearch(); @@ -495,6 +653,7 @@ public class FMStats extends Activity { szbTestHeader.append("running test:").append (szTestInformation[mTestSelected]); String szTestHeader = new String(szbTestHeader); + Log.d(LOGTAG, "chooseFMRfoption"); switch(mTestSelected) { case 1: @@ -509,7 +668,10 @@ public class FMStats extends Activity { adaptCfgRf.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item); spinOptionFmRf.setAdapter(adaptCfgRf); - if (isRomeChip()) + if (isCherokeeChip()) { + spinOptionFmRf.setOnItemSelectedListener + (mSpinCfgRfListener4); + } else if (isRomeChip()) spinOptionFmRf.setOnItemSelectedListener (mSpinCfgRfListener3); else if(isTransportLayerSMD()) @@ -563,14 +725,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int count = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for mOnSetRxRePeatCount: " + count); - if((count < 0) || - (count > 255)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for mOnSetRxRePeatCount: " + textBoxVal); + if((textBoxVal < 0) || + (textBoxVal > 255)) return; if(mService != null) { try { - mService.setRxRepeatCount(count); + mService.getRxRepeatCount(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_REPEATCOUNT; } catch (RemoteException e) { e.printStackTrace(); } @@ -587,13 +751,15 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - byte count = (byte) Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for mOnSetBlendSinrHiListener: " + count); - if((count < MIN_BLEND_SINRHI ) || - (count > MAX_BLEND_SINRHI)) + textBoxVal = (byte) Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for mOnSetBlendSinrHiListener: " + textBoxVal); + if((textBoxVal < MIN_BLEND_SINRHI ) || + (textBoxVal > MAX_BLEND_SINRHI)) return; if(mReceiver != null) { - mReceiver.setBlendSinr(count); + mReceiver.getBlendSinr(); + setCmdSent = true; + lastCmdSent = CMD_BLENDTBL_SINR_HI; } } catch (NumberFormatException e) { Log.e(LOGTAG, "Value entered is not in correct format : " + a); @@ -607,13 +773,15 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - byte count = (byte)Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for mOnSetBlendRmssiHiListener: " + count); - if((count < MIN_BLEND_RMSSIHI) || - (count > MAX_BLEND_RMSSIHI)) + textBoxVal = (byte)Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for mOnSetBlendRmssiHiListener: " + textBoxVal); + if((textBoxVal < MIN_BLEND_RMSSIHI) || + (textBoxVal > MAX_BLEND_RMSSIHI)) return; if(mReceiver != null) { - mReceiver.setBlendRmssi(count); + mReceiver.getBlendRmssi(); + setCmdSent = true; + lastCmdSent = CMD_BLENDTBL_RMSSI_HI; } } catch (NumberFormatException e) { Log.e(LOGTAG, "Value entered is not in correct format : " + a); @@ -646,17 +814,18 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int rdel = Integer.parseInt(a); - Log.d(LOGTAG, "Value of Sinr Samples count is : " + rdel); + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value of Sinr Samples count is : " + textBoxVal); if(mService != null) { try { - mService.setSinrSamplesCnt(rdel); + mService.getSinrSamplesCnt(); + setCmdSent = true; + lastCmdSent = CMD_CHDET_SINR_SAMPLE; }catch (RemoteException e) { e.printStackTrace(); } } }catch (NumberFormatException e) { - Log.e(LOGTAG, "Value entered is not in correct format: " + a); txtbox1.setText(""); } } @@ -668,11 +837,13 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int rdel = Integer.parseInt(a); - Log.d(LOGTAG, "Value of Sinr Th is : " + rdel); + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value of Sinr Th is : " + textBoxVal); if(mService != null) { try { - mService.setSinrTh(rdel); + mService.getSinrTh(); + setCmdSent = true; + lastCmdSent = CMD_CHDET_SINR_TH; }catch (RemoteException e) { e.printStackTrace(); } @@ -690,11 +861,13 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int rdel = Integer.parseInt(a); - Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel); + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value of Intf Det Low Th is : " + textBoxVal); if(mService != null) { try { - mService.setIntfDetLowTh(rdel); + mService.getIntfDetLowTh(); + setCmdSent = true; + lastCmdSent = CMD_CHDET_INTF_TH_LOW; }catch (RemoteException e) { e.printStackTrace(); } @@ -711,11 +884,13 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int rdel = Integer.parseInt(a); - Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel); + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value of Intf Det Low Th is : " + textBoxVal); if(mService != null) { try { - mService.setIntfDetHighTh(rdel); + mService.getIntfDetHighTh(); + setCmdSent = true; + lastCmdSent = CMD_CHDET_INTF_TH_HIGH; }catch (RemoteException e) { e.printStackTrace(); } @@ -733,14 +908,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int sinr = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for SINR FIRST STAGE is : " + sinr); - if((sinr < MIN_SINR_FIRST_STAGE) || - (sinr > MAX_SINR_FIRST_STAGE)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for SINR FIRST STAGE is : " + textBoxVal); + if((textBoxVal < MIN_SINR_FIRST_STAGE) || + (textBoxVal > MAX_SINR_FIRST_STAGE)) return; if(mService != null) { try { - mService.setSinrFirstStage(sinr); + mService.getSinrFirstStage(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_SINR_FIRST_STAGE; }catch (RemoteException e) { e.printStackTrace(); } @@ -758,14 +935,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int rmssi = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for RMSSI FIRST STAGE is: " + rmssi); - if((rmssi < MIN_RMSSI_FIRST_STAGE) || - (rmssi > MAX_RMSSI_FIRST_STAGE)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for RMSSI FIRST STAGE is: " + textBoxVal); + if((textBoxVal < MIN_RMSSI_FIRST_STAGE) || + (textBoxVal > MAX_RMSSI_FIRST_STAGE)) return; if(mService != null) { try { - mService.setRmssiFirstStage(rmssi); + mService.getRmssiFirstStage(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_RMSSI_FIRST_STAGE; }catch (RemoteException e) { e.printStackTrace(); } @@ -783,14 +962,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int cf0 = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for CF0TH12 is: " + cf0); - if((cf0 < MIN_CF0TH12) || - (cf0 > MAX_CF0TH12)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for CF0TH12 is: " + textBoxVal); + if((textBoxVal < MIN_CF0TH12) || + (textBoxVal > MAX_CF0TH12)) return; if(mService != null) { try { - mService.setCFOMeanTh(cf0); + mService.getCFOMeanTh(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_CF0TH12; }catch (RemoteException e) { e.printStackTrace(); } @@ -808,9 +989,12 @@ public class FMStats extends Activity { Log.d(LOGTAG, "Value entered for search is: MPX DCC"); if(mService != null) { try { - mService.setSearchAlgoType(MPX_DCC); + mService.getSearchAlgoType(); + setCmdSent = true; + algo_type = MPX_DCC; + lastCmdSent = CMD_DEFRD_SEARCH_ALGO; }catch (RemoteException e) { - e.printStackTrace(); + e.printStackTrace(); } } } @@ -822,7 +1006,10 @@ public class FMStats extends Activity { Log.d(LOGTAG, "Value entered for search is: SINR INTF"); if(mService != null) { try { - mService.setSearchAlgoType(SINR_INTF); + mService.getSearchAlgoType(); + setCmdSent = true; + algo_type = SINR_INTF; + lastCmdSent = CMD_DEFRD_SEARCH_ALGO; }catch (RemoteException e) { e.printStackTrace(); } @@ -836,14 +1023,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int th = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for AfJmpRmssiTh is: " + th); - if((th < MIN_AF_JMP_RMSSI_TH) || - (th > MAX_AF_JMP_RMSSI_TH)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for AfJmpRmssiTh is: " + textBoxVal); + if((textBoxVal < MIN_AF_JMP_RMSSI_TH) || + (textBoxVal > MAX_AF_JMP_RMSSI_TH)) return; if(mService != null) { try { - mService.setAfJmpRmssiTh(th); + mService.getAfJmpRmssiTh(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_AF_RMSSI_TH; }catch (RemoteException e) { e.printStackTrace(); } @@ -861,14 +1050,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int th = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for Good channel Rmssi Th is: " + th); - if((th < MIN_GD_CH_RMSSI_TH) || - (th > MAX_GD_CH_RMSSI_TH)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for Good channel Rmssi Th is: " + textBoxVal); + if((textBoxVal < MIN_GD_CH_RMSSI_TH) || + (textBoxVal > MAX_GD_CH_RMSSI_TH)) return; if(mService != null) { try { - mService.setGoodChRmssiTh(th); + mService.getGoodChRmssiTh(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_GD_CH_RMSSI_TH; }catch (RemoteException e) { e.printStackTrace(); } @@ -886,14 +1077,16 @@ public class FMStats extends Activity { String a; a = txtbox1.getText().toString(); try { - int cnt = Integer.parseInt(a); - Log.d(LOGTAG, "Value entered for AfJmpRmssiSamples is: " + cnt); - if((cnt < MIN_AF_JMP_RMSSI_SAMPLES) || - (cnt > MAX_AF_JMP_RMSSI_SAMPLES)) + textBoxVal = Integer.parseInt(a); + Log.d(LOGTAG, "Value entered for AfJmpRmssiSamples is: " + textBoxVal); + if((textBoxVal < MIN_AF_JMP_RMSSI_SAMPLES) || + (textBoxVal > MAX_AF_JMP_RMSSI_SAMPLES)) return; if(mService != null) { try { - mService.setAfJmpRmssiSamplesCnt(cnt); + mService.getAfJmpRmssiSamplesCnt(); + setCmdSent = true; + lastCmdSent = CMD_DEFRD_AF_RMSSI_SAMPLE; }catch (RemoteException e) { e.printStackTrace(); } @@ -1989,144 +2182,773 @@ public class FMStats extends Activity { } } - public class RfCfgItemSelectedListener implements OnItemSelectedListener { + public class CfgRfItemSelectedListener4 implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { - Log.d("Table","onItemSelected is hit with "+pos); + Log.d("Table","onItemSelected is hit with " + pos); + int ret = Integer.MAX_VALUE; + byte retval = Byte.MAX_VALUE; + txtbox1 = (EditText) findViewById(R.id.txtbox1); + tv1 = (TextView) findViewById(R.id.label); + button1 = (Button)findViewById(R.id.SearchMpxDcc); + button2 = (Button)findViewById(R.id.SearchSinrInt); + Button SetButton = (Button)findViewById(R.id.Setbutton); tLayout.setVisibility(View.INVISIBLE); - if (mTestRunning) - stopCurTest(); switch(pos) { - case 0: case 1: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_SinrSmplsCnt); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_SinrSmplsCnt); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetSinrSmplCntListener); + } + break; case 2: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_SinrTh); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_SinrTh); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetSinrThListener); + } + break; case 3: - mTestSelected = pos; - tLayout.removeAllViewsInLayout(); - mNewRowIds = NEW_ROW_ID; - tLayout.setVisibility(View.VISIBLE); - RunButton = (Button)findViewById(R.id.Runbutton); - if (RunButton != null) { - RunButton.setText(R.string.test_run); - RunButton.setVisibility(View.VISIBLE); - RunButton.setOnClickListener(mOnRunListener); + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); } - if(mTestSelected == SWEEP_TEST) { - enableBandSweepSetting(); - }else { - disableBandSweepSetting(); + if (tv1 != null) { + tv1.setText(R.string.enter_IntfLowTh); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_IntfLowTh); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetIntfLowThListener); } break; case 4: - RunButton = (Button)findViewById(R.id.Runbutton); - if (RunButton != null) { - RunButton.setVisibility(View.INVISIBLE); + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); } - pbar = (ProgressBar) findViewById(R.id.progressbar); - if (pbar != null) { - pbar.setVisibility(View.INVISIBLE); + if (tv1 != null) { + tv1.setText(R.string.enter_IntfHighTh); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_IntfHighTh); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetIntfHighThListener); } - adaptCfgRf.setDropDownViewResource( - android.R.layout.simple_spinner_dropdown_item); - spinOptionFmRf.setAdapter(adaptCfgRf); - if (isRomeChip()) - spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener3); - else if(isTransportLayerSMD()) - spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2); - else - spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1); - disableBandSweepSetting(); break; - } - } - - public void onNothingSelected(AdapterView<?> parent) { - // Do Nothing - } - } - public class FmRfItemSelectedListener implements OnItemSelectedListener { - public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { - Log.d("Table","onItemSelected is hit with "+pos); - mTestSelected = pos; - tLayout.setVisibility(View.INVISIBLE); - chooseFMRFoption(); - } - public void onNothingSelected(AdapterView<?> parent) { - // Do Nothing - } - } - private void checkTransportLayer() { - String transportLayer = ""; - - transportLayer = SystemProperties.get("ro.qualcomm.bt.hci_transport"); - if(transportLayer.equals("smd")) - mIsTransportSMD = true; - } - private boolean isTransportLayerSMD() { - return mIsTransportSMD; - } - private boolean isRomeChip() { - String chip = ""; - - chip = SystemProperties.get("qcom.bluetooth.soc"); - if(chip.equals("rome")) - return true; - return false; - } - - private void createResult(Result aRes) { - // Get the TableLayout - TableLayout tl = (TableLayout) findViewById(R.id.maintable); - if (tl == null) { - return; - } - - /* Create a new row to be added. */ - mNewRowIds++; - TableRow tr2 = new TableRow(getApplicationContext()); - int width = getWindowManager().getDefaultDisplay().getWidth(); - tr2.setLayoutParams(new LayoutParams( - LayoutParams.FILL_PARENT, - LayoutParams.WRAP_CONTENT)); - tr2.setId(mNewRowIds); - /* Create a Button to be the row-content. */ - TextView colFreq = new TextView(getApplicationContext()); - colFreq.setText(aRes.getFreq()); - colFreq.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); - colFreq.setWidth(width/4); - /* Add Button to row. */ - tr2.addView(colFreq); - - TextView colRMSSI = new TextView(getApplicationContext()); - colRMSSI.setText(aRes.getRSSI()); - colRMSSI.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); - colRMSSI.setWidth(width/4); - tr2.addView(colRMSSI); - - if(!isRomeChip()) { - TextView colIoC = new TextView(getApplicationContext()); - colIoC.setText(aRes.getIoC()); - colIoC.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); - colIoC.setWidth(width/4); - tr2.addView(colIoC); - } - - if(isTransportLayerSMD() || isRomeChip()) - { - TextView colSINR = new TextView(getApplicationContext()); - colSINR.setText(aRes.getSINR()); - colSINR.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); - colSINR.setWidth(width/4); - tr2.addView(colSINR); - } else - { - TextView colMpxDcc = new TextView(getApplicationContext()); - colMpxDcc.setText(aRes.getMpxDcc()); - colMpxDcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); - colMpxDcc.setWidth(width/4); - tr2.addView(colMpxDcc); - } + case 5: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_SinrFirstStage); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_SinrFirstStage); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetSinrFirstStageListener); + } + break; + case 6: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_RmssiFirstStage); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_RmssiFirstStage); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetRmssiFirstStageListener); + } + break; + case 7: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_CF0Th12); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_CF0Th12); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetCFOMeanThListener); + } + break; + case 8: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + if(button1 != null) { + button1.setText(R.string.search_algo_mpx); + button1.setVisibility(View.VISIBLE); + button1.setOnClickListener(mOnSetSearchMPXDCCListener); + } + if(button2 != null) { + button2.setText(R.string.search_algo_sinrint); + button2.setVisibility(View.VISIBLE); + button2.setOnClickListener(mOnSetSearchSinrIntfListener); + } + break; + case 9: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) + ret = mService.getSinrSamplesCnt(); + Log.d(LOGTAG, "Get Sinr Samples Count: " + ret); + }catch (RemoteException e) { + } + break; + case 10: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) + ret = mService.getSinrTh(); + Log.d(LOGTAG, "Get Sinr Threshold: " + ret); + }catch (RemoteException e) { + + } + break; + case 11: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getSinrFirstStage(); + Log.d(LOGTAG, "Get Sinr First Stage: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 12: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getRmssiFirstStage(); + Log.d(LOGTAG, "Get Rmssi First Stage: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 13: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getCFOMeanTh(); + Log.d(LOGTAG, "Get CF0 Threshold: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 14: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getSearchAlgoType(); + lastCmdSent = CMD_DEFRD_SEARCH_ALGO; + Log.d(LOGTAG, "Search Type: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 15: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_AfJmpRmssiTh); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_AfJmpRmssiTh); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetAfJmpRmssiThListener); + } + break; + case 16: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_GdChRmssiTh); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_GdChRmssiTh); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetGdChRmssiThListener); + } + break; + case 17: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_AfJmpRmssiSmplsCnt); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_AfJmpRmssiSmplsCnt); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetAfJmpRmssiSmplsCntListener); + } + break; + case 18: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getAfJmpRmssiTh(); + Log.d(LOGTAG, "Get Af Jmp Rmssi Th: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 19: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getGoodChRmssiTh(); + Log.d(LOGTAG, "Get GoodChRmssi Threshold: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 20: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + try { + if(mService != null) { + ret = mService.getAfJmpRmssiSamplesCnt(); + Log.d(LOGTAG, "Get AfJmpRmssiSamples count: " + ret); + } + }catch (RemoteException e) { + + } + break; + case 21: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_RxRePeatCount); + tv1.setVisibility(View.VISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_RxRePeatCount); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetRxRePeatCount); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + break; + case 22: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_BlendSinrHi); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_BlendSinrHi); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetBlendSinrHiListener); + } + break; + case 23: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + if (mReceiver != null) { + retval = mReceiver.getBlendSinr(); + Log.d(LOGTAG, "Get BlendSinrHi: " + retval); + } + break; + case 24: + if (txtbox1 != null) { + txtbox1.setText(R.string.type_rd); + txtbox1.setVisibility(View.VISIBLE); + } + if (tv1 != null) { + tv1.setText(R.string.enter_BlendRmssiHi); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setText(R.string.set_BlendRmssiHi); + SetButton.setVisibility(View.VISIBLE); + SetButton.setOnClickListener(mOnSetBlendRmssiHiListener); + } + break; + case 25: + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setText(""); + tv1.setVisibility(View.VISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + if (mReceiver != null) { + retval = mReceiver.getBlendRmssi(); + Log.d(LOGTAG, "Get BlendRmssiHi: " + retval); + } + break; + case 26: + tLayout.removeAllViewsInLayout(); + mNewRowIds = NEW_ROW_ID; + tLayout.setVisibility(View.VISIBLE); + if (txtbox1 != null) { + txtbox1.setVisibility(View.INVISIBLE); + } + if (tv1 != null) { + tv1.setVisibility(View.INVISIBLE); + } + if (SetButton != null) { + SetButton.setVisibility(View.INVISIBLE); + } + if(button1 != null) { + button1.setVisibility(View.INVISIBLE); + } + if(button2 != null) { + button2.setVisibility(View.INVISIBLE); + } + adaptRfCfg.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + spinOptionFmRf.setAdapter(adaptRfCfg); + spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener); + break; + } + } + public void onNothingSelected(AdapterView<?> parent) { + // Do Nothing + } + } + + public class RfCfgItemSelectedListener implements OnItemSelectedListener { + public void onItemSelected(AdapterView<?> parent, + View view, int pos, long id) { + Log.d("Table","onItemSelected is hit with "+pos); + tLayout.setVisibility(View.INVISIBLE); + if (mTestRunning) + stopCurTest(); + switch(pos) + { + case 0: + case 1: + case 2: + case 3: + mTestSelected = pos; + tLayout.removeAllViewsInLayout(); + mNewRowIds = NEW_ROW_ID; + tLayout.setVisibility(View.VISIBLE); + RunButton = (Button)findViewById(R.id.Runbutton); + if (RunButton != null) { + RunButton.setText(R.string.test_run); + RunButton.setVisibility(View.VISIBLE); + RunButton.setOnClickListener(mOnRunListener); + } + if(mTestSelected == SWEEP_TEST) { + enableBandSweepSetting(); + }else { + disableBandSweepSetting(); + } + break; + case 4: + RunButton = (Button)findViewById(R.id.Runbutton); + if (RunButton != null) { + RunButton.setVisibility(View.INVISIBLE); + } + pbar = (ProgressBar) findViewById(R.id.progressbar); + if (pbar != null) { + pbar.setVisibility(View.INVISIBLE); + } + adaptCfgRf.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + spinOptionFmRf.setAdapter(adaptCfgRf); + if (isCherokeeChip()) + spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener4); + if (isRomeChip()) + spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener3); + else if(isTransportLayerSMD()) + spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2); + else + spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1); + disableBandSweepSetting(); + break; + } + } + + public void onNothingSelected(AdapterView<?> parent) { + // Do Nothing + } + } + public class FmRfItemSelectedListener implements OnItemSelectedListener { + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + Log.d("Table","onItemSelected is hit with "+pos); + mTestSelected = pos; + tLayout.setVisibility(View.INVISIBLE); + chooseFMRFoption(); + } + public void onNothingSelected(AdapterView<?> parent) { + // Do Nothing + } + } + private void checkTransportLayer() { + String transportLayer = ""; + + transportLayer = SystemProperties.get("ro.qualcomm.bt.hci_transport"); + if(transportLayer.equals("smd")) + mIsTransportSMD = true; + } + private boolean isTransportLayerSMD() { + return mIsTransportSMD; + } + + private boolean isCherokeeChip() { + Log.d(LOGTAG, "isCherokeeChip"); + + String chip = SystemProperties.get("qcom.bluetooth.soc"); + if (chip.equals("cherokee")) + return true; + else + return false; + } + + private boolean isRomeChip() { + String chip = ""; + + chip = SystemProperties.get("qcom.bluetooth.soc"); + if(chip.equals("rome")) + return true; + return false; + } + + private void createResult(Result aRes) { + // Get the TableLayout + TableLayout tl = (TableLayout) findViewById(R.id.maintable); + if (tl == null) { + Log.e(LOGTAG, "Tl is null"); + return; + } + + /* Create a new row to be added. */ + mNewRowIds++; + TableRow tr2 = new TableRow(getApplicationContext()); + int width = getWindowManager().getDefaultDisplay().getWidth(); + tr2.setLayoutParams(new LayoutParams( + LayoutParams.FILL_PARENT, + LayoutParams.WRAP_CONTENT)); + tr2.setId(mNewRowIds); + /* Create a Button to be the row-content. */ + TextView colFreq = new TextView(getApplicationContext()); + colFreq.setText(aRes.getFreq()); + colFreq.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); + colFreq.setWidth(width/4); + /* Add Button to row. */ + tr2.addView(colFreq); + + TextView colRMSSI = new TextView(getApplicationContext()); + colRMSSI.setText(aRes.getRSSI()); + colRMSSI.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); + colRMSSI.setWidth(width/4); + tr2.addView(colRMSSI); + + if(!isRomeChip()) { + TextView colIoC = new TextView(getApplicationContext()); + colIoC.setText(aRes.getIoC()); + colIoC.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); + colIoC.setWidth(width/4); + tr2.addView(colIoC); + } + + if(isTransportLayerSMD() || isRomeChip() || isCherokeeChip()) + { + TextView colSINR = new TextView(getApplicationContext()); + colSINR.setText(aRes.getSINR()); + colSINR.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); + colSINR.setWidth(width/4); + tr2.addView(colSINR); + } else + { + TextView colMpxDcc = new TextView(getApplicationContext()); + colMpxDcc.setText(aRes.getMpxDcc()); + colMpxDcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25); + colMpxDcc.setWidth(width/4); + tr2.addView(colMpxDcc); + } /* Add row to TableLayout. */ /* Add row to TableLayout. */ tl.addView(tr2,new TableLayout.LayoutParams( @@ -2170,6 +2992,8 @@ public class FMStats extends Activity { szbTestHeader.append("running test:").append(szTestInformation[mTestSelected]); szbTestHeader.append("\r\n"); String szTestHeader = new String(szbTestHeader); + Message updateStop; + int freq; if(null != mFileCursor ) { try { mFileCursor.write(szTestHeader.getBytes()); @@ -2181,53 +3005,61 @@ public class FMStats extends Activity { { case CUR_FREQ_TEST: Log.d(LOGTAG,"Current Freq test is going to run"); - int freq = FmSharedPreferences.getTunedFrequency(); + freq = FmSharedPreferences.getTunedFrequency(); Result res = GetFMStatsForFreq(freq); - createResult(mColumnHeader); - if(res != null) - createResult(res); - mTestRunning = false; + if(res != null) { + Log.e(LOGTAG, "CUR_FREQ_TEST: Updating UI"); + Message updateUI = new Message(); + updateUI.what = STATUS_UPDATE; + updateUI.obj = (Object)res; + mUIUpdateHandlerHandler.sendMessage(updateUI); + } + updateStop = new Message(); + updateStop.what = STATUS_DONE; + mUIUpdateHandlerHandler.sendMessage(updateStop); + mTestRunning = false; break; case CUR_MULTI_TEST: - /*Set it to ready to Stop*/ - SetButtonState(false); - createResult(mColumnHeader); - if(mMultiUpdateThread == null) { - mMultiUpdateThread = new Thread(null, getMultipleResults, - "MultiResultsThread"); - } - /* Launch dummy thread to simulate the transfer progress */ - Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState()); - if(mMultiUpdateThread.getState() == Thread.State.TERMINATED) { - mMultiUpdateThread = new Thread(null, getMultipleResults, - "MultiResultsThread"); - } - /* If the thread state is "new" then the thread has not yet started */ - if(mMultiUpdateThread.getState() == Thread.State.NEW) { - mMultiUpdateThread.start(); - } - // returns and UI in different thread. - break; + freq = FmSharedPreferences.getTunedFrequency(); + + for(int i = 0; i < 20 && !Thread.currentThread().isInterrupted(); i++) { + try { + Thread.sleep(500); + Message updateUI = new Message(); + updateUI.what = STATUS_UPDATE; + updateUI.obj = (Object)GetFMStatsForFreq(freq); + if(updateUI.obj == null) + break; + mUIUpdateHandlerHandler.sendMessage(updateUI); + }catch (InterruptedException e) { + /*break the loop*/ + break; + } + } + mTestRunning = false; + updateStop = new Message(); + updateStop.what = STATUS_DONE; + mUIUpdateHandlerHandler.sendMessage(updateStop); + // returns and UI in different thread. + + break; case SEARCH_TEST: - try { - Log.d(LOGTAG, "start scanning\n"); - if(isTransportLayerSMD()) { - Log.d(LOGTAG,"Scanning with 0 scan time"); - if (mReceiver != null) - mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN, - SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP); - }else { - mIsSearching = mService.scan(0); - } - }catch (RemoteException e) { - e.printStackTrace(); - } + try { + Log.e(LOGTAG, "start scanning\n"); + if(isTransportLayerSMD() || isCherokeeChip()) { + Log.d(LOGTAG,"Scanning with 0 scan time"); + if (mReceiver != null) + mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN, + SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP); + } else { + mIsSearching = mService.scan(0); + } + }catch (RemoteException e) { + e.printStackTrace(); + } if(mIsSearching) { - /*Set it to Ready to Stop*/ - SetButtonState(false); - createResult(mColumnHeader); Log.d(LOGTAG, "Created the results and cancel UI\n"); }else { mTestRunning = false; @@ -2243,9 +3075,7 @@ public class FMStats extends Activity { }catch (RemoteException e) { e.printStackTrace(); } - /* Set it to Ready to stop*/ - SetButtonState(false); - createResult(mColumnHeader); + getFMStatsInBand(lowerFreq, higherFreq, Spacing); break; } @@ -2416,98 +3246,144 @@ public class FMStats extends Activity { private Result GetFMStatsForFreq(int freq) { Result result = new Result(); + int ret; Log.d(LOGTAG,"freq is "+freq); result.setFreq(Integer.toString(freq)); - byte nRssi = 0; - int nIoC = 0; - int dummy = 0; - int nIntDet = 0; - int nMpxDcc = 0; - byte nSINR = 0; if((null != mService)) { - try { - dummy = mService.getRssi(); - if (dummy != Integer.MAX_VALUE) { - nRssi = (byte)dummy; - result.setRSSI(Byte.toString(nRssi)); - } else { - return null; - } - } catch (RemoteException e) { - e.printStackTrace(); - } catch(Exception e) { - e.printStackTrace(); - } + try { + ret = mService.getRssi(); + if (ret != 0) { + Log.e(LOGTAG, "getrssi cmd failed: ret = " + ret); + return null; + } + lastCmdSent = CMD_STNPARAM_RSSI; + Log.e(LOGTAG, "wait for response of mService.getRssi"); + synchronized (obj) { + try { + obj.wait(); + } catch (InterruptedException e) { + Log.e(LOGTAG, "getRSSI:THREAD interrupted"); + e.printStackTrace(); + return null; + } + } + Log.e(LOGTAG, "Got response of mService.getRssi"); + if (nRssi != Integer.MAX_VALUE) { + result.setRSSI(Integer.toString(nRssi)); + } else { + return null; + } + } catch (RemoteException e) { + e.printStackTrace(); + } catch(Exception e) { + e.printStackTrace(); + } - if(!isRomeChip()) { - try { - nIoC = mService.getIoC(); - if (nIoC != Integer.MAX_VALUE) - result.setIoC(Integer.toString(nIoC)); - else - return null; - } catch (RemoteException e) { - e.printStackTrace(); - } catch(Exception e) { - e.printStackTrace(); - } - } + if(!isRomeChip()) { + try { + mService.getIoC(); + lastCmdSent = CMD_STNDBGPARAM_IOVERC; + Log.e(LOGTAG, "wait for response of mService.getIoC"); + synchronized (obj) { + try { + obj.wait(); + } catch (InterruptedException e) { + Log.e(LOGTAG, "getIOC:THREAD interrupted"); + e.printStackTrace(); + return null; + } + } + Log.e(LOGTAG, "GOT response of mService.getIoC"); + if (nIoC != Integer.MAX_VALUE) + result.setIoC(Integer.toString(nIoC)); + else + return null; + } catch (RemoteException e) { + e.printStackTrace(); + } catch(Exception e) { + e.printStackTrace(); + } + } - if(isTransportLayerSMD() || isRomeChip()) { - try { - dummy = mService.getSINR(); - if (dummy != Integer.MAX_VALUE) { - nSINR = (byte)dummy; - result.setSINR(Integer.toString(nSINR)); - } else { - return null; - } - } catch (RemoteException e) { - e.printStackTrace(); - } catch(Exception e) { - e.printStackTrace(); - } - } else { - try { - nMpxDcc = mService.getMpxDcc(); - if (nMpxDcc != Integer.MAX_VALUE) - result.setMpxDcc(Integer.toString(nMpxDcc)); - else - return null; - } catch (RemoteException e) { - e.printStackTrace(); - }catch(Exception e) { - e.printStackTrace(); - } - } + if(isTransportLayerSMD() || isRomeChip() || isCherokeeChip()) { + try { + mService.getSINR(); + lastCmdSent = CMD_STNPARAM_SINR; + Log.e(LOGTAG, "wait for response of mService.getSINR"); + synchronized (obj) { + try { + obj.wait(); + } catch (InterruptedException e) { + Log.e(LOGTAG, "getSINR:THREAD interrupted"); + e.printStackTrace(); + return null; + } + } + Log.e(LOGTAG, "Got response of mService.getSINR"); + if (nSINR != Integer.MAX_VALUE) { + result.setSINR(Integer.toString(nSINR)); + } else { + return null; + } + } catch (RemoteException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + try { + nMpxDcc = mService.getMpxDcc(); + if (nMpxDcc != Integer.MAX_VALUE) + result.setMpxDcc(Integer.toString(nMpxDcc)); + else + return null; + } catch (RemoteException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } - if(!isRomeChip()) { - try { - nIntDet = mService.getIntDet(); - if (nIntDet != Integer.MAX_VALUE) - result.setIntDet(Integer.toString(nIntDet)); - else - return null; - } catch (RemoteException e) { - e.printStackTrace(); - }catch (Exception e) { - e.printStackTrace(); - } - } + if(!isRomeChip()) { + try { + mService.getIntDet(); + lastCmdSent = CMD_STNDBGPARAM_INFDETOUT; + Log.e(LOGTAG, "wait for response of mService.getIntDet"); + synchronized (obj) { + try { + obj.wait(); + } catch (InterruptedException e) { + Log.e(LOGTAG, "getIntDet:THREAD interrupted"); + e.printStackTrace(); + return null; + } + } + Log.e(LOGTAG, "Got response of mService.getIntDet"); + if (nIntDet != Integer.MAX_VALUE) + result.setIntDet(Integer.toString(nIntDet)); + else + return null; + } catch (RemoteException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } } else { - return null; + return null; } return result; - } + } private Handler mUIUpdateHandlerHandler = new Handler() { public void handleMessage(Message msg) { + Log.d(LOGTAG, "mUIUpdateHandlerHandler: msg.what = " + msg.what); switch (msg.what) { case STATUS_UPDATE: Result myRes = (Result) msg.obj; - Log.d(LOGTAG,"Status update is" +myRes.mFreq); + Log.d(LOGTAG,"Status update is" +myRes.mFreq + "mRSSI=" + myRes.mRSSI + "mSINR=" + myRes.mSINR); createResult(myRes); break; case STATUS_DONE: @@ -2558,7 +3434,7 @@ public class FMStats extends Activity { { // presumably there is nobody interested in the service at this point, // so don't hang on to the ServiceConnection - sService = null; + mService = null; } } @@ -2570,7 +3446,6 @@ public class FMStats extends Activity { } public void onServiceConnected(ComponentName className, android.os.IBinder service) { - sService = IFMRadioService.Stub.asInterface(service); if (mCallback != null) { Log.e(LOGTAG, "onServiceConnected: mCallback"); @@ -2583,7 +3458,7 @@ public class FMStats extends Activity { { mCallback.onServiceDisconnected(className); } - sService = null; + mService = null; } } @@ -2639,7 +3514,7 @@ public class FMStats extends Activity { public void onTuneStatusChanged() { - Log.d(LOGTAG, "mServiceCallbacks.onTuneStatusChanged :"); + Log.d(LOGTAG, "mServiceCallbacks.onTuneStatusChanged :" + mTestRunning); if (mTestRunning) mHandler.post(mTuneComplete); } @@ -2729,6 +3604,138 @@ public class FMStats extends Activity { public void onFmAudioPathStopped() { Log.d(LOGTAG, "mServiceCallbacks.onFmAudioPathStopped:"); } + public void getSigThCb(int val, int status) { + Log.d(LOGTAG, "getSigThCb "); + + if (setCmdSent) { + setCmdSent = false; + if (mService != null) { + try { + mService.setSinrSamplesCnt(textBoxVal); + } catch (RemoteException e) { + e.printStackTrace(); + } + } else { + Log.e(LOGTAG, "getSigTh: Service is null"); + } + } else { + Log.e(LOGTAG, "Send message: SIGNAL_THRESHOLD"); + mCallbackHandler.obtainMessage(SIGNAL_THRESHOLD, val, status).sendToTarget(); + } + } + + public void getChDetThCb(int val, int status) { + Log.d(LOGTAG, "getChDetThCb"); + + if (setCmdSent) { + setCmdSent = false; + if (mService != null) { + try { + if (lastCmdSent == CMD_CHDET_SINR_TH) + mService.setSinrTh(textBoxVal); + else if (lastCmdSent == CMD_CHDET_SINR_SAMPLE) + mService.setSinrSamplesCnt(textBoxVal); + else if (lastCmdSent == CMD_CHDET_INTF_TH_LOW) + mService.setIntfDetLowTh(textBoxVal); + else if (lastCmdSent == CMD_CHDET_INTF_TH_HIGH) + mService.setIntfDetHighTh(textBoxVal); + } catch (RemoteException e) { + Log.e(LOGTAG, "getChDetTh: exception"); + e.printStackTrace(); + } + } + lastCmdSent = 0; + } else { + Log.e(LOGTAG, "Send message: GET_CHANNEL_DET_THRESHOLD"); + mCallbackHandler.obtainMessage(GET_CHANNEL_DET_THRESHOLD, val, status).sendToTarget(); + } + } + + public void setChDetThCb(int status) + { + Log.d(LOGTAG, "setChDetTh++"); + mCallbackHandler.obtainMessage(SET_CHANNEL_DET_THRESHOLD, status).sendToTarget(); + } + + public void DefDataRdCb(int val, int status) { + Log.d(LOGTAG, "DefDataRdCb"); + + if (setCmdSent) { + setCmdSent = false; + if (mService != null) { + try { + if (lastCmdSent == CMD_DEFRD_AF_RMSSI_TH) + mService.setAfJmpRmssiTh(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_AF_RMSSI_SAMPLE) + mService.setAfJmpRmssiSamplesCnt(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_GD_CH_RMSSI_TH) + mService.setGoodChRmssiTh(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_SEARCH_ALGO) + mService.setSearchAlgoType(algo_type); + else if (lastCmdSent == CMD_DEFRD_SINR_FIRST_STAGE) + mService.setSinrFirstStage(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_RMSSI_FIRST_STAGE) + mService.setRmssiFirstStage(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_CF0TH12) + mService.setCFOMeanTh(textBoxVal); + else if (lastCmdSent == CMD_DEFRD_REPEATCOUNT) + mService.setRxRepeatCount(textBoxVal); + } catch (RemoteException e) { + Log.e(LOGTAG,"DefDataRd: exception"); + lastCmdSent = 0; + e.printStackTrace(); + } + } else { + Log.e(LOGTAG, "DefDataRd:Service is null"); + } + lastCmdSent = 0; + } else { + Log.e(LOGTAG, "Send message: DEFAULT_DATA_READ"); + mCallbackHandler.obtainMessage(DEFAULT_DATA_READ, val, status).sendToTarget(); + } + } + + public void DefDataWrtCb(int status) + { + Log.d(LOGTAG, "DefDataWrtCb"); + mCallbackHandler.obtainMessage(DEFAULT_DATA_WRITE, status).sendToTarget(); + } + + public void getBlendCb(int val, int status) { + Log.d(LOGTAG, "getBlend"); + + if (setCmdSent) { + setCmdSent = false; + if (mReceiver != null) { + if (lastCmdSent == CMD_BLENDTBL_SINR_HI) + mReceiver.setBlendSinr(textBoxVal); + else if (lastCmdSent == CMD_BLENDTBL_RMSSI_HI) + mReceiver.setBlendRmssi(textBoxVal); + } else { + Log.e(LOGTAG, "getBlend: Service is null"); + } + lastCmdSent = 0; + } else { + Log.e(LOGTAG, "Send message: GET_BLEND_TBL"); + mCallbackHandler.obtainMessage(GET_BLEND_TBL, val, status).sendToTarget(); + } + } + + public void setBlendCb(int status) + { + Log.d(LOGTAG, "setBlendCb"); + mCallbackHandler.obtainMessage(SET_BLEND_TBL, status).sendToTarget(); + } + public void getStationParamCb(int val, int status) + { + Log.d(LOGTAG, "getStationParamCb"); + mCallbackHandler.obtainMessage(GET_STATION_PARAM, val, status).sendToTarget(); + } + public void getStationDbgParamCb(int val, int status) + { + Log.d(LOGTAG, "getStationDbgParamCb"); + mCallbackHandler.obtainMessage(GET_STATION_DBG_PARAM, val, status).sendToTarget(); + } }; /* Radio Vars */ private Handler mHandler = new Handler(); @@ -2756,6 +3763,9 @@ public class FMStats extends Activity { }; private void stopCurTest() { + if (mRunTestThread != null) { + mRunTestThread.interrupt(); + } if (mTestRunning) { switch(mTestSelected) { case CUR_FREQ_TEST: diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl index 766961adab914077c0979345ac8ee748c085f903..50706af6df829d1d99a664f6b69cef51a3a38bfe 100644 --- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl +++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl @@ -76,5 +76,8 @@ interface IFMRadioService boolean isSSRInProgress(); boolean isRtPlusSupported(); boolean isA2DPConnected(); + boolean getIntfDetLowTh(); + boolean getIntfDetHighTh(); + boolean getRxRepeatCount(); } diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl index 826b5f3b5fdfb1a581511d4a339c959f3739d27c..f16c2d612f7b0aedab9a0e19792908aefc32399e 100644 --- a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl +++ b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl @@ -51,4 +51,13 @@ interface IFMRadioServiceCallbacks void onFmAudioPathStarted(); void onFmAudioPathStopped(); void onExtenCountryCodeChanged(); + void getSigThCb(int val, int status); + void getChDetThCb(int val, int status); + void DefDataRdCb(int val, int status); + void getBlendCb(int val, int status); + void setChDetThCb(int status); + void DefDataWrtCb(int status); + void setBlendCb(int status); + void getStationParamCb(int val, int status); + void getStationDbgParamCb(int val, int status); } diff --git a/helium/radio-helium-commands.h b/helium/radio-helium-commands.h index f76b7d22f8204c0995146544b988c3b3f545f943..3c9bbdca87c57a6ba213643054db221feea800f5 100644 --- a/helium/radio-helium-commands.h +++ b/helium/radio-helium-commands.h @@ -109,6 +109,7 @@ enum helium_cmd_t { HCI_FM_HELIUM_UPPER_BAND, HCI_FM_HELIUM_LOWER_BAND, HCI_FM_HELIUM_AUDIO_MODE, + HCI_FM_HELIUM_RMSSI, HCI_FM_HELIUM_AUDIO_MUTE, }; #endif /* __RADIO_CHEROKEE_COMMANDS_H */ diff --git a/helium/radio-helium.h b/helium/radio-helium.h index 98452d800d4b02005fd9dff9b886e917c4128f64..05fc309e16fc67223cab7818283eba5aac30f429 100644 --- a/helium/radio-helium.h +++ b/helium/radio-helium.h @@ -104,38 +104,41 @@ pthread_mutex_t fm_hal; #define FM_TX_PHY_CFG_LEN 0x10 #define FM_TX_PWR_GAIN_OFFSET 14 /**RDS CONFIG MODE**/ -#define FM_RDS_CNFG_MODE 0x0f -#define FM_RDS_CNFG_LEN 0x10 -#define AF_RMSSI_TH_LSB_OFFSET 10 -#define AF_RMSSI_TH_MSB_OFFSET 11 -#define AF_RMSSI_SAMPLES_OFFSET 15 +#define FM_RDS_CNFG_MODE 0x0f +#define FM_RDS_CNFG_LEN 0x10 +#define AF_RMSSI_TH_OFFSET 1 +#define AF_RMSSI_SAMPLES_OFFSET 2 /**RX CONFIG MODE**/ -#define FM_RX_CONFG_MODE 0x15 -#define FM_RX_CNFG_LEN 0x20 -#define GD_CH_RMSSI_TH_OFFSET 12 -#define MAX_GD_CH_RMSSI_TH 127 -#define SRCH_ALGO_TYPE_OFFSET 25 -#define SINRFIRSTSTAGE_OFFSET 26 -#define RMSSIFIRSTSTAGE_OFFSET 27 -#define CF0TH12_BYTE1_OFFSET 8 -#define CF0TH12_BYTE2_OFFSET 9 -#define CF0TH12_BYTE3_OFFSET 10 -#define CF0TH12_BYTE4_OFFSET 11 -#define MAX_SINR_FIRSTSTAGE 127 -#define MAX_RMSSI_FIRSTSTAGE 127 +#define FM_RX_CONFG_MODE 0x15 +#define FM_RX_CNFG_LEN 0x15 +#define GD_CH_RMSSI_TH_OFFSET 0x03 +#define MAX_GD_CH_RMSSI_TH 0x7F +#define SRCH_ALGO_TYPE_OFFSET 0x00 +#define SINRFIRSTSTAGE_OFFSET 0x01 +#define RMSSIFIRSTSTAGE_OFFSET 0x02 +#define CF0TH12_BYTE1_OFFSET 0x03 +#define CF0TH12_BYTE2_OFFSET 0x04 +#define MAX_SINR_FIRSTSTAGE 0x7F +#define MAX_RMSSI_FIRSTSTAGE 0x7F #define RDS_PS0_XFR_MODE 0x01 -#define RDS_PS0_LEN 6 -#define RX_REPEATE_BYTE_OFFSET 5 -#define FM_SPUR_TBL_SIZE 240 -#define SPUR_DATA_LEN 16 -#define ENTRIES_EACH_CMD 15 -#define SPUR_DATA_INDEX 2 -#define FM_AF_LIST_MAX_SIZE 200 +#define RDS_PS0_LEN 0x06 +#define RX_REPEATE_BYTE_OFFSET 0x05 +#define FM_SPUR_TBL_SIZE 0xF0 +#define SPUR_DATA_LEN 0x10 +#define ENTRIES_EACH_CMD 0x0F +#define SPUR_DATA_INDEX 0x02 +#define FM_AF_LIST_MAX_SIZE 0xC8 #define AF_LIST_MAX (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist - of sizeof(int) bytes */ -#define MAX_BLEND_INDEX 49 + of sizeof(int) bytes */ +#define MAX_BLEND_INDEX 0x31 + +#define FM_SRCH_CONFG_MODE 0x41 +#define FM_AFJUMP_CONFG_MODE 0x42 +#define FM_SRCH_CNFG_LEN 0x08 +#define FM_AFJUMP_CNFG_LEN 0x06 + /* HCI timeouts */ -#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */ +#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */ typedef enum { ASSOCIATE_JVM, @@ -164,6 +167,15 @@ typedef void (*fm_peek_cb)(char *peek_rsp); typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp); typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp); typedef void (*fm_ecc_evt_cb)(char *ecc_rsp); +typedef void (*fm_sig_thr_cb) (int val, int status); +typedef void (*fm_get_ch_det_thrs_cb) (int val, int status); +typedef void (*fm_def_data_rd_cb) (int val, int status); +typedef void (*fm_get_blnd_cb) (int val, int status); +typedef void (*fm_set_ch_det_thrs_cb) (int status); +typedef void (*fm_def_data_wrt_cb) (int status); +typedef void (*fm_set_blnd_cb) (int status); +typedef void (*fm_get_stn_prm_cb) (int val, int status); +typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status); typedef struct { size_t size; @@ -188,6 +200,15 @@ typedef struct { fm_ch_det_th_cb fm_ch_det_th_rsp_cb; fm_ecc_evt_cb ext_country_code_cb; callback_thread_event thread_evt_cb; + fm_sig_thr_cb fm_get_sig_thres_cb; + fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb; + fm_def_data_rd_cb fm_def_data_read_cb; + fm_get_blnd_cb fm_get_blend_cb; + fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb; + fm_def_data_wrt_cb fm_def_data_write_cb; + fm_set_blnd_cb fm_set_blend_cb; + fm_get_stn_prm_cb fm_get_station_param_cb; + fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb; } fm_vendor_callbacks_t; pthread_mutex_t radio_fm_cmd; @@ -304,11 +325,11 @@ struct radio_hci_dev { (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf) #define hci_trans_ctrl_cmd_op_pack(ocf) \ (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf) -#define hci_common_cmd_op_pack(ocf) \ +#define hci_common_cmd_op_pack(ocf) \ (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf) -#define hci_status_param_op_pack(ocf) \ +#define hci_status_param_op_pack(ocf) \ (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf) -#define hci_diagnostic_cmd_op_pack(ocf) \ +#define hci_diagnostic_cmd_op_pack(ocf) \ (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf) @@ -342,15 +363,15 @@ struct hci_fm_recv_conf_req { char ch_spacing; char rds_std; char hlsi; - int band_low_limit; - int band_high_limit; + int band_low_limit; + int band_high_limit; } ; /* ----- HCI Command request ----- */ struct hci_fm_trans_conf_req_struct { char emphasis; char rds_std; - int band_low_limit; + int band_low_limit; int band_high_limit; } ; @@ -467,21 +488,27 @@ struct hci_fm_ch_det_threshold { char sinr_samples; char low_th; char high_th; - } ; struct hci_fm_blend_table { - char ucBlendType; - char ucBlendRampRateUp; - char ucBlendDebounceNumSampleUp; - char ucBlendDebounceIdxUp; - char ucBlendSinrIdxSkipStep; - char scBlendSinrHi; - char scBlendRmssiHi; - char ucBlendIndexHi; - char ucBlendIndex[MAX_BLEND_INDEX]; + char BlendType; + char BlendRampRateUp; + char BlendDebounceNumSampleUp; + char BlendDebounceIdxUp; + char BlendSinrIdxSkipStep; + char BlendSinrHi; + char BlendRmssiHi; + char BlendIndexHi; + char BlendIndex[MAX_BLEND_INDEX]; } ; +struct hci_fm_def_data_rd { + char mode; + char length; + char param_len; + char param; +}; + /*HCI events*/ #define HCI_EV_TUNE_STATUS 0x01 #define HCI_EV_RDS_LOCK_STATUS 0x02 @@ -521,22 +548,22 @@ struct hci_fm_blend_table { /*RT PLUS*/ #define DUMMY_CLASS 0 #define RT_PLUS_LEN_1_TAG 3 -#define RT_ERT_FLAG_BIT 5 +#define RT_ERT_FLAG_BIT 5 /*TAG1*/ -#define TAG1_MSB_OFFSET 3 -#define TAG1_MSB_MASK 7 -#define TAG1_LSB_OFFSET 5 +#define TAG1_MSB_OFFSET 3 +#define TAG1_MSB_MASK 7 +#define TAG1_LSB_OFFSET 5 #define TAG1_POS_MSB_MASK 31 #define TAG1_POS_MSB_OFFSET 1 #define TAG1_POS_LSB_OFFSET 7 -#define TAG1_LEN_OFFSET 1 +#define TAG1_LEN_OFFSET 1 #define TAG1_LEN_MASK 63 /*TAG2*/ -#define TAG2_MSB_OFFSET 5 +#define TAG2_MSB_OFFSET 5 #define TAG2_MSB_MASK 1 -#define TAG2_LSB_OFFSET 3 +#define TAG2_LSB_OFFSET 3 #define TAG2_POS_MSB_MASK 7 #define TAG2_POS_MSB_OFFSET 3 #define TAG2_POS_LSB_OFFSET 5 @@ -544,7 +571,7 @@ struct hci_fm_blend_table { #define AGT_MASK 31 /*Extract 5 left most bits of lsb of 2nd block*/ -#define AGT(x) (x & AGT_MASK) +#define AGT(x) (x & AGT_MASK) /*16 bits of 4th block*/ #define AID(lsb, msb) ((msb << 8) | (lsb)) /*Extract 5 right most bits of msb of 2nd block*/ @@ -554,9 +581,9 @@ struct hci_fm_blend_table { #define RT_PLUS_AID 0x4bd7 /*ERT*/ -#define ERT_AID 0x6552 -#define CARRIAGE_RETURN 0x000D -#define MAX_ERT_SEGMENT 31 +#define ERT_AID 0x6552 +#define CARRIAGE_RETURN 0x000D +#define MAX_ERT_SEGMENT 31 #define ERT_FORMAT_DIR_BIT 1 #define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos) @@ -683,8 +710,7 @@ struct hci_fm_af_list_rsp { } ; struct hci_fm_data_rd_rsp { - char status; - char ret_data_len; + char data_len; char data[DEFAULT_DATA_SIZE]; } ; @@ -694,7 +720,6 @@ struct hci_fm_feature_list_rsp { } ; struct hci_fm_dbg_param_rsp { - char status; char blend; char soft_mute; char inf_blend; @@ -704,35 +729,35 @@ struct hci_fm_dbg_param_rsp { char in_det_out; } ; -#define CLKSPURID_INDEX0 0 -#define CLKSPURID_INDEX1 5 -#define CLKSPURID_INDEX2 10 -#define CLKSPURID_INDEX3 15 -#define CLKSPURID_INDEX4 20 -#define CLKSPURID_INDEX5 25 +#define CLKSPURID_INDEX0 0 +#define CLKSPURID_INDEX1 5 +#define CLKSPURID_INDEX2 10 +#define CLKSPURID_INDEX3 15 +#define CLKSPURID_INDEX4 20 +#define CLKSPURID_INDEX5 25 -#define MAX_SPUR_FREQ_LIMIT 30 -#define CKK_SPUR 0x3B -#define SPUR_DATA_SIZE 0x4 -#define SPUR_ENTRIES_PER_ID 0x5 +#define MAX_SPUR_FREQ_LIMIT 30 +#define CKK_SPUR 0x3B +#define SPUR_DATA_SIZE 0x4 +#define SPUR_ENTRIES_PER_ID 0x5 #define COMPUTE_SPUR(val) ((((val) - (76000)) / (50))) #define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF)) #define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5)) struct hci_fm_spur_data { - int freq[MAX_SPUR_FREQ_LIMIT]; + int freq[MAX_SPUR_FREQ_LIMIT]; char rmssi[MAX_SPUR_FREQ_LIMIT]; char enable[MAX_SPUR_FREQ_LIMIT]; } ; /* HCI dev events */ -#define RADIO_HCI_DEV_REG 1 -#define RADIO_HCI_DEV_WRITE 2 +#define RADIO_HCI_DEV_REG 1 +#define RADIO_HCI_DEV_WRITE 2 -#define hci_req_lock(d) mutex_lock(&d->req_lock) -#define hci_req_unlock(d) mutex_unlock(&d->req_lock) +#define hci_req_lock(d) mutex_lock(&d->req_lock) +#define hci_req_unlock(d) mutex_unlock(&d->req_lock) /* FM RDS */ #define RDS_PTYPE 2 @@ -824,7 +849,7 @@ enum spur_entry_levels { #define SRCH_MODE 0x07 #define SRCH_DIR 0x08 /* 0-up 1-down */ #define SCAN_DWELL 0x70 -#define SRCH_ON 0x80 +#define SRCH_ON 0x80 /* I/O Control */ #define IOC_HRD_MUTE 0x03 @@ -835,12 +860,12 @@ enum spur_entry_levels { #define IOC_ANTENNA 0x01 /* RDS Control */ -#define RDS_ON 0x01 +#define RDS_ON 0x01 #define RDS_BUF_SZ 100 /* constants */ -#define RDS_BLOCKS_NUM (4) -#define BYTES_PER_BLOCK (3) +#define RDS_BLOCKS_NUM (4) +#define BYTES_PER_BLOCK (3) #define MAX_PS_LENGTH (108) #define MAX_RT_LENGTH (64) #define RDS_GRP_CNTR_LEN (36) @@ -861,7 +886,7 @@ enum spur_entry_levels { #define GET_LSB(x)((x) & 0xFF) /* control options */ -#define CTRL_ON (1) +#define CTRL_ON (1) #define CTRL_OFF (0) /*Diagnostic commands*/ @@ -885,7 +910,7 @@ enum spur_entry_levels { #define MAX_CALIB_SIZE 75 /* Channel validity */ -#define INVALID_CHANNEL (0) +#define INVALID_CHANNEL (0) #define VALID_CHANNEL (1) struct hci_fm_set_cal_req_proc { @@ -1170,7 +1195,44 @@ struct helium_device { struct hci_fm_ssbi_req ssbi_data_accs; struct hci_fm_ssbi_peek ssbi_peek_reg; struct hci_fm_ch_det_threshold ch_det_threshold; + struct hci_fm_data_rd_rsp def_data; + struct hci_fm_blend_table blend_tbl; }; + +#define set_bit(flag, bit_pos) ((flag) |= (1 << (bit_pos))) +#define clear_bit(flag, bit_pos) ((flag) &= (~(1 << (bit_pos)))) +#define test_bit(flag, bit_pos) ((flag) & (1 << (bit_pos))) +#define clear_all_bit(flag) ((flag) &= (~0xFFFFFFFF)) +#define CMD_CHDET_SINR_TH (1) +#define CMD_CHDET_SINR_SAMPLE (2) +#define CMD_CHDET_INTF_TH_LOW (3) +#define CMD_CHDET_INTF_TH_HIGH (4) + +#define CMD_DEFRD_AF_RMSSI_TH (1) +#define CMD_DEFRD_AF_RMSSI_SAMPLE (2) +#define CMD_DEFRD_GD_CH_RMSSI_TH (3) +#define CMD_DEFRD_SEARCH_ALGO (4) +#define CMD_DEFRD_SINR_FIRST_STAGE (5) +#define CMD_DEFRD_RMSSI_FIRST_STAGE (6) +#define CMD_DEFRD_CF0TH12 (7) +#define CMD_DEFRD_TUNE_POWER (8) +#define CMD_DEFRD_REPEATCOUNT (9) + +#define CMD_STNPARAM_RSSI (1) +#define CMD_STNPARAM_SINR (2) +#define CMD_STNPARAM_INTF_DET_TH (3) + +#define CMD_STNDBGPARAM_BLEND (1) +#define CMD_STNDBGPARAM_SOFTMUTE (2) +#define CMD_STNDBGPARAM_INFBLEND (3) +#define CMD_STNDBGPARAM_INFSOFTMUTE (4) +#define CMD_STNDBGPARAM_PILOTPLL (5) +#define CMD_STNDBGPARAM_IOVERC (6) +#define CMD_STNDBGPARAM_INFDETOUT (7) + +#define CMD_BLENDTBL_SINR_HI (1) +#define CMD_BLENDTBL_RMSSI_HI (2) + int hci_fm_disable_recv_req(); int helium_search_list(struct hci_fm_search_station_list_req *s_list); int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch); @@ -1194,6 +1256,11 @@ int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data); int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data); int hci_fm_get_ch_det_th(); int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th); - +int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd); +int hci_fm_get_blend_req(); +int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl); +int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt); +int hci_fm_get_station_dbg_param_req(); +int hci_fm_get_station_cmd_param_req(); #endif /* __UAPI_RADIO_HCI_CORE_H */ diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c index 561c92af8aa5989c1e3dd4674018fccf7606e8f5..2a29f64d64801d75d73e087d327a96c121d5b656 100644 --- a/helium/radio_helium_hal.c +++ b/helium/radio_helium_hal.c @@ -36,6 +36,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "radio-helium.h" #include "fm_hci.h" #include <dlfcn.h> +#include <errno.h> fm_vendor_callbacks_t *jni_cb; int hci_fm_get_signal_threshold(); @@ -52,6 +53,12 @@ static unsigned char c_byt_pair_index; static char utf_8_flag; static char rt_ert_flag; static char formatting_dir; +static uint32_t ch_det_th_mask_flag; +static uint32_t def_data_rd_mask_flag; +static uint32_t blend_tbl_mask_flag; +static uint32_t station_param_mask_flag; +static uint32_t station_dbg_param_mask_flag; +uint64_t flag; #define LOG_TAG "radio_helium" static void radio_hci_req_complete(char result) @@ -76,6 +83,8 @@ static void hci_cc_fm_enable_rsp(char *ev_rsp) jni_cb->thread_evt_cb(0); radio_hci_req_complete(rsp->status); jni_cb->enabled_cb(); + if (rsp->status == FM_HC_STATUS_SUCCESS) + radio->mode = FM_RECV; } static void hci_cc_conf_rsp(char *ev_rsp) @@ -181,20 +190,179 @@ static void hci_cc_ssbi_peek_rsp(char *ev_buff) static void hci_cc_get_ch_det_threshold_rsp(char *ev_buff) { - char status; - + int status; + int val = 0; if (ev_buff == NULL) { ALOGE("%s:%s, buffer is null\n", LOG_TAG, __func__); return; } status = ev_buff[0]; - ALOGE("%s:%s, status =%d\n", LOG_TAG, __func__,status); - if (status < 0) { + ALOGV("%s:%s, status =%d\n", LOG_TAG, __func__,status); + if (status != 0) { ALOGE("%s:%s,ssbi peek failed=%d\n", LOG_TAG, __func__, status); - } - memcpy(&radio->ch_det_threshold, &ev_buff[1], + } else { + memcpy(&radio->ch_det_threshold, &ev_buff[1], sizeof(struct hci_fm_ch_det_threshold)); - radio_hci_req_complete(status); + radio_hci_req_complete(status); + + if (test_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH)) + val = radio->ch_det_threshold.sinr; + else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE)) + val = radio->ch_det_threshold.sinr_samples; + else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW)) + val = radio->ch_det_threshold.low_th; + else if (test_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH)) + val = radio->ch_det_threshold.high_th; + } + clear_all_bit(ch_det_th_mask_flag); + jni_cb->fm_get_ch_det_thr_cb(val, status); +} + +static void hci_cc_set_ch_det_threshold_rsp(char *ev_buff) +{ + int status = ev_buff[0]; + + jni_cb->fm_set_ch_det_thr_cb(status); +} + +static void hci_cc_sig_threshold_rsp(char *ev_buff) +{ + int status, val = -1; + ALOGD("hci_cc_sig_threshold_rsp"); + + status = ev_buff[0]; + + if (status != 0) { + ALOGE("%s: status= 0x%x", __func__, status); + } else { + val = ev_buff[1]; + } + jni_cb->fm_get_sig_thres_cb(val, status); +} + +static void hci_cc_default_data_read_rsp(char *ev_buff) +{ + int status, val= 0, data_len = 0; + + if (ev_buff == NULL) { + ALOGE("Response buffer is null"); + return; + } + status = ev_buff[0]; + if (status == 0) { + data_len = ev_buff[1]; + ALOGV("hci_cc_default_data_read_rsp:data_len = %d", data_len); + memcpy(&radio->def_data, &ev_buff[1], data_len + sizeof(char)); + + if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH)) { + val = radio->def_data.data[AF_RMSSI_TH_OFFSET]; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE)) { + val = radio->def_data.data[AF_RMSSI_SAMPLES_OFFSET]; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH)) { + val = radio->def_data.data[GD_CH_RMSSI_TH_OFFSET]; + if (val > MAX_GD_CH_RMSSI_TH) + val -= 256; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO)) { + val = radio->def_data.data[SRCH_ALGO_TYPE_OFFSET]; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE)) { + val = radio->def_data.data[SINRFIRSTSTAGE_OFFSET]; + if (val > MAX_SINR_FIRSTSTAGE) + val -= 256; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE)) { + val = radio->def_data.data[RMSSIFIRSTSTAGE_OFFSET]; + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12)) { + val = (radio->def_data.data[CF0TH12_BYTE1_OFFSET] | + (radio->def_data.data[CF0TH12_BYTE2_OFFSET] << 8)); + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_TUNE_POWER)) { + } else if (test_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT)) { + val = radio->def_data.data[RX_REPEATE_BYTE_OFFSET]; + } + } else { + ALOGE("%s: Error: Status= 0x%x", __func__, status); + } + clear_all_bit(def_data_rd_mask_flag); + jni_cb->fm_def_data_read_cb(val, status); +} + +static void hci_cc_default_data_write_rsp(char *ev_buff) +{ + int status = ev_buff[0]; + + jni_cb->fm_def_data_write_cb(status); +} + +static void hci_cc_get_blend_tbl_rsp(char *ev_buff) +{ + int status, val; + + if (ev_buff == NULL) { + ALOGE("%s:response buffer in null", LOG_TAG); + return; + } + + status = ev_buff[0]; + if (status != 0) { + ALOGE("%s: status = 0x%x", LOG_TAG, status); + } else { + memcpy(&radio->blend_tbl, &ev_buff[1], + sizeof(struct hci_fm_blend_table)); + + ALOGE("hci_cc_get_blend_tbl_rsp: data"); + int i; + for (i = 0; i < 8; i++) + ALOGE("data[%d] = 0x%x", i, ev_buff[1 + i]); + if (test_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI)) { + val = radio->blend_tbl.BlendSinrHi; + } else if (test_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI)) { + val = radio->blend_tbl.BlendRmssiHi; + } + } + clear_all_bit(blend_tbl_mask_flag); + jni_cb->fm_get_blend_cb(val, status); +} + +static void hci_cc_set_blend_tbl_rsp(char *ev_buff) +{ + int status = ev_buff[0]; + + jni_cb->fm_set_blend_cb(status); +} + +static void hci_cc_station_rsp(char *ev_buff) +{ + int val, status = ev_buff[0]; + + if (status == FM_HC_STATUS_SUCCESS) { + memcpy(&radio->fm_st_rsp.station_rsp.station_freq, &ev_buff[1], + sizeof(struct hci_fm_station_rsp) - sizeof(char)); + if (test_bit(station_param_mask_flag, CMD_STNPARAM_RSSI)) { + val = radio->fm_st_rsp.station_rsp.rssi; + } else if (test_bit(station_param_mask_flag, CMD_STNPARAM_SINR)) { + val = radio->fm_st_rsp.station_rsp.sinr; + } + } + ALOGE("hci_cc_station_rsp: val =%x, status = %x", val, status); + + jni_cb->fm_get_station_param_cb(val, status); + clear_all_bit(station_param_mask_flag); +} + +static void hci_cc_dbg_param_rsp(char *ev_buff) +{ + int val, status = ev_buff[0]; + + if (status == FM_HC_STATUS_SUCCESS) { + memcpy(&radio->st_dbg_param, &ev_buff[1], + sizeof(struct hci_fm_dbg_param_rsp)); + if (test_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT)) { + val = radio->st_dbg_param.in_det_out; + } else if (test_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC)) { + val = radio->st_dbg_param.io_verc; + } + } + ALOGE("hci_cc_dbg_param_rsp: val =%x, status = %x", val, status); + jni_cb->fm_get_station_debug_param_cb(val, status); + clear_all_bit(station_dbg_param_mask_flag); } static inline void hci_cmd_complete_event(char *buff) @@ -233,11 +401,11 @@ static inline void hci_cmd_complete_event(char *buff) case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_RDS_GRP_PROCESS): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_WAN_AVD_CTRL): case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_EN_NOTCH_CTRL): - case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD): - case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_BLND_TBL): - case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE): hci_cc_rsp(pbuf); break; + case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_CH_DET_THRESHOLD): + hci_cc_set_ch_det_threshold_rsp(pbuf); + break; case hci_common_cmd_op_pack(HCI_OCF_FM_RESET): case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_SSBI_POKE_REG): case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_POKE_DATA): @@ -257,17 +425,34 @@ static inline void hci_cmd_complete_event(char *buff) hci_cc_ssbi_peek_rsp(buff); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_CH_DET_THRESHOLD): - hci_cc_get_ch_det_threshold_rsp(buff); - break; -/* case hci_common_cmd_op_pack(HCI_OCF_FM_GET_SPUR_TABLE): - hci_cc_get_spur_tbl(buff); + hci_cc_get_ch_det_threshold_rsp(pbuf); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_SIGNAL_THRESHOLD): - hci_cc_sig_threshold_rsp(buff); + hci_cc_sig_threshold_rsp(pbuf); + break; + case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_READ): + hci_cc_default_data_read_rsp(pbuf); + break; + case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_WRITE): + hci_cc_default_data_write_rsp(pbuf); + break; + case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_BLND_TBL): + hci_cc_get_blend_tbl_rsp(pbuf); + break; + case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_BLND_TBL): + hci_cc_set_blend_tbl_rsp(pbuf); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_STATION_PARAM_REQ): - hci_cc_station_rsp(buff); + hci_cc_station_rsp(pbuf); + break; + + case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_STATION_DBG_PARAM): + hci_cc_dbg_param_rsp(pbuf); + break; + +/* case hci_common_cmd_op_pack(HCI_OCF_FM_GET_SPUR_TABLE): + hci_cc_get_spur_tbl(buff); break; case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ): @@ -282,17 +467,10 @@ static inline void hci_cmd_complete_event(char *buff) hci_cc_af_list_rsp(buff); break; - case hci_common_cmd_op_pack(HCI_OCF_FM_DEFAULT_DATA_READ): - hci_cc_riva_read_default_rsp(buff); - break; - case hci_common_cmd_op_pack(HCI_OCF_FM_GET_FEATURE_LIST): hci_cc_feature_list_rsp(buff); break; - case hci_diagnostic_cmd_op_pack(HCI_OCF_FM_STATION_DBG_PARAM): - hci_cc_dbg_param_rsp(buff); - break; case hci_status_param_op_pack(HCI_OCF_FM_READ_GRP_COUNTERS): hci_cc_rds_grp_cntrs_rsp(buff); break; @@ -300,9 +478,6 @@ static inline void hci_cmd_complete_event(char *buff) hci_cc_do_calibration_rsp(buff); break; - case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_GET_BLND_TBL): - hci_cc_get_blend_tbl_rsp(buff); - break; default: ALOGE("opcode 0x%x", opcode); break; */ @@ -733,7 +908,7 @@ static void hci_ev_raw_rds_group_data(char *buff) } } -void radio_hci_event_packet(char *evt_buf) +static void radio_hci_event_packet(char *evt_buf) { char evt; @@ -947,8 +1122,11 @@ static int set_fm_ctrl(int cmd, int val) char temp_val = 0; unsigned int rds_grps_proc = 0; char *data; + struct hci_fm_def_data_wr_req def_data_wrt; + ALOGE("%s:cmd: %x, val: %d",LOG_TAG, cmd, val); + switch (cmd) { case HCI_FM_HELIUM_AUDIO_MUTE: saved_val = radio->mute_mode.hard_mute; @@ -960,10 +1138,16 @@ static int set_fm_ctrl(int cmd, int val) } break; case HCI_FM_HELIUM_SRCHMODE: + if (is_valid_srch_mode(val)) radio->g_search_mode = val; + else + ret = -EINVAL; break; case HCI_FM_HELIUM_SCANDWELL: + if (is_valid_scan_dwell_prd(val)) radio->g_scan_time = val; + else + ret = -EINVAL; break; case HCI_FM_HELIUM_SRCHON: helium_search_req(val, SRCH_DIR_UP); @@ -989,18 +1173,28 @@ static int set_fm_ctrl(int cmd, int val) ret = helium_set_sig_threshold_req(temp_val); if (ret < 0) { ALOGE("%s:Error while setting signal threshold\n", LOG_TAG); - goto END; + goto end; } break; case HCI_FM_HELIUM_SRCH_PTY: - radio->srch_rds.srch_pty = val; - radio->srch_st_list.srch_pty = val; + if (is_valid_pty(val)) { + radio->srch_rds.srch_pty = val; + radio->srch_st_list.srch_pty = val; + } else { + ret = -EINVAL; + } break; case HCI_FM_HELIUM_SRCH_PI: - radio->srch_rds.srch_pi = val; + if (is_valid_pi(val)) + radio->srch_rds.srch_pi = val; + else + ret = -EINVAL; break; case HCI_FM_HELIUM_SRCH_CNT: - radio->srch_st_list.srch_list_max = val; + if (is_valid_srch_station_cnt(val)) + radio->srch_st_list.srch_list_max = val; + else + ret = -EINVAL; break; case HCI_FM_HELIUM_SPACING: saved_val = radio->recv_conf.ch_spacing; @@ -1009,7 +1203,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:Error in setting channel spacing", LOG_TAG); radio->recv_conf.ch_spacing = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_EMPHASIS: @@ -1019,7 +1213,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:Error in setting emphasis", LOG_TAG); radio->recv_conf.emphasis = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_RDS_STD: @@ -1029,7 +1223,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:Error in rds_std", LOG_TAG); radio->recv_conf.rds_std = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_RDSON: @@ -1039,7 +1233,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:Error in rds_std", LOG_TAG); radio->recv_conf.rds_std = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_RDSGROUP_MASK: @@ -1052,7 +1246,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:error in setting group mask\n", LOG_TAG); radio->rds_grp.rds_grp_enable_mask = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_RDSGROUP_PROC: @@ -1062,7 +1256,7 @@ static int set_fm_ctrl(int cmd, int val) ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps); if (ret < 0) { radio->g_rds_grp_proc_ps = saved_val; - goto END; + goto end; } break; @@ -1071,7 +1265,7 @@ static int set_fm_ctrl(int cmd, int val) ret = hci_fm_get_rds_grpcounters_req(val); if (ret < 0) { radio->g_rds_grp_proc_ps = saved_val; - goto END; + goto end; } break; @@ -1079,7 +1273,7 @@ static int set_fm_ctrl(int cmd, int val) ALOGD("%s: set notch filter notch=%d ", LOG_TAG,val); ret = hci_fm_set_notch_filter_req(val); if (ret < 0) { - goto END; + goto end; } break; @@ -1093,7 +1287,7 @@ static int set_fm_ctrl(int cmd, int val) ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps); if (ret < 0) { radio->g_rds_grp_proc_ps = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_AF_JUMP: @@ -1106,7 +1300,7 @@ static int set_fm_ctrl(int cmd, int val) ret = helium_rds_grp_process_req(radio->g_rds_grp_proc_ps); if (ret < 0) { radio->g_rds_grp_proc_ps = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_LP_MODE: @@ -1117,7 +1311,7 @@ static int set_fm_ctrl(int cmd, int val) ret = helium_set_antenna_req(temp_val); if (ret < 0) { ALOGE("%s:Set Antenna failed retval = %x", LOG_TAG, ret); - goto END; + goto end; } radio->g_antenna = val; break; @@ -1128,7 +1322,7 @@ static int set_fm_ctrl(int cmd, int val) if (ret < 0) { ALOGE("%s:Error while setting FM soft mute %d", LOG_TAG, ret); radio->mute_mode.soft_mute = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_FREQ: @@ -1156,7 +1350,7 @@ static int set_fm_ctrl(int cmd, int val) } else { ret = -1; ALOGE("%s: riva access len is not valid\n", LOG_TAG); - goto END; + goto end; } break; case HCI_FM_HELIUM_RIVA_PEEK: @@ -1172,7 +1366,7 @@ static int set_fm_ctrl(int cmd, int val) } else { ALOGE("%s: riva access len is not valid for poke\n", LOG_TAG); ret = -1; - goto END; + goto end; } break; case HCI_FM_HELIUM_SSBI_ACCS_ADDR: @@ -1190,97 +1384,142 @@ static int set_fm_ctrl(int cmd, int val) if (!is_valid_sinr_samples(val)) { ALOGE("%s: sinr samples count is not valid\n", __func__); ret = -1; - goto END; - } - ret = hci_fm_get_ch_det_th(); - if (ret < 0) { - ALOGE("Failed to get chnl det thresholds %d", ret); - goto END; + goto end; } - saved_val = radio->ch_det_threshold.sinr_samples; radio->ch_det_threshold.sinr_samples = val; ret = set_ch_det_thresholds_req(&radio->ch_det_threshold); if (ret < 0) { ALOGE("Failed to set SINR samples %d", ret); - radio->ch_det_threshold.sinr_samples = saved_val; - goto END; + goto end; } break; case HCI_FM_HELIUM_SINR_THRESHOLD: if (!is_valid_sinr_th(val)) { - ALOGE("%s: sinr threshold is not valid\n"); + ALOGE("%s: sinr threshold is not valid\n", __func__); ret = -1; - goto END; + goto end; } - ret = hci_fm_get_ch_det_th(); - if (ret < 0) { - ALOGE("Failed to get chnl det thresholds %d", ret); - goto END; - } - saved_val = radio->ch_det_threshold.sinr; radio->ch_det_threshold.sinr = val; ret = set_ch_det_thresholds_req(&radio->ch_det_threshold); - if (ret < 0) { - ALOGE("Failed to set SINR threshold %d", ret); - radio->ch_det_threshold.sinr = saved_val; - goto END; - } break; case HCI_FM_HELIUM_INTF_LOW_THRESHOLD: if (!is_valid_intf_det_low_th(val)) { ALOGE("%s: intf det low threshold is not valid\n", __func__); ret = -1; - goto END; + goto end; } - ret = hci_fm_get_ch_det_th(); - if (ret < 0) { - ALOGE("Failed to get chnl det thresholds %d", ret); - goto END; - } - saved_val = radio->ch_det_threshold.low_th; radio->ch_det_threshold.low_th = val; ret = set_ch_det_thresholds_req(&radio->ch_det_threshold); - if (ret < 0) { - ALOGE("Failed to Set Low det threshold %d", ret); - radio->ch_det_threshold.low_th = saved_val; - goto END; - } break; case HCI_FM_HELIUM_INTF_HIGH_THRESHOLD: if (!is_valid_intf_det_hgh_th(val)) { ALOGE("%s: intf high threshold is not valid\n", __func__); ret = -1; - goto END; + goto end; } - ret = hci_fm_get_ch_det_th(); - if (ret < 0) { - ALOGE("Failed to get chnl det thresholds %d", ret); - goto END; - } - saved_val = radio->ch_det_threshold.high_th; radio->ch_det_threshold.high_th = val; ret = set_ch_det_thresholds_req(&radio->ch_det_threshold); - if (ret < 0) { - ALOGE("Failed to set High det threshold %d ", ret); - radio->ch_det_threshold.high_th = saved_val; - goto END; + break; + case HCI_FM_HELIUM_SINRFIRSTSTAGE: + def_data_wrt.mode = FM_SRCH_CONFG_MODE; + def_data_wrt.length = FM_SRCH_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[SINRFIRSTSTAGE_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_RMSSIFIRSTSTAGE: + def_data_wrt.mode = FM_SRCH_CONFG_MODE; + def_data_wrt.length = FM_SRCH_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[RMSSIFIRSTSTAGE_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_CF0TH12: + def_data_wrt.mode = FM_SRCH_CONFG_MODE; + def_data_wrt.length = FM_SRCH_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[CF0TH12_BYTE1_OFFSET] = (val & 0xFF); + def_data_wrt.data[CF0TH12_BYTE2_OFFSET] = ((val >> 8) & 0xFF); + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_SRCHALGOTYPE: + def_data_wrt.mode = FM_SRCH_CONFG_MODE; + def_data_wrt.length = FM_SRCH_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[SRCH_ALGO_TYPE_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_AF_RMSSI_TH: + def_data_wrt.mode = FM_AFJUMP_CONFG_MODE; + def_data_wrt.length = FM_AFJUMP_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[AF_RMSSI_TH_OFFSET] = (val & 0xFF); + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_GOOD_CH_RMSSI_TH: + def_data_wrt.mode = FM_AFJUMP_CONFG_MODE; + def_data_wrt.length = FM_AFJUMP_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[GD_CH_RMSSI_TH_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_AF_RMSSI_SAMPLES: + def_data_wrt.mode = FM_AFJUMP_CONFG_MODE; + def_data_wrt.length = FM_AFJUMP_CNFG_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[AF_RMSSI_SAMPLES_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_RXREPEATCOUNT: + def_data_wrt.mode = RDS_PS0_XFR_MODE; + def_data_wrt.length = RDS_PS0_LEN; + memcpy(&def_data_wrt.data, &radio->def_data.data, + radio->def_data.data_len); + def_data_wrt.data[AF_RMSSI_SAMPLES_OFFSET] = val; + ret = hci_fm_default_data_write_req(&def_data_wrt); + break; + case HCI_FM_HELIUM_BLEND_SINRHI: + if (!is_valid_blend_value(val)) { + ALOGE("%s: sinr samples count is not valid\n", __func__); + ret = -1; + goto end; } + radio->blend_tbl.BlendSinrHi = val; + ret = hci_fm_set_blend_tbl_req(&radio->blend_tbl); + break; + case HCI_FM_HELIUM_BLEND_RMSSIHI: + if (!is_valid_blend_value(val)) { + ALOGE("%s: sinr samples count is not valid\n", __func__); + ret = -1; + goto end; + } + radio->blend_tbl.BlendRmssiHi = val; + ret = hci_fm_set_blend_tbl_req(&radio->blend_tbl); break; default: ALOGE("%s:%s: Not a valid FM CMD!!", LOG_TAG, __func__); ret = 0; break; } -END: +end: if (ret < 0) ALOGE("%s:%s: %d cmd failed", LOG_TAG, __func__, cmd); return ret; } -static void get_fm_ctrl(int cmd, int val) +static int get_fm_ctrl(int cmd, int val) { int ret = 0; + struct hci_fm_def_data_rd_req def_data_rd; + ALOGE("%s: cmd = 0x%x", __func__, cmd); switch(cmd) { case HCI_FM_HELIUM_FREQ: val = radio->fm_st_rsp.station_rsp.station_freq; @@ -1292,24 +1531,127 @@ static void get_fm_ctrl(int cmd, int val) val = radio->recv_conf.band_low_limit; break; case HCI_FM_HELIUM_SINR_SAMPLES: + set_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE); ret = hci_fm_get_ch_det_th(); - if (ret == 0) - val = radio->ch_det_threshold.sinr_samples; + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_SAMPLE); break; case HCI_FM_HELIUM_SINR_THRESHOLD: + set_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH); ret = hci_fm_get_ch_det_th(); - if (ret == 0) - val = radio->ch_det_threshold.sinr; + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(ch_det_th_mask_flag, CMD_CHDET_SINR_TH); break; case HCI_FM_HELIUM_INTF_LOW_THRESHOLD: + set_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW); ret = hci_fm_get_ch_det_th(); - if (ret == 0) - val = radio->ch_det_threshold.low_th; + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_LOW); break; case HCI_FM_HELIUM_INTF_HIGH_THRESHOLD: + set_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH); ret = hci_fm_get_ch_det_th(); - if (ret == 0) - val = radio->ch_det_threshold.high_th; + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(ch_det_th_mask_flag, CMD_CHDET_INTF_TH_HIGH); + break; + case HCI_FM_HELIUM_SINRFIRSTSTAGE: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_SINR_FIRST_STAGE); + def_data_rd.mode = FM_SRCH_CONFG_MODE; + def_data_rd.length = FM_SRCH_CNFG_LEN; + goto cmd; + case HCI_FM_HELIUM_RMSSIFIRSTSTAGE: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_RMSSI_FIRST_STAGE); + def_data_rd.mode = FM_SRCH_CONFG_MODE; + def_data_rd.length = FM_SRCH_CNFG_LEN; + goto cmd; + case HCI_FM_HELIUM_CF0TH12: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_CF0TH12); + def_data_rd.mode = FM_SRCH_CONFG_MODE; + def_data_rd.length = FM_SRCH_CNFG_LEN; + goto cmd; + case HCI_FM_HELIUM_SRCHALGOTYPE: + def_data_rd.mode = FM_SRCH_CONFG_MODE; + def_data_rd.length = FM_SRCH_CNFG_LEN; + set_bit(def_data_rd_mask_flag, CMD_DEFRD_SEARCH_ALGO); + goto cmd; + case HCI_FM_HELIUM_AF_RMSSI_TH: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_TH); + def_data_rd.mode = FM_AFJUMP_CONFG_MODE; + def_data_rd.length = FM_AFJUMP_CNFG_LEN; + goto cmd; + case HCI_FM_HELIUM_GOOD_CH_RMSSI_TH: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_GD_CH_RMSSI_TH); + def_data_rd.mode = FM_AFJUMP_CONFG_MODE; + def_data_rd.length = FM_AFJUMP_CNFG_LEN; + goto cmd; + case HCI_FM_HELIUM_AF_RMSSI_SAMPLES: + set_bit(def_data_rd_mask_flag, CMD_DEFRD_AF_RMSSI_SAMPLE); + def_data_rd.mode = FM_AFJUMP_CONFG_MODE; + def_data_rd.length = FM_AFJUMP_CNFG_LEN; + +cmd: + def_data_rd.param_len = 0; + def_data_rd.param = 0; + + ret = hci_fm_default_data_read_req(&def_data_rd); + if (ret != FM_HC_STATUS_SUCCESS) + clear_all_bit(def_data_rd_mask_flag); + break; + case HCI_FM_HELIUM_RXREPEATCOUNT: + def_data_rd.mode = RDS_PS0_XFR_MODE; + def_data_rd.length = RDS_PS0_LEN; + def_data_rd.param_len = 0; + def_data_rd.param = 0; + set_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT); + + ret = hci_fm_default_data_read_req(&def_data_rd); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(def_data_rd_mask_flag, CMD_DEFRD_REPEATCOUNT); + break; + case HCI_FM_HELIUM_BLEND_SINRHI: + set_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI); + ret = hci_fm_get_blend_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(blend_tbl_mask_flag, CMD_BLENDTBL_SINR_HI); + case HCI_FM_HELIUM_BLEND_RMSSIHI: + set_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI); + ret = hci_fm_get_blend_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(blend_tbl_mask_flag, CMD_BLENDTBL_RMSSI_HI); + break; + case HCI_FM_HELIUM_IOVERC: + set_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC); + ret = hci_fm_get_station_dbg_param_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_IOVERC); + break; + case HCI_FM_HELIUM_INTDET: + set_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT); + ret = hci_fm_get_station_dbg_param_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(station_dbg_param_mask_flag, CMD_STNDBGPARAM_INFDETOUT); + break; + case HCI_FM_HELIUM_GET_SINR: + if (radio->mode == FM_RECV) { + set_bit(station_param_mask_flag, CMD_STNPARAM_SINR); + ret = hci_fm_get_station_cmd_param_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(station_param_mask_flag, CMD_STNPARAM_SINR); + } else { + ALOGE("HCI_FM_HELIUM_GET_SINR: radio is not in recv mode"); + ret = -EINVAL; + } + break; + case HCI_FM_HELIUM_RMSSI: + if (radio->mode == FM_RECV) { + set_bit(station_param_mask_flag, CMD_STNPARAM_RSSI); + ret = hci_fm_get_station_cmd_param_req(); + if (ret != FM_HC_STATUS_SUCCESS) + clear_bit(station_param_mask_flag, CMD_STNPARAM_RSSI); + } else if (radio->mode == FM_TRANS) { + ALOGE("HCI_FM_HELIUM_RMSSI: radio is not in recv mode"); + ret = -EINVAL; + } break; default: break; diff --git a/helium/radio_helium_hal_cmds.c b/helium/radio_helium_hal_cmds.c index df79d75cdd6f9b604224a05281e0c85026ed2e94..ea0b3c26791727db21123f3ba720ecaca112112e 100644 --- a/helium/radio_helium_hal_cmds.c +++ b/helium/radio_helium_hal_cmds.c @@ -47,32 +47,28 @@ static int send_fm_cmd_pkt(uint16_t opcode, uint32_t len, void *param) FM_HDR *hdr = (FM_HDR *) malloc(p_len); if (!hdr) { ALOGE("%s:hdr allocation failed", LOG_TAG); - return -1; + return -FM_HC_STATUS_NOMEM; } - ALOGE("%s:%s: Sizeof FM_HDR: %d", LOG_TAG, __func__, sizeof(FM_HDR)); - ALOGE("%s:opcode: %x", LOG_TAG, opcode); + ALOGV("%s:opcode: %x", LOG_TAG, opcode); - hdr->protocol_byte = 0x11; + hdr->protocol_byte = RADIO_HCI_COMMAND_PKT; hdr->opcode = opcode; hdr->plen = len; if (len) memcpy(hdr->cmd_params, (uint8_t *)param, len); - ALOGE("%s:calling transmit", __func__); - transmit(hdr); - ALOGE("%s:transmit success",__func__); - return 0; + ret = transmit(hdr); + ALOGV("%s:transmit done. status = %d", __func__, ret); + return ret; } int hci_fm_get_signal_threshold() { + uint16_t opcode = 0; - FM_HDR *hdr = (FM_HDR *) malloc(sizeof(FM_HDR)); - hdr->protocol_byte = FM_CMD; - hdr->opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_GET_SIGNAL_THRESHOLD); - hdr->plen = 0; - transmit(hdr); - return 0; + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_GET_SIGNAL_THRESHOLD); + return send_fm_cmd_pkt(opcode, 0, NULL); } int hci_fm_enable_recv_req() @@ -109,7 +105,7 @@ int helium_search_list(struct hci_fm_search_station_list_req *s_list) if (s_list == NULL) { ALOGE("%s:%s, search list param is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SEARCH_STATIONS_LIST); @@ -122,7 +118,7 @@ int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch) if (rds_srch == NULL) { ALOGE("%s:%s, rds stations param is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SEARCH_RDS_STATIONS); @@ -135,7 +131,7 @@ int helium_search_stations(struct hci_fm_search_station_req *srch) if (srch == NULL) { ALOGE("%s:%s, search station param is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SEARCH_STATIONS); @@ -157,7 +153,7 @@ int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf) if (conf == NULL) { ALOGE("%s:%s, recv conf is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SET_RECV_CONF_REQ); @@ -198,11 +194,11 @@ int helium_set_sig_threshold_req(char th) if (th == NULL) { ALOGE("%s:Threshold value NULL", LOG_TAG); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SET_SIGNAL_THRESHOLD); - return send_fm_cmd_pkt(opcode, sizeof(th), th); + return send_fm_cmd_pkt(opcode, sizeof(th), &th); } int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk) @@ -251,7 +247,7 @@ int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute) if (mute == NULL) { ALOGE("%s:%s, mute mode is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SET_MUTE_MODE_REQ); @@ -263,7 +259,7 @@ int hci_fm_tune_station_req(int param) uint16_t opcode = 0; int tune_freq = param; - ALOGE("%s:tune_freq: %d", LOG_TAG, tune_freq); + ALOGV("%s:tune_freq: %d", LOG_TAG, tune_freq); opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, HCI_OCF_FM_TUNE_STATION_REQ); return send_fm_cmd_pkt(opcode, sizeof(tune_freq), &tune_freq); @@ -277,7 +273,7 @@ int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param) if (stereo_mode_req == NULL) { ALOGE("%s:%s, stere mode req is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SET_STEREO_MODE_REQ); @@ -291,7 +287,7 @@ int hci_peek_data(struct hci_fm_riva_data *data) if (data == NULL) { ALOGE("%s:%s, peek data req is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, HCI_OCF_FM_PEEK_DATA); @@ -304,7 +300,7 @@ int hci_poke_data(struct hci_fm_riva_poke *data) if (data == NULL) { ALOGE("%s:%s, poke data req is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, HCI_OCF_FM_POKE_DATA); @@ -317,7 +313,7 @@ int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data) if (data == NULL) { ALOGE("%s:%s,SSBI poke data req is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, HCI_OCF_FM_SSBI_POKE_REG); @@ -330,7 +326,7 @@ int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data) if (data == NULL) { ALOGE("%s:%s,SSBI peek data req is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, HCI_OCF_FM_SSBI_PEEK_REG); @@ -339,8 +335,9 @@ int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data) int hci_fm_get_ch_det_th() { + ALOGV("%s", __func__); uint16_t opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, - HCI_OCF_FM_GET_CH_DET_THRESHOLD); + HCI_OCF_FM_GET_CH_DET_THRESHOLD); return send_fm_cmd_pkt(opcode, 0, NULL); } @@ -350,9 +347,81 @@ int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th) if (ch_det_th == NULL) { ALOGE("%s,%s channel det thrshld is null\n", LOG_TAG, __func__); - return -1; + return -EINVAL; } opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, HCI_OCF_FM_SET_CH_DET_THRESHOLD); return send_fm_cmd_pkt(opcode, sizeof((*ch_det_th)), ch_det_th); } + +int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd) +{ + uint16_t opcode = 0; + + if (def_data_rd == NULL) { + ALOGE("Def data read param is null"); + return -EINVAL; + } + + opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, + HCI_OCF_FM_DEFAULT_DATA_READ); + return send_fm_cmd_pkt(opcode, sizeof(struct hci_fm_def_data_rd_req), + def_data_rd); +} + +int hci_fm_get_blend_req() +{ + uint16_t opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_GET_BLND_TBL); + return send_fm_cmd_pkt(opcode, 0, NULL); +} + +int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl) +{ + int opcode = 0; + + if (blnd_tbl == NULL) { + ALOGE("Req param is null"); + return -EINVAL; + } + + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_SET_BLND_TBL); + return send_fm_cmd_pkt(opcode, sizeof(struct hci_fm_blend_table), + blnd_tbl); +} + +int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt) +{ + int opcode = 0; + + if (data_wrt == NULL) { + ALOGE("req param is null"); + return -EINVAL; + } + + opcode = hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, + HCI_OCF_FM_DEFAULT_DATA_WRITE); + return send_fm_cmd_pkt(opcode, data_wrt->length + sizeof(char) * 2, + data_wrt); +} + +int hci_fm_get_station_cmd_param_req() +{ + int opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, + HCI_OCF_FM_GET_STATION_PARAM_REQ); + return send_fm_cmd_pkt(opcode, 0, NULL); +} + +int hci_fm_get_station_dbg_param_req() +{ + int opcode = 0; + + opcode = hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, + HCI_OCF_FM_STATION_DBG_PARAM); + return send_fm_cmd_pkt(opcode, 0, NULL); +} diff --git a/jni/FmConst.h b/jni/FmConst.h index 8c8d6f47fcec4452d38f033a15a02af9c12d2c90..26eb616fa09aeda9b0a9a05fa9dc2cdd2ec759e5 100644 --- a/jni/FmConst.h +++ b/jni/FmConst.h @@ -152,6 +152,7 @@ enum FM_V4L2_PRV_CONTROLS V4L2_CID_PRV_IRIS_UPPER_BAND, V4L2_CID_PRV_IRIS_LOWER_BAND, V4L2_CID_PRV_IRIS_AUDIO_MODE, + V4L2_CID_PRV_IRIS_RMSSI, }; #endif diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp index 21528bbf70ed1dbc3097d3b0aa55c37d31e0c505..d1857e4ffacc268c674ba37600dce10150fa154b 100644 --- a/jni/android_hardware_fm.cpp +++ b/jni/android_hardware_fm.cpp @@ -108,6 +108,15 @@ typedef void (*fm_peek_cb)(char *peek_rsp); typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp); typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp); typedef void (*fm_ecc_evt_cb)(char *ecc); +typedef void (*fm_sig_thr_cb)(int val, int status); +typedef void (*fm_get_ch_det_thrs_cb) (int val, int status); +typedef void (*fm_def_data_rd_cb) (int val, int status); +typedef void (*fm_get_blnd_cb) (int val, int status); +typedef void (*fm_set_ch_det_thrs_cb) (int status); +typedef void (*fm_def_data_wrt_cb) (int status); +typedef void (*fm_set_blnd_cb) (int status); +typedef void (*fm_get_stn_prm_cb) (int val, int status); +typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status); static JNIEnv *mCallbackEnv = NULL; static jobject mCallbacksObj = NULL; @@ -129,6 +138,15 @@ jmethodID method_srchListCallback; jmethodID method_stereostsCallback; jmethodID method_rdsAvlStsCallback; jmethodID method_disableCallback; +jmethodID method_getSigThCallback; +jmethodID method_getChDetThrCallback; +jmethodID method_defDataRdCallback; +jmethodID method_getBlendCallback; +jmethodID method_setChDetThrCallback; +jmethodID method_defDataWrtCallback; +jmethodID method_setBlendCallback; +jmethodID method_getStnParamCallback; +jmethodID method_getStnDbgParamCallback; static bool checkCallbackThread() { JNIEnv* env = AndroidRuntime::getJNIEnv(); @@ -142,55 +160,55 @@ static bool checkCallbackThread() { } void fm_enabled_cb() { - ALOGE("Entered %s", __func__); + ALOGD("Entered %s", __func__); if (mCallbackEnv != NULL) { ALOGE("javaObjectRef creating"); jobject javaObjectRef = mCallbackEnv->NewObject(javaClassRef, method_enableCallback); mCallbacksObj = javaObjectRef; ALOGE("javaObjectRef = %p mCallbackobject =%p \n",javaObjectRef,mCallbacksObj); } - ALOGE("exit %s", __func__); + ALOGD("exit %s", __func__); } void fm_tune_cb(int Freq) { - ALOGE("TUNE:Freq:%d", Freq); + ALOGD("TUNE:Freq:%d", Freq); mCallbackEnv->CallVoidMethod(mCallbacksObj, method_tuneCallback, (jint) Freq); } void fm_seek_cmpl_cb(int Freq) { - ALOGE("SEEK_CMPL: Freq: %d", Freq); + ALOGI("SEEK_CMPL: Freq: %d", Freq); mCallbackEnv->CallVoidMethod(mCallbacksObj, method_seekCmplCallback, (jint) Freq); } void fm_scan_next_cb() { - ALOGE("SCAN_NEXT"); + ALOGI("SCAN_NEXT"); mCallbackEnv->CallVoidMethod(mCallbacksObj, method_scanNxtCallback); } void fm_srch_list_cb(uint16_t *scan_tbl) { - ALOGE("SRCH_LIST"); + ALOGI("SRCH_LIST"); //mCallbackEnv->CallVoidMethod(javaObjectRef, method_srchListCallback); } void fm_stereo_status_cb(bool stereo) { - ALOGE("STEREO: %d", stereo); + ALOGI("STEREO: %d", stereo); mCallbackEnv->CallVoidMethod(mCallbacksObj, method_stereostsCallback, (jboolean) stereo); } void fm_rds_avail_status_cb(bool rds_avl) { - ALOGE("fm_rds_avail_status_cb: %d", rds_avl); + ALOGD("fm_rds_avail_status_cb: %d", rds_avl); mCallbackEnv->CallVoidMethod(mCallbacksObj, method_rdsAvlStsCallback, (jboolean) rds_avl); } void fm_af_list_update_cb(uint16_t *af_list) { - ALOGE("AF_LIST"); + ALOGD("AF_LIST"); jbyteArray af_buffer = NULL; if (!checkCallbackThread()) { @@ -211,7 +229,7 @@ void fm_af_list_update_cb(uint16_t *af_list) void fm_rt_update_cb(char *rt) { - ALOGE("RT_EVT: " ); + ALOGD("RT_EVT: " ); jbyteArray rt_buff = NULL; int i,len; @@ -221,10 +239,10 @@ void fm_rt_update_cb(char *rt) } len = (int)(rt[0] & 0xFF); - ALOGV(" rt data len=%d :",len); + ALOGD(" rt data len=%d :",len); len = len+5; - ALOGE(" rt data len=%d :",len); + ALOGD(" rt data len=%d :",len); rt_buff = mCallbackEnv->NewByteArray(len); if (rt_buff == NULL) { ALOGE(" ps data allocate failed :"); @@ -251,7 +269,7 @@ void fm_ps_update_cb(char *ps) numPs = (int)(ps[0] & 0xFF); len = (numPs *8)+5; - ALOGE(" ps data len=%d :",len); + ALOGD(" ps data len=%d :",len); ps_data = mCallbackEnv->NewByteArray(len); if(ps_data == NULL) { ALOGE(" ps data allocate failed :"); @@ -266,17 +284,17 @@ void fm_ps_update_cb(char *ps) void fm_oda_update_cb() { - ALOGE("ODA_EVT"); + ALOGD("ODA_EVT"); } void fm_rt_plus_update_cb(char *rt_plus) { jbyteArray RtPlus = NULL; - ALOGE("RT_PLUS"); + ALOGD("RT_PLUS"); int len; len = (int)(rt_plus[0] & 0xFF); - ALOGE(" rt plus len=%d :",len); + ALOGD(" rt plus len=%d :",len); RtPlus = mCallbackEnv->NewByteArray(len); if (RtPlus == NULL) { ALOGE(" rt plus data allocate failed :"); @@ -289,7 +307,7 @@ void fm_rt_plus_update_cb(char *rt_plus) void fm_ert_update_cb(char *ert) { - ALOGI("ERT_EVT"); + ALOGD("ERT_EVT"); jbyteArray ert_buff = NULL; int i,len; @@ -341,7 +359,7 @@ void fm_ext_country_code_cb(char *ecc) void rds_grp_cntrs_rsp_cb(char * evt_buffer) { - ALOGE("rds_grp_cntrs_rsp_cb"); + ALOGD("rds_grp_cntrs_rsp_cb"); } void fm_disabled_cb() @@ -351,15 +369,15 @@ void fm_disabled_cb() } void fm_peek_rsp_cb(char *peek_rsp) { - ALOGE("fm_peek_rsp_cb"); + ALOGD("fm_peek_rsp_cb"); } void fm_ssbi_peek_rsp_cb(char *ssbi_peek_rsp){ - ALOGE("fm_ssbi_peek_rsp_cb"); + ALOGD("fm_ssbi_peek_rsp_cb"); } void fm_ch_det_th_rsp_cb(char *ch_det_rsp){ - ALOGE("fm_ch_det_th_rsp_cb"); + ALOGD("fm_ch_det_th_rsp_cb"); } static void fm_thread_evt_cb(unsigned int event) { @@ -371,7 +389,7 @@ static void fm_thread_evt_cb(unsigned int event) { args.name = name; args.group = NULL; vm->AttachCurrentThread(&mCallbackEnv, &args); - ALOGE("satish: Callback thread attached: %p", mCallbackEnv); + ALOGD("Callback thread attached: %p", mCallbackEnv); } else if (event == 1) { if (!checkCallbackThread()) { ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); @@ -380,6 +398,70 @@ static void fm_thread_evt_cb(unsigned int event) { vm->DetachCurrentThread(); } } + +static void fm_get_sig_thres_cb(int val, int status) +{ + ALOGD("Get signal Thres callback"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getSigThCallback, val, status); +} + +static void fm_get_ch_det_thr_cb(int val, int status) +{ + ALOGD("fm_get_ch_det_thr_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getChDetThrCallback, val, status); +} + +static void fm_set_ch_det_thr_cb(int status) +{ + ALOGD("fm_set_ch_det_thr_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setChDetThrCallback, status); +} + +static void fm_def_data_read_cb(int val, int status) +{ + ALOGD("fm_def_data_read_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataRdCallback, val, status); +} + +static void fm_def_data_write_cb(int status) +{ + ALOGD("fm_def_data_write_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataWrtCallback, status); +} + +static void fm_get_blend_cb(int val, int status) +{ + ALOGD("fm_get_blend_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getBlendCallback, val, status); +} + +static void fm_set_blend_cb(int status) +{ + ALOGD("fm_set_blend_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setBlendCallback, status); +} + +static void fm_get_station_param_cb(int val, int status) +{ + ALOGD("fm_get_station_param_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnParamCallback, val, status); +} + +static void fm_get_station_debug_param_cb(int val, int status) +{ + ALOGD("fm_get_station_debug_param_cb"); + + mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnDbgParamCallback, val, status); +} + typedef struct { size_t size; @@ -403,6 +485,15 @@ typedef struct { fm_ch_det_th_cb fm_ch_det_th_rsp_cb; fm_ecc_evt_cb ext_country_code_cb; callback_thread_event thread_evt_cb; + fm_sig_thr_cb fm_get_sig_thres_cb; + fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb; + fm_def_data_rd_cb fm_def_data_read_cb; + fm_get_blnd_cb fm_get_blend_cb; + fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb; + fm_def_data_wrt_cb fm_def_data_write_cb; + fm_set_blnd_cb fm_set_blend_cb; + fm_get_stn_prm_cb fm_get_station_param_cb; + fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb; } fm_vendor_callbacks_t; typedef struct { @@ -434,7 +525,16 @@ static fm_vendor_callbacks_t fm_callbacks = { fm_ssbi_peek_rsp_cb, fm_ch_det_th_rsp_cb, fm_ext_country_code_cb, - fm_thread_evt_cb + fm_thread_evt_cb, + fm_get_sig_thres_cb, + fm_get_ch_det_thr_cb, + fm_def_data_read_cb, + fm_get_blend_cb, + fm_set_ch_det_thr_cb, + fm_def_data_write_cb, + fm_set_blend_cb, + fm_get_station_param_cb, + fm_get_station_debug_param_cb }; #endif /* native interface */ @@ -734,6 +834,15 @@ static jint android_hardware_fmradio_FmReceiverJNI_getRSSINative int err; long rmssi; +#ifdef FM_SOC_TYPE_CHEROKEE + err = vendor_interface->get_fm_ctrl(V4L2_CID_PRV_IRIS_RMSSI, rmssi); + if (err < 0) { + ALOGE("%s: Get Rssi failed", LOG_TAG); + err = FM_JNI_FAILURE; + } else { + err = FM_JNI_SUCCESS; + } +#else if (fd >= 0) { err = FmIoctlsInterface :: get_rmssi(fd, rmssi); if (err < 0) { @@ -747,7 +856,7 @@ static jint android_hardware_fmradio_FmReceiverJNI_getRSSINative LOG_TAG, fd); err = FM_JNI_FAILURE; } - +#endif return err; } @@ -1393,6 +1502,15 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_stereostsCallback = env->GetMethodID(javaClassRef, "stereostsCallback", "(Z)V"); method_rdsAvlStsCallback = env->GetMethodID(javaClassRef, "rdsAvlStsCallback", "(Z)V"); method_disableCallback = env->GetMethodID(javaClassRef, "disableCallback", "()V"); + method_getSigThCallback = env->GetMethodID(javaClassRef, "getSigThCallback", "(II)V"); + method_getChDetThrCallback = env->GetMethodID(javaClassRef, "getChDetThCallback", "(II)V"); + method_defDataRdCallback = env->GetMethodID(javaClassRef, "DefDataRdCallback", "(II)V"); + method_getBlendCallback = env->GetMethodID(javaClassRef, "getBlendCallback", "(II)V"); + method_setChDetThrCallback = env->GetMethodID(javaClassRef, "setChDetThCallback","(I)V"); + method_defDataWrtCallback = env->GetMethodID(javaClassRef, "DefDataWrtCallback", "(I)V"); + method_setBlendCallback = env->GetMethodID(javaClassRef, "setBlendCallback", "(I)V"); + method_getStnParamCallback = env->GetMethodID(javaClassRef, "getStnParamCallback", "(II)V"); + method_getStnDbgParamCallback = env->GetMethodID(javaClassRef, "getStnDbgParamCallback", "(II)V"); return; error: diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java index 8e681e7d60ebe63817727f096aaa1efbd13d410e..c61b78e46642dc58b3466ed9cc84088f0b3c1986 100644 --- a/qcom/fmradio/FmReceiver.java +++ b/qcom/fmradio/FmReceiver.java @@ -1455,7 +1455,7 @@ public class FmReceiver extends FmTransceiver try { - String rdsStr = new String(buff, 5, numOfPs*8 ); + String rdsStr = new String(buff, 5, numOfPs*8 ); mRdsData.setPrgmServices (rdsStr); } catch (StringIndexOutOfBoundsException x) @@ -2018,6 +2018,16 @@ public class FmReceiver extends FmTransceiver return mControl.setPSRxRepeatCount(sFd, count); } + public boolean getPSRxRepeatCount() { + int state = getFMState(); + /* Check current state of FM device */ + if (state == FMState_Turned_Off){ + Log.d(TAG, "setRxRepeatcount failed"); + return false; + } + return mControl.getPSRxRepeatCount(sFd); + } + public byte getBlendSinr() { int state = getFMState(); if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) { @@ -2027,7 +2037,7 @@ public class FmReceiver extends FmTransceiver return mControl.getBlendSinr(sFd); } - public boolean setBlendSinr(byte sinrHi) { + public boolean setBlendSinr(int sinrHi) { int state = getFMState(); if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) { Log.d(TAG, "setBlendSinr: Device currently busy in executing another command."); @@ -2045,7 +2055,7 @@ public class FmReceiver extends FmTransceiver return mControl.getBlendRmssi(sFd); } - public boolean setBlendRmssi(byte rmssiHi) { + public boolean setBlendRmssi(int rmssiHi) { int state = getFMState(); if ((state == FMState_Turned_Off) || (state == FMState_Srch_InProg)) { Log.d(TAG, "setBlendRmssi: Device currently busy in executing another command."); @@ -2318,7 +2328,7 @@ public class FmReceiver extends FmTransceiver * * <p> * @return IOVERC of currently tuned station on Success. - * -1 on failure to retrieve the current IoverC. + * -1 on failure to retrieve the current IoverC. */ public int getIoverc() { @@ -2339,7 +2349,7 @@ public class FmReceiver extends FmTransceiver * * <p> * @return IntDet of currently tuned station. - * -1 on failure to retrieve the current IntDet + * -1 on failure to retrieve the current IntDet */ public int getIntDet() { @@ -2510,9 +2520,14 @@ public class FmReceiver extends FmTransceiver * * <p> */ - public int getOnChannelThreshold() + public boolean getOnChannelThreshold() { - return mControl.getOnChannelThreshold(sFd); + int re = mControl.getOnChannelThreshold(sFd); + + if (re != 0) + return false; + else + return true; } /*============================================================== @@ -2545,9 +2560,14 @@ public class FmReceiver extends FmTransceiver * * <p> */ - public int getOffChannelThreshold() + public boolean getOffChannelThreshold() { - return mControl.getOffChannelThreshold(sFd); + int re = mControl.getOffChannelThreshold(sFd); + + if (re != 0) + return false; + else + return true; } /*=============================================================== FUNCTION: getSINR diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java index d085476b211bef457e9976be691c7fcafa52d6a8..e587b446be4446f11f8b54af911af20692ff29eb 100644 --- a/qcom/fmradio/FmReceiverJNI.java +++ b/qcom/fmradio/FmReceiverJNI.java @@ -80,6 +80,53 @@ class FmReceiverJNI { Log.e(TAG, "AflistCallback exit " ); } + public void getSigThCallback(int val, int status) + { + Log.d(TAG, "get Signal Threshold callback"); + + FmReceiver.mCallback.FmRxEvGetSignalThreshold(val, status); + } + + public void getChDetThCallback(int val, int status) + { + FmReceiver.mCallback.FmRxEvGetChDetThreshold(val, status); + } + + public void setChDetThCallback(int status) + { + FmReceiver.mCallback.FmRxEvSetChDetThreshold(status); + } + + public void DefDataRdCallback(int val, int status) + { + FmReceiver.mCallback.FmRxEvDefDataRead(val, status); + } + + public void DefDataWrtCallback(int status) + { + FmReceiver.mCallback.FmRxEvDefDataWrite(status); + } + + public void getBlendCallback(int val, int status) + { + FmReceiver.mCallback.FmRxEvGetBlend(val, status); + } + + public void setBlendCallback(int status) + { + FmReceiver.mCallback.FmRxEvSetBlend(status); + } + + public void getStnParamCallback(int val, int status) + { + FmReceiver.mCallback.FmRxGetStationParam(val, status); + } + + public void getStnDbgParamCallback(int val, int status) + { + FmReceiver.mCallback.FmRxGetStationDbgParam(val, status); + } + public void RtPlusCallback(byte[] rtplus) { Log.d(TAG, "RtPlusCallback enter " ); if (rtplus == null) { diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java index 767d56f0abf2d065aaa5e36d52706c081c193c5d..701448f02825cb2ee27e0a10418bb2ce3cdcd11f 100644 --- a/qcom/fmradio/FmRxControls.java +++ b/qcom/fmradio/FmRxControls.java @@ -738,11 +738,21 @@ class FmRxControls } } + public boolean getPSRxRepeatCount(int fd) { + int ret; + ret = FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_RXREPEATCOUNT); + if (ret < 0) { + return false; + } else { + return true; + } + } + public byte getBlendSinr(int fd) { return (byte)FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_BLEND_SINRHI); } - public boolean setBlendSinr(int fd, byte sinrHi) { + public boolean setBlendSinr(int fd, int sinrHi) { int ret; ret = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_BLEND_SINRHI, sinrHi); if(ret < 0) { @@ -757,7 +767,7 @@ class FmRxControls return (byte)FmReceiverJNI.getControlNative(fd, V4L2_CID_PRIVATE_BLEND_RMSSIHI); } - public boolean setBlendRmssi(int fd, byte rmssiHi) { + public boolean setBlendRmssi(int fd, int rmssiHi) { int ret; ret = FmReceiverJNI.setControlNative(fd, V4L2_CID_PRIVATE_BLEND_RMSSIHI, rmssiHi); if(ret < 0) { diff --git a/qcom/fmradio/FmRxEvCallbacksAdaptor.java b/qcom/fmradio/FmRxEvCallbacksAdaptor.java index 753d506330469264a9b077b1e68bae0c7a5043a1..59953e80a1eb4235f6baf01301caa51f03b40790 100644 --- a/qcom/fmradio/FmRxEvCallbacksAdaptor.java +++ b/qcom/fmradio/FmRxEvCallbacksAdaptor.java @@ -52,5 +52,13 @@ public class FmRxEvCallbacksAdaptor implements FmRxEvCallbacks { public void FmRxEvRTPlus() {}; public void FmRxEvERTInfo() {}; public void FmRxEvECCInfo() {}; + public void FmRxEvGetSignalThreshold(int val, int status) {}; + public void FmRxEvGetChDetThreshold(int val, int status) {}; + public void FmRxEvDefDataRead(int val, int status) {}; + public void FmRxEvGetBlend(int val, int status) {}; + public void FmRxEvSetChDetThreshold(int status) {}; + public void FmRxEvDefDataWrite(int status) {}; + public void FmRxEvSetBlend(int status) {}; + public void FmRxGetStationParam(int val, int status) {}; + public void FmRxGetStationDbgParam(int val, int status) {}; } -