Skip to content

Commit b10011d

Browse files
authored
feat: added text input support (#2687)
1 parent cfc8a50 commit b10011d

File tree

8 files changed

+185
-79
lines changed

8 files changed

+185
-79
lines changed

.github/actions/android/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ runs:
2626
using: "composite"
2727
steps:
2828
- name: Set up Java
29-
uses: actions/setup-java@v2
29+
uses: actions/setup-java@v4
3030
with:
3131
java-version: 17
3232
distribution: 'adopt'

lib/others/oscilloscope_axes_scale.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
class OscillscopeAxesScale {
1+
class OscilloscopeAxesScale {
22
late double _yAxisScale;
33
late double _yAxisScaleMin;
44
late double _yAxisScaleMax;
55
late double _xAxisScale;
66

7-
OscillscopeAxesScale() {
7+
OscilloscopeAxesScale() {
88
_yAxisScale = 16;
99
_yAxisScaleMin = -16;
1010
_yAxisScaleMax = 16;

lib/providers/oscilloscope_state_provider.dart

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
8484

8585
late Timer _timer;
8686

87-
late OscillscopeAxesScale oscillscopeAxesScale;
87+
late OscilloscopeAxesScale oscilloscopeAxesScale;
8888

8989
OscilloscopeStateProvider() {
9090
_audioJack = AudioJack();
@@ -107,7 +107,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
107107
xyPlotAxis1 = 'CH1';
108108
xyPlotAxis2 = 'CH2';
109109
dataEntries = [];
110-
dataEntriesXYPlot = [[]];
110+
dataEntriesXYPlot = [];
111111
dataEntriesCurveFit = [];
112112
_timebaseDivisions = 8;
113113
timebaseSlider = 0;
@@ -144,7 +144,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
144144
curveFittingChannel1 = '';
145145
curveFittingChannel2 = '';
146146
_analyticsClass = AnalyticsClass();
147-
oscillscopeAxesScale = OscillscopeAxesScale();
147+
oscilloscopeAxesScale = OscilloscopeAxesScale();
148148

149149
monitor();
150150
}
@@ -192,6 +192,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
192192
if (channels.isNotEmpty) {
193193
await captureTask(channels);
194194
} else {
195+
resetGraph();
195196
dataEntries = [];
196197
}
197198
}
@@ -308,7 +309,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
308309
if (isTriggerSelected && triggerChannel == channel) {
309310
if (currY > prevY) {
310311
increasing = true;
311-
} else if (currY < prevY && increasing) {
312+
} else if ((currY < prevY) && increasing) {
312313
increasing = false;
313314
}
314315
if (isTriggered) {
@@ -334,7 +335,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
334335
}
335336
prevY = currY;
336337
} else {
337-
entries[i].add(FlSpot(xData[j] + xOffsets[channels[i]]!,
338+
entries[i].add(FlSpot(xData[j] - xOffsets[channels[i]]!,
338339
yData[j] + yOffsets[channels[i]]!));
339340
}
340341
} else {
@@ -363,8 +364,7 @@ class OscilloscopeStateProvider extends ChangeNotifier {
363364
for (int j = 0; j < 500; j++) {
364365
double x = j * max / 500;
365366
double y = offset +
366-
amp * sin((freq * (2 * pi)).abs()) * x +
367-
phase * pi / 180;
367+
amp * sin(((freq * (2 * pi)).abs()) * x + phase * pi / 180);
368368
curveFitEntries[curveFitEntries.length - 1].add(FlSpot(x, y));
369369
}
370370
}
@@ -458,13 +458,13 @@ class OscilloscopeStateProvider extends ChangeNotifier {
458458
double k = ((xDataPoint / AudioJack.samplingRate) * 1000000.0);
459459
k = k / ((timebase == 875) ? 1 : 1000);
460460
entries[entries.length - 1].add(FlSpot(
461-
k + xOffsets['MIC']!, audioValue + yOffsets['MIC']!));
461+
k - xOffsets['MIC']!, audioValue + yOffsets['MIC']!));
462462
xDataPoint++;
463463
}
464464
prevY = currY;
465465
} else {
466466
entries[entries.length - 1].add(
467-
FlSpot(j + xOffsets['MIC']!, audioValue + yOffsets['MIC']!));
467+
FlSpot(j - xOffsets['MIC']!, audioValue + yOffsets['MIC']!));
468468
}
469469
} else {
470470
if (i < n / 2) {
@@ -488,13 +488,15 @@ class OscilloscopeStateProvider extends ChangeNotifier {
488488
dataEntriesCurveFit = List.from(curveFitEntries);
489489
dataParamsChannels = List.from(paramsChannels);
490490
if (isFourierTransformSelected) {
491-
oscillscopeAxesScale.setYAxisScaleMax(_maxAmp);
492-
oscillscopeAxesScale.setYAxisScaleMin(0);
493-
oscillscopeAxesScale.setXAxisScale(_maxFreq * 1000);
491+
oscilloscopeAxesScale.setYAxisScaleMax(_maxAmp);
492+
oscilloscopeAxesScale.setYAxisScaleMin(0);
493+
oscilloscopeAxesScale.setXAxisScale(_maxFreq * 1000);
494494
} else {
495-
oscillscopeAxesScale.setYAxisScaleMax(oscillscopeAxesScale.yAxisScale);
496-
oscillscopeAxesScale.setYAxisScaleMin(-oscillscopeAxesScale.yAxisScale);
497-
oscillscopeAxesScale.setXAxisScale(timebase);
495+
oscilloscopeAxesScale
496+
.setYAxisScaleMax(oscilloscopeAxesScale.yAxisScale);
497+
oscilloscopeAxesScale
498+
.setYAxisScaleMin(-oscilloscopeAxesScale.yAxisScale);
499+
oscilloscopeAxesScale.setXAxisScale(timebase);
498500
}
499501
notifyListeners();
500502
} catch (e) {
@@ -540,6 +542,12 @@ class OscilloscopeStateProvider extends ChangeNotifier {
540542
timebase = 875.00;
541543
break;
542544
}
545+
oscilloscopeAxesScale.setXAxisScale(timebase);
546+
notifyListeners();
547+
}
548+
549+
void setYAxisScale(double value) {
550+
oscilloscopeAxesScale.setYAxisScale(value);
543551
notifyListeners();
544552
}
545553

@@ -605,6 +613,15 @@ class OscilloscopeStateProvider extends ChangeNotifier {
605613
);
606614
}
607615

616+
void resetGraph() {
617+
oscilloscopeAxesScale.setYAxisScaleMax(oscilloscopeAxesScale.yAxisScale);
618+
oscilloscopeAxesScale.setYAxisScaleMin(-oscilloscopeAxesScale.yAxisScale);
619+
oscilloscopeAxesScale.setXAxisScale(timebase);
620+
dataEntries = [];
621+
dataEntriesXYPlot = [];
622+
dataEntriesCurveFit = [];
623+
}
624+
608625
@override
609626
void dispose() {
610627
_monitor = false;

lib/view/widgets/channel_parameters_widget.dart

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,44 +86,34 @@ class _ChannelParametersState extends State<ChannelParametersWidget> {
8686
onSelected: (String? value) {
8787
switch (yAxisRanges.indexOf(value!)) {
8888
case 0:
89-
oscilloscopeStateProvider.oscillscopeAxesScale
90-
.setYAxisScale(16);
89+
oscilloscopeStateProvider.setYAxisScale(16);
9190
break;
9291
case 1:
93-
oscilloscopeStateProvider.oscillscopeAxesScale
94-
.setYAxisScale(8);
92+
oscilloscopeStateProvider.setYAxisScale(8);
9593
break;
9694
case 2:
97-
oscilloscopeStateProvider.oscillscopeAxesScale
98-
.setYAxisScale(4);
95+
oscilloscopeStateProvider.setYAxisScale(4);
9996
break;
10097
case 3:
101-
oscilloscopeStateProvider.oscillscopeAxesScale
102-
.setYAxisScale(3);
98+
oscilloscopeStateProvider.setYAxisScale(3);
10399
break;
104100
case 4:
105-
oscilloscopeStateProvider.oscillscopeAxesScale
106-
.setYAxisScale(2);
101+
oscilloscopeStateProvider.setYAxisScale(2);
107102
break;
108103
case 5:
109-
oscilloscopeStateProvider.oscillscopeAxesScale
110-
.setYAxisScale(1.5);
104+
oscilloscopeStateProvider.setYAxisScale(1.5);
111105
break;
112106
case 6:
113-
oscilloscopeStateProvider.oscillscopeAxesScale
114-
.setYAxisScale(1);
107+
oscilloscopeStateProvider.setYAxisScale(1);
115108
break;
116109
case 7:
117-
oscilloscopeStateProvider.oscillscopeAxesScale
118-
.setYAxisScale(0.5);
110+
oscilloscopeStateProvider.setYAxisScale(0.5);
119111
break;
120112
case 8:
121-
oscilloscopeStateProvider.oscillscopeAxesScale
122-
.setYAxisScale(160);
113+
oscilloscopeStateProvider.setYAxisScale(160);
123114
break;
124115
default:
125-
oscilloscopeStateProvider.oscillscopeAxesScale
126-
.setYAxisScale(16);
116+
oscilloscopeStateProvider.setYAxisScale(16);
127117
break;
128118
}
129119
oscilloscopeStateProvider.oscillscopeRangeSelection =

lib/view/widgets/common_scaffold_widget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class _CommonScaffoldState extends State<CommonScaffold> {
2424
Widget build(BuildContext context) {
2525
return Scaffold(
2626
backgroundColor: Colors.white,
27-
resizeToAvoidBottomInset: true,
27+
resizeToAvoidBottomInset: false,
2828
appBar: AppBar(
2929
systemOverlayStyle:
3030
const SystemUiOverlayStyle(statusBarColor: Color(0xFFD32F2F)),

lib/view/widgets/data_analysis_widget.dart

Lines changed: 90 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -270,17 +270,17 @@ class _DataAnalysisState extends State<DataAnalysisWidget> {
270270
child: Slider(
271271
activeColor: const Color(0xFFCE525F),
272272
min: -oscilloscopeStateProvider
273-
.oscillscopeAxesScale.yAxisScale,
273+
.oscilloscopeAxesScale.yAxisScale,
274274
max: oscilloscopeStateProvider
275-
.oscillscopeAxesScale.yAxisScale,
275+
.oscilloscopeAxesScale.yAxisScale,
276276
value: oscilloscopeStateProvider.yOffsets[
277277
oscilloscopeStateProvider
278278
.selectedChannelOffset]!
279279
.clamp(
280280
-oscilloscopeStateProvider
281-
.oscillscopeAxesScale.yAxisScale,
281+
.oscilloscopeAxesScale.yAxisScale,
282282
oscilloscopeStateProvider
283-
.oscillscopeAxesScale.yAxisScale),
283+
.oscilloscopeAxesScale.yAxisScale),
284284
onChanged: (double value) {
285285
setState(
286286
() {
@@ -293,12 +293,43 @@ class _DataAnalysisState extends State<DataAnalysisWidget> {
293293
),
294294
),
295295
),
296-
Text(
297-
'${oscilloscopeStateProvider.yOffsets[oscilloscopeStateProvider.selectedChannelOffset]!.toStringAsFixed(2)} V',
298-
style: const TextStyle(
299-
fontSize: 14,
300-
fontWeight: FontWeight.normal,
301-
fontStyle: FontStyle.normal,
296+
SizedBox(
297+
width: 50,
298+
child: TextField(
299+
controller: TextEditingController(
300+
text:
301+
'${oscilloscopeStateProvider.yOffsets[oscilloscopeStateProvider.selectedChannelOffset]!.toStringAsFixed(2)} V',
302+
),
303+
decoration: const InputDecoration(
304+
border: InputBorder.none,
305+
),
306+
style: const TextStyle(
307+
fontSize: 14,
308+
fontWeight: FontWeight.normal,
309+
fontStyle: FontStyle.normal,
310+
),
311+
onSubmitted: (value) {
312+
String triggerValue =
313+
value.replaceAll("V", "").trim();
314+
double parsedValue =
315+
double.tryParse(triggerValue) ?? 0.0;
316+
if (parsedValue >
317+
oscilloscopeStateProvider
318+
.oscilloscopeAxesScale.yAxisScaleMax) {
319+
parsedValue = oscilloscopeStateProvider
320+
.oscilloscopeAxesScale.yAxisScaleMax;
321+
} else if (parsedValue <
322+
oscilloscopeStateProvider
323+
.oscilloscopeAxesScale.yAxisScaleMin) {
324+
parsedValue = oscilloscopeStateProvider
325+
.oscilloscopeAxesScale.yAxisScaleMin;
326+
}
327+
setState(() {
328+
oscilloscopeStateProvider.yOffsets[
329+
oscilloscopeStateProvider
330+
.selectedChannelOffset] = parsedValue;
331+
});
332+
},
302333
),
303334
),
304335
],
@@ -322,7 +353,7 @@ class _DataAnalysisState extends State<DataAnalysisWidget> {
322353
min: 0,
323354
max: oscilloscopeStateProvider.timebase / 1000,
324355
value: oscilloscopeStateProvider
325-
.oscillscopeAxesScale.xAxisScale ==
356+
.oscilloscopeAxesScale.xAxisScale ==
326357
875
327358
? (oscilloscopeStateProvider.xOffsets[
328359
oscilloscopeStateProvider
@@ -343,7 +374,7 @@ class _DataAnalysisState extends State<DataAnalysisWidget> {
343374
setState(
344375
() {
345376
if (oscilloscopeStateProvider
346-
.oscillscopeAxesScale
377+
.oscilloscopeAxesScale
347378
.xAxisScale ==
348379
875) {
349380
oscilloscopeStateProvider.xOffsets[
@@ -361,16 +392,53 @@ class _DataAnalysisState extends State<DataAnalysisWidget> {
361392
),
362393
),
363394
),
364-
Text(
365-
oscilloscopeStateProvider
366-
.oscillscopeAxesScale.xAxisScale ==
367-
875
368-
? '${(oscilloscopeStateProvider.xOffsets[oscilloscopeStateProvider.selectedChannelOffset]! / 1000).toStringAsFixed(2)} ms'
369-
: '${oscilloscopeStateProvider.xOffsets[oscilloscopeStateProvider.selectedChannelOffset]!.toStringAsFixed(2)} ms',
370-
style: const TextStyle(
371-
fontSize: 14,
372-
fontWeight: FontWeight.normal,
373-
fontStyle: FontStyle.normal,
395+
SizedBox(
396+
width: 60,
397+
child: TextField(
398+
controller: TextEditingController(
399+
text: oscilloscopeStateProvider
400+
.oscilloscopeAxesScale.xAxisScale ==
401+
875
402+
? '${(oscilloscopeStateProvider.xOffsets[oscilloscopeStateProvider.selectedChannelOffset]! / 1000).toStringAsFixed(2)} ms'
403+
: '${oscilloscopeStateProvider.xOffsets[oscilloscopeStateProvider.selectedChannelOffset]!.toStringAsFixed(2)} ms',
404+
),
405+
style: const TextStyle(
406+
fontSize: 14,
407+
fontWeight: FontWeight.normal,
408+
fontStyle: FontStyle.normal,
409+
),
410+
onSubmitted: (value) {
411+
String triggerValue = value
412+
.replaceAll(RegExp(r'[ms]'), "")
413+
.trim();
414+
double parsedValue =
415+
double.tryParse(triggerValue) ?? 0.0;
416+
if (parsedValue >
417+
(oscilloscopeStateProvider
418+
.oscilloscopeAxesScale.xAxisScale /
419+
1000)) {
420+
parsedValue = oscilloscopeStateProvider
421+
.oscilloscopeAxesScale.xAxisScale /
422+
1000;
423+
} else if (parsedValue < 0.0) {
424+
parsedValue = 0.0;
425+
}
426+
setState(() {
427+
if (oscilloscopeStateProvider
428+
.oscilloscopeAxesScale.xAxisScale ==
429+
875) {
430+
oscilloscopeStateProvider.xOffsets[
431+
oscilloscopeStateProvider
432+
.selectedChannelOffset] =
433+
parsedValue * 1000;
434+
} else {
435+
oscilloscopeStateProvider.xOffsets[
436+
oscilloscopeStateProvider
437+
.selectedChannelOffset] =
438+
parsedValue;
439+
}
440+
});
441+
},
374442
),
375443
),
376444
],

0 commit comments

Comments
 (0)