package de.tu.darmstadt.seemoo.ansian.gui.dialogs; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.NumberPicker; import android.widget.Spinner; import android.widget.TextView; import de.greenrobot.event.EventBus; import de.tu.darmstadt.seemoo.ansian.R; import de.tu.darmstadt.seemoo.ansian.control.SourceControl; import de.tu.darmstadt.seemoo.ansian.control.StateHandler; import de.tu.darmstadt.seemoo.ansian.control.events.RequestFrequencyEvent; import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences; /** * Will pop up a dialog to let the user input a new frequency */ public class FrequencyDialog extends MyDialogFragment { // calculate max frequency of the source in MHz: private static final String LOGTAG = "FrequencyDialog"; final double maxFreqMHz = SourceControl.getSource().getMaxFrequency() / 1000000f; private NumberPicker frequencyPicker; private CheckBox cb_bandwidth; private EditText et_bandwidth; private Spinner sp_bandwidthUnit; private TextView tv_warning; private Spinner frequencyUnitSpinner; @SuppressLint("InflateParams") @Override protected View createView() { view = (LinearLayout) getActivity().getLayoutInflater().inflate(R.layout.tune_to_frequency, null); final long frequency = Preferences.GUI_PREFERENCE.getFrequency(); // int selection = 0; // if (frequency % 1000 == 0) // selection++; // if (frequency % 1000000 == 0) // selection++; // frequencyUnitSpinner.setSelection(selection); frequencyPicker = (NumberPicker) view.findViewById(R.id.frequencyPicker); frequencyUnitSpinner = (Spinner) view.findViewById(R.id.frequencyUnitSpinner); // ArrayAdapter<CharSequence> adapter; // if (SourceControl.getSource().getMinFrequency()<1000) // adapter = ArrayAdapter.createFromResource( // getActivity(), R.array.frequency_units, // android.R.layout.simple_spinner_item); // else // adapter = ArrayAdapter.createFromResource( // getActivity(), R.array.frequency_units_no_hz, // android.R.layout.simple_spinner_item); // frequencyUnitSpinner.setAdapter(adapter); frequencyUnitSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int divider = 1; switch (position) { case 0: divider = 1000000; break; case 1: divider = 1000; break; } frequencyPicker.setMinValue((int) (SourceControl.getSource().getMinFrequency() / divider)); frequencyPicker.setMaxValue((int) (SourceControl.getSource().getMaxFrequency() / divider)); frequencyPicker.setValue((int) (frequency / divider)); } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); cb_bandwidth = (CheckBox) view.findViewById(R.id.cb_tune_to_frequency_bandwidth); et_bandwidth = (EditText) view.findViewById(R.id.et_tune_to_frequency_bandwidth); sp_bandwidthUnit = (Spinner) view.findViewById(R.id.sp_tune_to_frequency_bandwidth_unit); tv_warning = (TextView) view.findViewById(R.id.tv_tune_to_frequency_warning); if (SourceControl.getSource() == null) return null; // Show warning if we are currently recording to file: if (StateHandler.isRecording()) tv_warning.setVisibility(View.VISIBLE); cb_bandwidth.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { et_bandwidth.setEnabled(isChecked); sp_bandwidthUnit.setEnabled(isChecked); } }); cb_bandwidth.toggle(); // to trigger the onCheckedChangeListener at // least once to set inital state sp_bandwidthUnit.setSelection(2); // TODOcb_bandwidth.setChecked(preferences.isSetBandwidth()); et_bandwidth.setText("" + Preferences.GUI_PREFERENCE.getBandwidth()); // TODO sp_bandwidthUnit.setSelection(preferences.getBandwidthUnit()); return view; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { super.onCreateDialog(savedInstanceState); builder.setTitle("Tune to Frequency").setPositiveButton("Set", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { int newFreq = (int) (frequencyPicker.getValue() * Math.pow(1000, 2-frequencyUnitSpinner.getSelectedItemPosition())); EventBus.getDefault().post(new RequestFrequencyEvent(newFreq)); // AnalyzerSurface.getInstance() // .setVirtualFrequency(newFreq); // Set bandwidth (virtual sample rate): if (cb_bandwidth.isChecked() && et_bandwidth.getText().length() != 0) { float bandwidth = Float.valueOf(et_bandwidth.getText().toString()); if (sp_bandwidthUnit.getSelectedItemPosition() == 0) // MHz bandwidth *= 1000000; else if (sp_bandwidthUnit.getSelectedItemPosition() == 1) // KHz bandwidth *= 1000; if (bandwidth > SourceControl.getSource().getMaxSampleRate()) bandwidth = SourceControl.getSource().getMaxFrequency(); SourceControl.getSource().setSampleRate( SourceControl.getSource().getNextHigherOptimalSampleRate((int) bandwidth)); // safe preferences: // TODOpreferences.setBandwidthSet(cb_bandwidth.isChecked()); // TODO // preferences.setBandwidth(et_bandwidth.getText().toString()); // TODOpreferences.setBandwidthUnit(sp_bandwidthUnit.getSelectedItemPosition()); } } catch (NumberFormatException e) { Log.e(LOGTAG, "tuneToFrequency: Error while setting frequency: " + e.getMessage()); } } }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do nothing } }); return builder.create(); } }