diff --git a/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..2ee8b5c 100644 Binary files a/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..f9d0f2b 100644 Binary files a/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..ce4c428 100644 Binary files a/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..ae9f211 100644 Binary files a/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..cb02c95 100644 Binary files a/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 40e51ad..8662957 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -45,6 +45,7 @@ class MyHomePage extends StatefulWidget { class _MyHomePageState extends State { final _barcodeScanner = BarcodeScanner(formats: [BarcodeFormat.qrCode]); +// late final AnalysisController _scannerController; final _rxTextController = BehaviorSubject(); late final Stream _rxTextStream = _rxTextController.stream; @@ -53,6 +54,7 @@ class _MyHomePageState extends State { final HashSet _rxData = HashSet(); String _rxText = ''; int _rxCount = 1; + int _bSize = 0; final _formatter = NumberFormat('###,###,###'); @@ -66,18 +68,19 @@ class _MyHomePageState extends State { Widget build(BuildContext context) { return Scaffold( body: CameraAwesomeBuilder.previewOnly( + zoom: 1.5, onImageForAnalysis: (img) => _processImageBarcode(img), imageAnalysisConfig: AnalysisConfig( androidOptions: const AndroidAnalysisOptions.nv21( width: 600, ), maxFramesPerSecond: 20, - autoStart: false, + autoStart: true, ), builder: (cameraModeState, previewSize, previewRect) { + //_scannerController = cameraModeState.analysisController!; return _RxTextDisplayWidget( rxTextStream: _rxTextStream, - analysisController: cameraModeState.analysisController!, ); }, ), @@ -124,30 +127,42 @@ class _MyHomePageState extends State { case CuttleState.receiving: { - var txconf = await api.getTxConfig(bytes: dbytes); - if (txconf != null) { - await api.dropTxConfig(txc: txconf); + if (_bSize > 0 && dbytes.length < _bSize) { continue; } - final packet = RaptorPacket(field0: dbytes); - _rxData.add(packet); - _rxCount += 1; - if (_rxCount % 40 == 0) { - _rxCount = 1; - final content = await api.decodePackets( - packets: _rxData.toList(), txconf: _txConfig!); - if (content != null) { - _rxData.clear(); - _barcodeScanner.close(); - _cuttleState = CuttleState.received; - _rxTextController.add("DONE RECEIVING $_rxText"); - final f = - await _saveReceivedFile(_txConfig!.filename, content); - _rxTextController.add("Saved content to $f"); + if (_bSize == 0) { + var txconf = await api.getTxConfig(bytes: dbytes); + if (txconf != null) { + await api.dropTxConfig(txc: txconf); continue; } } + _bSize = dbytes.length; + final packet = RaptorPacket(field0: dbytes); + _rxData.add(packet); + _rxCount += 1; final bytesTotal = _rxData.length * dbytes.length; + if (_rxCount % 40 == 0) { + _rxCount = 1; + + // if we've not received at least as many bytes as txconf.len, + // we cannot have enough bytes to reconstruct, so only try to + // decode if we've gotten at least that many + if (bytesTotal > _txConfig!.len) { + final content = await api.decodePackets( + packets: _rxData.toList(), txconf: _txConfig!); + if (content != null) { + _rxData.clear(); + _barcodeScanner.close(); + _cuttleState = CuttleState.received; + _rxTextController.add("DONE RECEIVING $_rxText"); + final f = + await _saveReceivedFile(_txConfig!.filename, content); + _rxTextController.add("Saved content to $f"); + continue; + } + } + } final pct = (100.0 * bytesTotal / _txConfig!.len).floor(); _rxTextController.add( "$_rxText -- $pct% received (${_formatter.format(bytesTotal)} bytes)"); @@ -176,13 +191,10 @@ class _MyHomePageState extends State { class _RxTextDisplayWidget extends StatefulWidget { final Stream rxTextStream; - final AnalysisController analysisController; - const _RxTextDisplayWidget({ // ignore: unused_element super.key, required this.rxTextStream, - required this.analysisController, }); @override @@ -199,24 +211,6 @@ class _RxTextDisplayWidgetState extends State<_RxTextDisplayWidget> { color: Colors.white, ), child: Column(mainAxisSize: MainAxisSize.min, children: [ - Material( - color: Colors.transparent, - child: CheckboxListTile( - value: widget.analysisController.enabled, - onChanged: (newValue) async { - if (widget.analysisController.enabled == true) { - await widget.analysisController.stop(); - } else { - await widget.analysisController.start(); - } - setState(() {}); - }, - title: const Text( - "Enable barcode scan", - style: TextStyle(fontWeight: FontWeight.bold), - ), - ), - ), Container( height: 120, padding: const EdgeInsets.symmetric(horizontal: 16),