|
|
|
|
|
|
|
|
package ch.spherIC.recurvebowsight;
|
|
|
package ch.spherIC.recurvebowsight;
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
import android.app.Activity;
|
|
|
import android.app.AlertDialog;
|
|
|
|
|
|
import android.app.Dialog;
|
|
|
import android.app.Dialog;
|
|
|
|
|
|
import android.app.ProgressDialog;
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
import android.content.Intent;
|
|
|
|
|
|
|
|
|
private static final double CENTI = 0.01;
|
|
|
private static final double CENTI = 0.01;
|
|
|
private static final double MILLI = 0.001;
|
|
|
private static final double MILLI = 0.001;
|
|
|
private static final int MAX_TRAJ_POINTS = 200;
|
|
|
private static final int MAX_TRAJ_POINTS = 200;
|
|
|
|
|
|
private static final String DEF_TEMP = "23";
|
|
|
|
|
|
private static final String DEF_HUMIDITY = "50";
|
|
|
|
|
|
private static final String DEF_DISTANCE = "18";
|
|
|
|
|
|
|
|
|
private ViewFlipper viewFlipper;
|
|
|
private ViewFlipper viewFlipper;
|
|
|
private ScrollView paramsScrollView;
|
|
|
private ScrollView paramsScrollView;
|
|
|
|
|
|
|
|
|
private Double startAngle;
|
|
|
private Double startAngle;
|
|
|
private String selectedHeVS;
|
|
|
private String selectedHeVS;
|
|
|
|
|
|
|
|
|
private AlertDialog calculationAlert;
|
|
|
|
|
|
|
|
|
private ProgressDialog progressDialog;
|
|
|
private FlightCurveChart flightCurveChart;
|
|
|
private FlightCurveChart flightCurveChart;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
this.calculationAlert = new AlertDialog.Builder(this).create();
|
|
|
|
|
|
this.calculationAlert.setCancelable(false); // This blocks the 'BACK' button
|
|
|
|
|
|
this.calculationAlert.setMessage(getApplicationContext().getResources().getString(R.string.caption_Calculating));
|
|
|
|
|
|
|
|
|
|
|
|
UnitConverter.setApplication(getApplication());
|
|
|
UnitConverter.setApplication(getApplication());
|
|
|
RBSDatabaseHelper.setContext(this);
|
|
|
RBSDatabaseHelper.setContext(this);
|
|
|
RBSDatabaseHelper.getInstance().initializeDB();
|
|
|
RBSDatabaseHelper.getInstance().initializeDB();
|
|
|
|
|
|
|
|
|
this.scSightSpinner.fireSelectionChangedEvent();
|
|
|
this.scSightSpinner.fireSelectionChangedEvent();
|
|
|
this.scVertScaleMiddleTxtFld.setText(DF.format(archerySetup.getSightVertSkalaMiddle()));
|
|
|
this.scVertScaleMiddleTxtFld.setText(DF.format(archerySetup.getSightVertSkalaMiddle()));
|
|
|
|
|
|
|
|
|
this.airTemperatureTxtFld.setText("23");
|
|
|
|
|
|
this.airRelativeHumidityTxtFld.setText("50");
|
|
|
|
|
|
this.shootingDistanzTxtFld.setText("18");
|
|
|
|
|
|
|
|
|
this.airTemperatureTxtFld.setText(DEF_TEMP);
|
|
|
|
|
|
this.airRelativeHumidityTxtFld.setText(DEF_HUMIDITY);
|
|
|
|
|
|
this.shootingDistanzTxtFld.setText(DEF_DISTANCE);
|
|
|
|
|
|
|
|
|
} else {
|
|
|
} else {
|
|
|
this.arrowDiameterTxtFld.setText("");
|
|
|
this.arrowDiameterTxtFld.setText("");
|
|
|
|
|
|
|
|
|
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
|
|
|
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.progressDialog = ProgressDialog.show(this, null, getResources().getString(R.string.caption_Calculating), true, false);
|
|
|
|
|
|
|
|
|
CalculationTask calcTask = new CalculationTask();
|
|
|
CalculationTask calcTask = new CalculationTask();
|
|
|
TrajectoryCalculator calculator = new TrajectoryCalculator(Double.valueOf(this.arrowDiameterTxtFld.getText().toString().trim()) * MILLI, //
|
|
|
TrajectoryCalculator calculator = new TrajectoryCalculator(Double.valueOf(this.arrowDiameterTxtFld.getText().toString().trim()) * MILLI, //
|
|
|
Double.valueOf(this.arrowCwTxtFld.getText().toString().trim()), //
|
|
|
Double.valueOf(this.arrowCwTxtFld.getText().toString().trim()), //
|
|
|
|
|
|
|
|
|
calculator.setStartAngle(0d);
|
|
|
calculator.setStartAngle(0d);
|
|
|
calcTask.execute(calculator);
|
|
|
calcTask.execute(calculator);
|
|
|
|
|
|
|
|
|
this.calculationAlert.show();
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
} else {
|
|
|
Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
|
|
|
Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
|
|
|
toast.setGravity(Gravity.CENTER, 0, 0);
|
|
|
toast.setGravity(Gravity.CENTER, 0, 0);
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void updateTrajectoryTxtFld(final Integer step, final Double[] flightCurveRow, final Double startAngle, final Double[] maxHCurve) {
|
|
|
|
|
|
|
|
|
|
|
|
int width = this.flightCurveTxtFld.getMeasuredWidth();
|
|
|
|
|
|
Double[] r1 = flightCurveRow;
|
|
|
|
|
|
|
|
|
|
|
|
switch (step) {
|
|
|
|
|
|
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
this.flightCurveTxtFld.setText("");
|
|
|
|
|
|
this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_StartAngle) + DF_FC.format(startAngle) + " °\n\n");
|
|
|
|
|
|
this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_MaxHeight) + DF_FC.format(maxHCurve[0])
|
|
|
|
|
|
+ " m / "
|
|
|
|
|
|
+ DF_FC.format(maxHCurve[0] + Double.valueOf(this.arrowNockHeightTxtFld.getText().toString().trim()))
|
|
|
|
|
|
+ " m, [t = " + DF_FC.format(maxHCurve[1]) + " s]\n\n");
|
|
|
|
|
|
this.flightCurveTxtFld.append(getResources().getString(R.string.fcChart_FlightDuration)
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_T])
|
|
|
|
|
|
+ " sec\n\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SpannableString line = new SpannableString("t [sec]\tVx [m/s]\tVy [m/s]\tx [m]\ty [m]\n\n");
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
this.flightCurveTxtFld.append(line);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
line = new SpannableString(DF_FC.format(r1[TrajectoryCalculator.IDX_T]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_VX]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_VY]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_X]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_Y]) + "\n");
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
this.flightCurveTxtFld.append(line);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@Override
|
|
|
public void onCalculationDone(final Double[][] flightCurve, final Double startAngle, final Double[] maxHCurve) {
|
|
|
public void onCalculationDone(final Double[][] flightCurve, final Double startAngle, final Double[] maxHCurve) {
|
|
|
this.startAngle = startAngle;
|
|
|
this.startAngle = startAngle;
|
|
|
|
|
|
|
|
|
updateFlightCurveChart(flightCurve);
|
|
|
updateFlightCurveChart(flightCurve);
|
|
|
fillFlightCurveTxtFld(flightCurve, startAngle, maxHCurve);
|
|
|
|
|
|
calculateSettings();
|
|
|
calculateSettings();
|
|
|
|
|
|
|
|
|
if (this.calculationAlert != null) {
|
|
|
|
|
|
this.calculationAlert.dismiss();
|
|
|
|
|
|
|
|
|
if (this.progressDialog != null) {
|
|
|
|
|
|
this.progressDialog.dismiss();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
this.txtViewSight.doSingleTouch();
|
|
|
this.txtViewSight.doSingleTouch();
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void fillFlightCurveTxtFld(final Double[][] flightCurve, final Double startAngle,
|
|
|
|
|
|
final Double[] maxHCurve) {
|
|
|
|
|
|
this.flightCurveTxtFld.setText("");
|
|
|
|
|
|
this.flightCurveTxtFld.append("Abschusswinkel:\n" + DF_FC.format(startAngle) + " °\n\n");
|
|
|
|
|
|
this.flightCurveTxtFld.append("Max. Höhe der Flugbahn:\n" + DF_FC.format(maxHCurve[0])
|
|
|
|
|
|
+ " m / " + DF_FC.format(maxHCurve[0] + Double.valueOf(this.arrowNockHeightTxtFld.getText().toString().trim()))
|
|
|
|
|
|
+ " m, [t = " + DF_FC.format(maxHCurve[1]) + " s]\n\n");
|
|
|
|
|
|
this.flightCurveTxtFld.append("Flugzeit:\n"
|
|
|
|
|
|
+ DF_FC.format(flightCurve[flightCurve.length - 1][TrajectoryCalculator.IDX_T])
|
|
|
|
|
|
+ " sec\n\n");
|
|
|
|
|
|
|
|
|
|
|
|
int width = this.flightCurveTxtFld.getMeasuredWidth();
|
|
|
|
|
|
|
|
|
|
|
|
SpannableString line = new SpannableString("t [sec]\tVx [m/s]\tVy [m/s]\tx [m]\ty [m]\n\n");
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
this.flightCurveTxtFld.append(line);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < flightCurve.length; i++) {
|
|
|
|
|
|
Double[] r1 = flightCurve[i];
|
|
|
|
|
|
line = new SpannableString(DF_FC.format(r1[TrajectoryCalculator.IDX_T]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_VX]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_VY]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_X]) + '\t'
|
|
|
|
|
|
+ DF_FC.format(r1[TrajectoryCalculator.IDX_Y]) + "\n");
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 2), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 3), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
line.setSpan(new TabStopSpan.Standard(width / 5 * 4), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
|
this.flightCurveTxtFld.append(line);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Berechnet die definitve Visiereinstellung anhand des berechneten Flugbahnwinkels.
|
|
|
* Berechnet die definitve Visiereinstellung anhand des berechneten Flugbahnwinkels.
|
|
|
*/
|
|
|
*/
|