package uk.org.smithfamily.mslogger.dialog; import uk.org.smithfamily.mslogger.ApplicationSettings; import uk.org.smithfamily.mslogger.R; import uk.org.smithfamily.mslogger.ecuDef.Constant; import uk.org.smithfamily.mslogger.ecuDef.MSUtils; import uk.org.smithfamily.mslogger.ecuDef.Megasquirt; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RadioGroup; import android.widget.TextView; public class EditRequiredFuel extends Dialog implements android.view.View.OnClickListener { private TextView engineDisplacement; private TextView numberOfCylinders; private TextView injectorFlow; private TextView airFuelRatio; private RadioGroup displacementUnits; private RadioGroup injectorFlowUnits; private OnReqFuelResult mDialogResult; public EditRequiredFuel(Context context) { super(context); } /** * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.required_fuel_calculator); setTitle(R.string.required_fuel_calculator); engineDisplacement = (TextView) findViewById(R.id.engineDisplacement); numberOfCylinders = (TextView) findViewById(R.id.numberOfCylinders); injectorFlow = (TextView) findViewById(R.id.injectorFlow); airFuelRatio = (TextView) findViewById(R.id.airFuelRatio); displacementUnits = (RadioGroup) findViewById(R.id.displacementUnits); injectorFlowUnits = (RadioGroup) findViewById(R.id.injectorFlowUnits); Button calculate = (Button) findViewById(R.id.bt_ok); calculate.setOnClickListener(this); Button cancel = (Button) findViewById(R.id.bt_cancel); cancel.setOnClickListener(this); } /** * Check if a value is between the specified min/max value. Display an alert dialog if it's not. * * @param value Current value * @param minBound Minimum allowed * @param maxBound Maximum allowed */ private boolean showRequiredFuelOutOfBounds(double value, double minBound, double maxBound, String name) { if (value < minBound || value > maxBound) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage(name + " should be between " + minBound + " and " + maxBound + ". You currently have it set to " + value) .setIcon(android.R.drawable.ic_dialog_info) .setTitle("Out of bound required fuel parameter") .setCancelable(true) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id){} }); AlertDialog alert = builder.create(); alert.show(); return true; } return false; } @Override public void onClick(View v) { int which = v.getId(); if (which == R.id.bt_ok) { double reqFuel = 0.0; double dReqFuel = 0.0; double dispUnits = displacementUnits.getCheckedRadioButtonId() == R.id.rbCID ? 1.0 : 16.38706; double flowUnits = injectorFlowUnits.getCheckedRadioButtonId() == R.id.rbLbHr ? 1.0 : 10.5; int errorsCount = 0; boolean error = false; // Engine displacement double cid = 0; try { cid = Double.parseDouble(engineDisplacement.getText().toString()); } catch (NumberFormatException e){} error = showRequiredFuelOutOfBounds(cid, 1, 25000, "Engine displacement"); if (error) { errorsCount++; } cid = (int) (cid / dispUnits); // Injectors flow double injectorFlowValue = 0; try { injectorFlowValue = Double.parseDouble(injectorFlow.getText().toString()); } catch (NumberFormatException e){} error = showRequiredFuelOutOfBounds(injectorFlowValue, 0, 2000, "Injectors flow"); if (error) { errorsCount++; } injectorFlowValue = injectorFlowValue / flowUnits; // Air/Fuel ratio double afr = 0; try { afr = Double.parseDouble(airFuelRatio.getText().toString()); } catch (NumberFormatException e){} error = showRequiredFuelOutOfBounds(afr, 0, 25, "Air/Fuel Ratio"); if (error) { errorsCount++; } // Only close dialog if there was no error if (errorsCount == 0) { Megasquirt ecu = ApplicationSettings.INSTANCE.getEcuDefinition(); int nCylinders = (int) Integer.parseInt(numberOfCylinders.getText().toString()); int divider = ecu.getDivider(); int nInjectors = ecu.getInjectorsCount(); double injectorStaging = ecu.getInjectorStating() + 1; reqFuel = (36.0E6 * cid * 4.27793e-05) / (nCylinders * afr * injectorFlowValue) / 10.0; dReqFuel = reqFuel * (injectorStaging * divider) / nInjectors; String reqFuelConstantName = "reqFuel"; // MS1 if (ecu.isConstantExists("reqFuel1")) { reqFuelConstantName = "reqFuel1"; } // Set constant to modified Constant reqFuelConstant = ecu.getConstantByName(reqFuelConstantName); reqFuelConstant.setModified(true); // Populate this so the parent dialog can get that info mDialogResult.finish(MSUtils.INSTANCE.roundDouble(reqFuel, 1), MSUtils.INSTANCE.roundDouble(dReqFuel, 1)); dismiss(); } } else if (which == R.id.bt_cancel) { cancel(); } } /** * Used by the parent to set a new OnReqFuelResult to the dialog * * @param dialogResult */ public void setDialogResult(OnReqFuelResult dialogResult) { mDialogResult = dialogResult; } /** * Interface used to send the data back to the dialog's parent */ public interface OnReqFuelResult { void finish(double reqFuel, double dReqFuel); } }