|
|
|
@@ -29,6 +29,7 @@ import android.widget.Toast; |
|
|
|
import android.widget.ViewFlipper;
|
|
|
|
|
|
|
|
import ch.spherIC.recurvebowsight.components.FontArrayAdapter;
|
|
|
|
import ch.spherIC.recurvebowsight.components.FontTextView;
|
|
|
|
import ch.spherIC.recurvebowsight.components.RiserSpinner;
|
|
|
|
import ch.spherIC.recurvebowsight.components.SightSpinner;
|
|
|
|
import ch.spherIC.recurvebowsight.components.XSpinner;
|
|
|
|
@@ -51,15 +52,17 @@ import java.util.List; |
|
|
|
import java.util.StringTokenizer;
|
|
|
|
|
|
|
|
|
|
|
|
public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDismissListener {
|
|
|
|
public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDismissListener, TrajectoryCalculation {
|
|
|
|
|
|
|
|
public static final DecimalFormat DF = new DecimalFormat("0.###");
|
|
|
|
public static final DecimalFormat DF = new DecimalFormat("0.##");
|
|
|
|
public static final DecimalFormat DF_EVS = new DecimalFormat("0.#");
|
|
|
|
|
|
|
|
public static final int DLG_CHOOSE_ARCHERYSETUP = 0;
|
|
|
|
public static final int DLG_USERGUIDE_PARAMS = 1;
|
|
|
|
public static final int DLG_USERGUIDE_SIGHT = 2;
|
|
|
|
public static final int DLG_ABOUT = 3;
|
|
|
|
|
|
|
|
private static final Double ANGLE_90 = 90d;
|
|
|
|
private static final int MIN_DISTANCE = 50;
|
|
|
|
|
|
|
|
private ViewFlipper viewFlipper;
|
|
|
|
@@ -94,14 +97,14 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
private TextView scaHTxtFld;
|
|
|
|
private TextView scVertScaleRngTxtFld;
|
|
|
|
private TextView scVertScaleMiddleTxtFld;
|
|
|
|
private TextView scEvSValue;
|
|
|
|
private FontTextView scEvSValue;
|
|
|
|
|
|
|
|
private boolean showInfoMenu;
|
|
|
|
private IArcherySetup selectedArcherySetup;
|
|
|
|
private Double startAngle;
|
|
|
|
|
|
|
|
private Activity riserSightConfigActivity;
|
|
|
|
|
|
|
|
private boolean showInfoMenu;
|
|
|
|
// private Menu optionsMenu;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCreate(final Bundle savedInstanceState) {
|
|
|
|
@@ -126,14 +129,11 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
|
|
|
|
List<IRiser> risers = RiserDao.getInstance().loadAll();
|
|
|
|
risers.add(0, new Riser(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, null));
|
|
|
|
this.scRiserSpinner.setAdapter(new FontArrayAdapter<IRiser>(this, R.layout.rbs_spinner, risers,
|
|
|
|
this.scRiserSpinner));
|
|
|
|
this.scRiserSpinner.setAdapter(new FontArrayAdapter<IRiser>(this, R.layout.rbs_spinner, risers, this.scRiserSpinner));
|
|
|
|
|
|
|
|
List<ISight> sights = SightDao.getInstance().loadAll();
|
|
|
|
sights.add(0,
|
|
|
|
new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null));
|
|
|
|
this.scSightSpinner.setAdapter(new FontArrayAdapter<ISight>(this, R.layout.rbs_spinner, sights,
|
|
|
|
this.scSightSpinner));
|
|
|
|
sights.add(0, new Sight(-999, getResources().getString(R.string.caption_NoSelection), "", null, null, "", null, null));
|
|
|
|
this.scSightSpinner.setAdapter(new FontArrayAdapter<ISight>(this, R.layout.rbs_spinner, sights, this.scSightSpinner));
|
|
|
|
|
|
|
|
addRiserAndSightSpinnerListeners();
|
|
|
|
|
|
|
|
@@ -195,7 +195,7 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
this.scaHTxtFld = (TextView) findViewById(R.id.scaHTxtFld);
|
|
|
|
this.scVertScaleRngTxtFld = (TextView) findViewById(R.id.scVertScaleRngTxtFld);
|
|
|
|
this.scVertScaleMiddleTxtFld = (TextView) findViewById(R.id.scVertSkalaMiddleTxtFld);
|
|
|
|
this.scEvSValue = (TextView) findViewById(R.id.scEvSValue);
|
|
|
|
this.scEvSValue = (FontTextView) findViewById(R.id.scEvSValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -237,9 +237,10 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
}
|
|
|
|
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.INVISIBLE);
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height,
|
|
|
|
0f));
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
|
|
|
|
.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld
|
|
|
|
.getLayoutParams().height, 0f));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setVisibility(View.VISIBLE);
|
|
|
|
|
|
|
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width,
|
|
|
|
@@ -247,14 +248,13 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
1f);
|
|
|
|
params.gravity = Gravity.FILL_VERTICAL;
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(params);
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this,
|
|
|
|
R.layout.rbs_spinner,
|
|
|
|
listHeVis,
|
|
|
|
RBSMainActivity.this.scHeVSSpinner));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
|
|
|
|
listHeVis, RBSMainActivity.this.scHeVSSpinner));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setSelection(0);
|
|
|
|
if (RBSMainActivity.this.selectedArcherySetup != null
|
|
|
|
&& RBSMainActivity.this.selectedArcherySetup.getSight().getId() == sight.getId()) {
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup.getSightHorSetting()));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setSelectionByVal(DF.format(RBSMainActivity.this.selectedArcherySetup
|
|
|
|
.getSightHorSetting()));
|
|
|
|
}
|
|
|
|
RBSMainActivity.this.scaVTxtFld.setText(DF.format(sight.getAV()));
|
|
|
|
RBSMainActivity.this.scaHTxtFld.setText(DF.format(sight.getAH()));
|
|
|
|
@@ -262,15 +262,16 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
+ DF.format(sight.getVertSkalaRangeMax()));
|
|
|
|
} else {
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setVisibility(View.INVISIBLE);
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.getLayoutParams().height,
|
|
|
|
0f));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSSpinner
|
|
|
|
.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSSpinner
|
|
|
|
.getLayoutParams().height, 0f));
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setVisibility(View.VISIBLE);
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.getLayoutParams().height,
|
|
|
|
1f));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this,
|
|
|
|
R.layout.rbs_spinner,
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld.setLayoutParams(new LinearLayout.LayoutParams(RBSMainActivity.this.scHeVSTxtFld
|
|
|
|
.getLayoutParams().width,
|
|
|
|
RBSMainActivity.this.scHeVSTxtFld
|
|
|
|
.getLayoutParams().height, 1f));
|
|
|
|
RBSMainActivity.this.scHeVSSpinner.setAdapter(new FontArrayAdapter<String>(RBSMainActivity.this, R.layout.rbs_spinner,
|
|
|
|
new ArrayList<String>(),
|
|
|
|
RBSMainActivity.this.scHeVSSpinner));
|
|
|
|
RBSMainActivity.this.scaVTxtFld.setText("");
|
|
|
|
@@ -625,12 +626,15 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
&& !this.targetCenterHeightTxtFld.getText().toString().isEmpty()
|
|
|
|
&& this.calcTimeIntervalCboBox.getSelectedItem() != null
|
|
|
|
&& this.calcAccuracyCboBox.getSelectedItem() != null
|
|
|
|
&& !this.scVvisHTxtFld.getText().toString().isEmpty()
|
|
|
|
&& allSightParamFieldsValid();
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean allSightParamFieldsValid() {
|
|
|
|
return !this.scVvisHTxtFld.getText().toString().isEmpty()
|
|
|
|
&& !this.scVvisVTxtFld.getText().toString().isEmpty()
|
|
|
|
&& !this.scaHTxtFld.getText().toString().isEmpty()
|
|
|
|
&& !this.scaVTxtFld.getText().toString().isEmpty()
|
|
|
|
&& !this.scVertScaleRngTxtFld.getText().toString().isEmpty()
|
|
|
|
&& !this.scVertScaleMiddleTxtFld.getText().toString().isEmpty()
|
|
|
|
&& ((this.scHeVSSpinner.getVisibility() == View.VISIBLE && this.scHeVSSpinner.getSelectedItem() != null)
|
|
|
|
|| (this.scHeVSTxtFld.getVisibility() == View.VISIBLE && !this.scHeVSTxtFld.getText().toString().isEmpty()))
|
|
|
|
&& !this.scVertScaleMiddleTxtFld.getText().toString().isEmpty();
|
|
|
|
@@ -642,7 +646,9 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
private void calculate() {
|
|
|
|
|
|
|
|
if (allParamFieldsValid()) {
|
|
|
|
// CALCULATION!!
|
|
|
|
|
|
|
|
/** TODO: TrajectoryCalculator-Objekt instanzieren mit Eigabewerten, CalculationTask instanzieren und executen mit TrajectoryCalculator-Objekt*/
|
|
|
|
|
|
|
|
} else {
|
|
|
|
Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
|
|
|
|
toast.setGravity(Gravity.CENTER, 0, 0);
|
|
|
|
@@ -651,4 +657,89 @@ public class RBSMainActivity extends Activity implements ChooseArcherySetupDlgDi |
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCalculationDone(final Double[][] flightCurve, final Double startAngle, final Double[] maxHCurve) {
|
|
|
|
this.startAngle = startAngle;
|
|
|
|
calculateSettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void calculateSettings() {
|
|
|
|
|
|
|
|
if (allSightParamFieldsValid()) {
|
|
|
|
Double x0;
|
|
|
|
Double y0;
|
|
|
|
Double x1;
|
|
|
|
Double y1;
|
|
|
|
Double x2;
|
|
|
|
Double y2;
|
|
|
|
Double x3;
|
|
|
|
Double y3;
|
|
|
|
Double r;
|
|
|
|
Double s;
|
|
|
|
Double vVh = Double.valueOf(this.scVvisHTxtFld.getText().toString()) + Double.valueOf(this.scaHTxtFld.getText().toString());
|
|
|
|
Double vVv = Double.valueOf(this.scVvisVTxtFld.getText().toString()) + Double.valueOf(this.scaVTxtFld.getText().toString());
|
|
|
|
Double a = Double.valueOf(this.bowPulloutTxtFld.getText().toString()) * 10;
|
|
|
|
Double heVs = this.scHeVSSpinner.getVisibility() == View.VISIBLE ? Double.valueOf(this.scHeVSSpinner.getSelectedItem().toString())
|
|
|
|
: Double.valueOf(this.scHeVSTxtFld.getText().toString());
|
|
|
|
Double lhNA = this.selectedArcherySetup.getHNA() * 10;
|
|
|
|
Double dltH = (Double.valueOf(this.arrowNockHeightTxtFld.getText().toString())
|
|
|
|
- Double.valueOf(this.targetCenterHeightTxtFld.getText().toString())) * Math.pow(10, 3);
|
|
|
|
Double ldistH = Double.valueOf(this.shootingDistanzTxtFld.getText().toString()) * Math.pow(10, 3);
|
|
|
|
Double minSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
|
|
|
|
? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(0,
|
|
|
|
this.scVertScaleRngTxtFld.getText().toString()
|
|
|
|
.indexOf('-'))) : 0d;
|
|
|
|
Double maxSkala = this.scVertScaleRngTxtFld.getText().toString().contains("-")
|
|
|
|
? Double.valueOf(this.scVertScaleRngTxtFld.getText().toString().substring(this.scVertScaleRngTxtFld.getText().toString()
|
|
|
|
.indexOf('-') + 1,
|
|
|
|
this.scVertScaleRngTxtFld.getText().toString()
|
|
|
|
.length())) : 0d;
|
|
|
|
|
|
|
|
// PIN auf Höhe Pfeil
|
|
|
|
x0 = (a + vVh + heVs) * Math.cos(Math.toRadians(this.startAngle));
|
|
|
|
y0 = (a + vVh + heVs) * Math.sin(Math.toRadians(this.startAngle));
|
|
|
|
|
|
|
|
// PIN auf Höhe Horizontalschlitten Visier
|
|
|
|
x2 = x0 + vVv * Math.cos(Math.toRadians(ANGLE_90 + this.startAngle));
|
|
|
|
y2 = y0 + vVv * Math.sin(Math.toRadians(ANGLE_90 + this.startAngle));
|
|
|
|
|
|
|
|
// Schnittpunkt der Achse Horizontalschlitten Visier mit Achse Befestigungslöcher Visier
|
|
|
|
x3 = (a + vVh) * Math.cos(Math.toRadians(this.startAngle)) + vVv * Math.cos(Math.toRadians(ANGLE_90 + this.startAngle));
|
|
|
|
y3 = (a + vVh) * Math.sin(Math.toRadians(this.startAngle)) + vVv * Math.sin(Math.toRadians(ANGLE_90 + this.startAngle));
|
|
|
|
|
|
|
|
// Unbekannte der Vektorgeradengleichung
|
|
|
|
r = (lhNA * (x0 - x2) - x0 * y2 + x2 * y0) / (ldistH * (y0 - y2) + (dltH - lhNA) * (x2 - x0));
|
|
|
|
s = -((ldistH * (lhNA - y0) + (dltH - lhNA) * x0) / (ldistH * (y0 - y2) + (dltH - lhNA) * (x2 - x0)));
|
|
|
|
|
|
|
|
// Pin auf Visierlinie
|
|
|
|
x1 = r * ldistH;
|
|
|
|
y1 = lhNA + r * (dltH - lhNA);
|
|
|
|
|
|
|
|
// Unten (+) oder oben (-) von (x2/y2) ?
|
|
|
|
Double n = ((y2 - y3) * (x1 - x3) - (x2 - x3) * (y1 - y3)) < 0 ? -1.0 : 1.0;
|
|
|
|
|
|
|
|
// Abstand P1 - P2
|
|
|
|
Double d = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) * n;
|
|
|
|
|
|
|
|
// Einstellung auf vert. Skala
|
|
|
|
Double sV = Double.valueOf(this.scVertScaleMiddleTxtFld.getText().toString()) + d;
|
|
|
|
|
|
|
|
this.scEvSValue.setText(DF_EVS.format(sV));
|
|
|
|
|
|
|
|
if (minSkala <= sV && sV <= maxSkala) {
|
|
|
|
this.scEvSValue.setBackgroundDrawable(getResources().getDrawable(R.drawable.evs_ok_background));
|
|
|
|
} else {
|
|
|
|
this.scEvSValue.setBackgroundDrawable(getResources().getDrawable(R.drawable.evs_nok_background));
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
this.scEvSValue.setText("");
|
|
|
|
|
|
|
|
Toast toast = Toast.makeText(this, getResources().getString(R.string.caption_FillAllMandatoryFields), Toast.LENGTH_LONG);
|
|
|
|
toast.setGravity(Gravity.CENTER, 0, 0);
|
|
|
|
toast.show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|