Skip to content

Commit dd5db82

Browse files
AsCressmarcnause
andauthored
feat: added Auto-Scale (#2463)
Co-authored-by: Marc Nause <marc.nause@audioattack.de>
1 parent 1fc0e75 commit dd5db82

File tree

5 files changed

+82
-15
lines changed

5 files changed

+82
-15
lines changed

app/src/main/java/io/pslab/activity/OscilloscopeActivity.java

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.util.Date;
5353
import java.util.HashMap;
5454
import java.util.List;
55+
import java.util.Objects;
5556
import java.util.Timer;
5657
import java.util.TimerTask;
5758

@@ -110,7 +111,9 @@ public class OscilloscopeActivity extends GuideActivity implements View.OnClickL
110111
public int samples;
111112
public double timeGap;
112113
public double timebase;
114+
public double maxTimebase = 102.4f;
113115
public double xAxisScale = 875f;
116+
public double yAxisScale = 16f;
114117
public boolean isCH1Selected;
115118
public boolean isCH2Selected;
116119
public boolean isCH3Selected;
@@ -200,6 +203,8 @@ public class OscilloscopeActivity extends GuideActivity implements View.OnClickL
200203
private boolean isPlayingback = false;
201204
private boolean isPlaying = false;
202205
private MenuItem playMenu;
206+
private ArrayList<ArrayList<Entry>> dataEntries = new ArrayList<>();
207+
private String[] dataParamsChannels;
203208

204209
private enum CHANNEL {CH1, CH2, CH3, MIC}
205210

@@ -595,6 +600,11 @@ public void onClick(View view) {
595600
playRecordedData();
596601
}
597602
break;
603+
case R.id.auto_scale:
604+
if (((isCH1Selected || isCH2Selected || isCH3Selected || isMICSelected) && scienceLab.isConnected()) || isInBuiltMicSelected) {
605+
autoScale();
606+
}
607+
break;
598608
default:
599609
break;
600610
}
@@ -1119,6 +1129,8 @@ public void run() {
11191129
@Override
11201130
protected void onPostExecute(Void aVoid) {
11211131
super.onPostExecute(aVoid);
1132+
dataEntries = new ArrayList<>(entries);
1133+
dataParamsChannels = paramsChannels.clone();
11221134

11231135
List<ILineDataSet> dataSets = new ArrayList<>();
11241136
for (int i = 0; i < Math.min(entries.size(), paramsChannels.length); i++) {
@@ -1137,14 +1149,14 @@ protected void onPostExecute(Void aVoid) {
11371149
dataSets.add(dataSet);
11381150
}
11391151
LineData data = new LineData(dataSets);
1140-
if (!isFourierTransformSelected) {
1141-
setXAxisScale(xAxisScale);
1142-
setLeftYAxisScale(16, -16);
1143-
setRightYAxisScale(16, -16);
1144-
} else {
1152+
if (isFourierTransformSelected) {
11451153
setXAxisScale(maxFreq);
11461154
setLeftYAxisScale(maxAmp, 0);
11471155
setRightYAxisScale(maxAmp, 0);
1156+
} else {
1157+
setXAxisScale(xAxisScale);
1158+
setLeftYAxisScale(yAxisScale, -1 * yAxisScale);
1159+
setRightYAxisScale(yAxisScale, -1 * yAxisScale);
11481160
}
11491161
mChart.setData(data);
11501162
mChart.notifyDataSetChanged();
@@ -1155,6 +1167,52 @@ protected void onPostExecute(Void aVoid) {
11551167
}
11561168
}
11571169

1170+
public void autoScale() {
1171+
double minY = Double.MAX_VALUE;
1172+
double maxY = Double.MIN_VALUE;
1173+
double maxPeriod = Double.MIN_VALUE;
1174+
double yRange;
1175+
double yPadding;
1176+
double[] voltage = new double[512];
1177+
for (int i = 0; i < dataParamsChannels.length; i++) {
1178+
if (dataEntries.size() > i) {
1179+
ArrayList<Entry> entryArrayList = dataEntries.get(i);
1180+
for (int j = 0; j < entryArrayList.size(); j++) {
1181+
Entry entry = entryArrayList.get(j);
1182+
if (j < voltage.length - 1) {
1183+
voltage[j] = entry.getY();
1184+
}
1185+
if (entry.getY() > maxY) {
1186+
maxY = entry.getY();
1187+
}
1188+
if (entry.getY() < minY) {
1189+
minY = entry.getY();
1190+
}
1191+
}
1192+
final double frequency;
1193+
if (Objects.equals(dataParamsChannels[i], CHANNEL.MIC.toString())) {
1194+
frequency = analyticsClass.findFrequency(voltage, ((double) 1 / SAMPLING_RATE));
1195+
} else {
1196+
frequency = analyticsClass.findFrequency(voltage, timeGap / 1000000.0);
1197+
}
1198+
double period = (1 / frequency) * 1000.0;
1199+
if (period > maxPeriod) {
1200+
maxPeriod = period;
1201+
}
1202+
}
1203+
}
1204+
yRange = maxY - minY;
1205+
yPadding = yRange * 0.1;
1206+
if ((maxPeriod * 5) < maxTimebase) {
1207+
xAxisScale = maxPeriod * 5;
1208+
} else {
1209+
xAxisScale = maxTimebase;
1210+
}
1211+
yAxisScale = maxY + yPadding;
1212+
samples = 512;
1213+
timeGap = (2 * xAxisScale * 1000.0) / samples;
1214+
}
1215+
11581216
public class XYPlotTask extends AsyncTask<String, Void, Void> {
11591217
private String analogInput1;
11601218
private String analogInput2;

app/src/main/java/io/pslab/fragment/ChannelParametersFragment.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,14 +245,17 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
245245
((OscilloscopeActivity) getActivity()).isAudioInputSelected = isChecked;
246246
((OscilloscopeActivity) getActivity()).isMICSelected = !isChecked;
247247
if (isChecked) {
248-
if(pslabMicCheckBox.isChecked()) {
248+
((OscilloscopeActivity) getActivity()).maxTimebase = 38.4f;
249+
if (pslabMicCheckBox.isChecked()) {
249250
pslabMicCheckBox.setChecked(false);
250251
((OscilloscopeActivity) getActivity()).isAudioInputSelected = true;
251252
}
252253
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
253254
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, RECORD_AUDIO_REQUEST_CODE);
254255
((OscilloscopeActivity) getActivity()).isAudioInputSelected = false;
255256
}
257+
} else {
258+
((OscilloscopeActivity) getActivity()).maxTimebase = 102.4f;
256259
}
257260
}
258261
});
@@ -264,7 +267,7 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
264267
((OscilloscopeActivity) getActivity()).isAudioInputSelected = isChecked;
265268
((OscilloscopeActivity) getActivity()).isInBuiltMicSelected = !isChecked;
266269
if (isChecked) {
267-
if(builtInMicCheckBox.isChecked()) {
270+
if (builtInMicCheckBox.isChecked()) {
268271
builtInMicCheckBox.setChecked(false);
269272
((OscilloscopeActivity) getActivity()).isAudioInputSelected = true;
270273
}
@@ -285,7 +288,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
285288
((OscilloscopeActivity) getActivity()).isInBuiltMicSelected = true;
286289
} else {
287290
CustomSnackBar.showSnackBar(getActivity().findViewById(android.R.id.content),
288-
"This feature won't work.",null,null, Snackbar.LENGTH_SHORT);
291+
"This feature won't work.", null, null, Snackbar.LENGTH_SHORT);
289292
if (builtInMicCheckBox.isChecked())
290293
builtInMicCheckBox.toggle();
291294
}

app/src/main/java/io/pslab/fragment/TimebaseTriggerFragment.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
4646
textViewTrigger = v.findViewById(R.id.tv_trigger_values_tt);
4747
spinnerTriggerChannelSelect = v.findViewById(R.id.spinner_trigger_channel_tt);
4848
checkBoxTrigger = v.findViewById(R.id.checkbox_trigger_tt);
49+
seekBarTimebase.setSaveEnabled(false);
4950

5051
boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
5152

@@ -54,7 +55,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
5455
textViewTimeBase.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
5556
}
5657

57-
if(OscilloscopeActivity.isInBuiltMicSelected){
58+
if (OscilloscopeActivity.isInBuiltMicSelected) {
5859
seekBarTimebase.setMax(6);
5960
seekBarTimebase.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
6061
@Override
@@ -63,8 +64,8 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
6364
switch (progress) {
6465
case 0:
6566
textViewTimeBase.setText(getString(R.string.timebase_microsec, 875f));
66-
((OscilloscopeActivity) getActivity()).xAxisScale = 875;
67-
((OscilloscopeActivity) getActivity()).setXAxisScale(875);
67+
((OscilloscopeActivity) getActivity()).xAxisScale = 0.875;
68+
((OscilloscopeActivity) getActivity()).setXAxisScale(0.875);
6869
((OscilloscopeActivity) getActivity()).timebase = 875;
6970
((OscilloscopeActivity) getActivity()).samples = 512;
7071
((OscilloscopeActivity) getActivity()).timeGap = 2;
@@ -133,8 +134,7 @@ public void onStopTrackingTouch(SeekBar seekBar) {
133134
}
134135
});
135136
seekBarTimebase.setProgress(0);
136-
}
137-
else {
137+
} else {
138138
seekBarTimebase.setMax(8);
139139
seekBarTimebase.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
140140
@Override
@@ -143,8 +143,8 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
143143
switch (progress) {
144144
case 0:
145145
textViewTimeBase.setText(getString(R.string.timebase_microsec, 875f));
146-
((OscilloscopeActivity) getActivity()).xAxisScale = 875;
147-
((OscilloscopeActivity) getActivity()).setXAxisScale(875);
146+
((OscilloscopeActivity) getActivity()).xAxisScale = 0.875;
147+
((OscilloscopeActivity) getActivity()).setXAxisScale(0.875);
148148
((OscilloscopeActivity) getActivity()).timebase = 875;
149149
((OscilloscopeActivity) getActivity()).samples = 512;
150150
((OscilloscopeActivity) getActivity()).timeGap = 2;

app/src/main/res/menu/activity_landscape_menu.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<menu xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
<item
5+
android:id="@+id/auto_scale"
6+
android:iconTint="@color/white"
7+
android:title="@string/auto_scale"
8+
app:showAsAction="always" />
49
<item
510
android:id="@+id/run_stop"
611
android:iconTint="@color/white"

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,7 @@
10561056
<string name="limit_average">Average</string>
10571057
<string name="no_playback_data">No data to display</string>
10581058
<string name="privacy_policy">Privacy Policy</string>
1059+
<string name="auto_scale">Auto</string>
10591060
<string name="control_stop">Stop</string>
10601061
<string name="control_run">Run</string>
10611062
</resources>

0 commit comments

Comments
 (0)