From be1e6e3f1e1e09269c577afc9ec2d8d486dfe5b7 Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Wed, 30 Aug 2023 10:11:35 -0700 Subject: [PATCH] add logo, do more aggressive batching --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 1589 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1226 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 1918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 2792 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 3800 bytes mobile/lib/main.dart | 76 ++++++++---------- 6 files changed, 35 insertions(+), 41 deletions(-) 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 db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..2ee8b5c1a6a6f161025a9e4cd2d130fe5ceabaa7 100644 GIT binary patch literal 1589 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vCBp3?X-pmG4OiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KR`kD5>H=O_U9Zj;?}0~oc2s&U|?qQba4!cIJ`E(x=+MVpf-Q2P&LyM zUylg_a~dY}nnepvP<$pgr(ufqnPV{wiW~1RZ4u;TWHc1)KcKgL_wrS@+(ItR+q8Pu zzV)Y_AO64a^PJu5;_tOrj_3*Z&Qz+`pI|ZDENo7Q$gNk|kM^gW73R`SQoS>YfpOBY zFLCph#4|Y5tT{jL`HHUC#T*?>*{4<>D_$~b&CEkWvELNubp|e8%pnvsZ`zryuNF82 zwus$pQF^sbXWhKo+K;XxrRA)TE0aEPGAVFaaZL({bcoH@+}0tm;?~MFKUZfTU!-z_ z$@LMh%4wTb3;B+Axiko@JIfVpfA{Yq6(NSeB7GeX^I2P;9(a`gb7jz@+r^ewqKv0F zM6bDPpjyE)?a9U&3S0r=YZJS>)MO64njqRNJwYW~BeneQCzT076SgVb2x;XlS;`@} z^s&rJlN($2I3|AVF7h^V^>93(yDKT?@TG?A7YDEI>t1u?#i^93x}FCbgI3BV{>si` zY~o?fc&pf89PoRWF;7PBwQGmPL`!0$r+iCIndmiP7Gs;U3j;&qugvHDd!K$;y|G2X zC3pV4-*5gDZ)xN?)cX3)Rw>P>ZJl$zrFjHy)jc!e{6=QGzcnx9Jw7D86TRG}raA9M zPT`HBrVZ?_Un)ZVCoFLfi(c0=f9t=~r7mZ0lsl_#|M4g?eQUC<^!Im?LQh}wy?tW2 zY(;Ns_lt|$BpUY%?xbj1pNq=uvi!Ih z^iIG3{URaE-Qi&GDPe~{T=!?B_Wrmmu%FNDAx~kQ)*hE{PagezFvT?KBG<0%=NC$t z=AT*h^c_FT=CD~?{cF$6-o0r*lUwZWA8+Sr6<^-2{svSkk3KE@4$L4IQX@RmJUz7-Kp6{|+Zb6G7=f%FP9PJB&BVye zzzh^`17aZ{8>9w=r5ITu>Va%&D0>Q!tpQcT1Y{dBGBNN1={Z1b1Z0Z<=~Y0S*$%O5 zACL_K9AF5_}eUBa0BAF{Tz)28P-O237_J%$C#cp=ij> zPsvQH#I2zyMK1}cK?-C;YDH$6l~ZO(aX@NOaAIyjPAY?ijsge?y|q&ZsuF~&a?a1m zFA6S5OipDmx6pDk~oqWsFnGH9xvXP5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ 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 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..f9d0f2bf4c4e24d337c68e3f52158ed0af6c986a 100644 GIT binary patch literal 1226 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZANYiNm=xO@5bo#HZ9BWPOTd`I`V56qjj8vAhc}dQ> z*Pbc<@QZ!Esw7JG(<8@h&Xm)Oj#f2a@4517*XHRy-aF+J73P{w{+o4F!KLQxfu38x zO1MA`oX(8i-n6S&3ZXsi|U>2-Lqt$DZioN;hTxx zygbiBZhrb(lwhU4R8aM4l-3rdJ4??5oQzt&_ip~iReT3>m));u-nu<1Dm{O$?e-ty zclI2=9Hi=RHt+J{O=+TS6_Ve#a;$!~T4j$OqjKbLp%oFo`tx~tdFvSCF06ghzt>|e zFxD=lMtG)qdTKF%VjGwQ7+Dw?fvg@*AQOqr#K_FR3>0qzVj&Y?r##ROvRz?;IhGtf#Mpnj_K-G*35H13lG?!`TdmyD+;u=wsl30>zm0Xkx zq`qxEJA?Bm|9pF7-}0BSQ!{FTTZ)&q9HdwB{QuOw}zq=y(FLpDUc1R6`5&P zPMIae0jWj7iMa(isSFl63Lqr()=nL$N)WEfIX@@AD7YXoIhDbXe>RgRP*M>t=>l|O zNMXY(!i(h^C6(LC|uezH!(fcCp9ml!ZTB#@`Re|yd{{-i!m6RtIr7|FgzeHN`ETAfBkSUqT$yUkv z1(ija=@}&q0i{VfnaK(+`MHUidD|u$g31gfn6i}A;^d;tf|AVqJcw~grI|S;x|w+j z#X;^)KIx9aK-FNkgAC10%qvYxOfD%cN-Y8__n9~06i@*l%s61&q~a*Is;`G NJYD@<);T3K0RXEi*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Un3BBRT^Rni_n+Ah4nJ za0`Jj6%T={j zy<4}dzxcJ?t8)Q6?tMILdilGt!buy&lm6kS8m5R`2$A7ueBk@U>c-2Bj0>-d*zlyO zxV^CzIGZAnm(!Zj%~Q;q7B)v`m*rjUX`LL5AqpBBVmCW6PiJB_K5y!=n^Sd7<%gB| zto+Od6S)L98=jils0Xvvo7FUl@^sHE_#7ItKu0OsJn!uMU%O*BW^BLxmVrV12BY()@SE82?;LA3s*e5%*H0juf?e+Ro-^Y zV)q{fZ|??y*#fplUfwF+q#x2^pnfFccu|8%acVo8Qj*G|PVvq)W^G)GvgbNX6rbjo zSWYUxAu-E2+e=`!3@^jC@^9*ezrJ&RWB7K1`M}A4Stbdc83&nzgl0!pCOt`rS2`M^ zG)KX;jw_M#N9IyCk(`o*nMXEHIrMc}kC?He-z+xibIy~Nf8g?P@lRHfn)KXeNge+} zrFqjQ$tFv#m&j0D)j!FfIcQ;nx`)GrB^8MZjDN1(-?iX}-qhHFq~fk$DK(tx2`Ua} zQe6xBGJ`(1bOkdU5NDWQ_>0xzZ;d>MaeD=yyYbRyM-H~-xdKmrO>mF%Z#SRCbS$yE zT60!PX=&`sd5_hKjkH6bsPSGo6ZEV_`ObM6U%3U_uerXhRTknoXTWt;PxQI=F>aaZ z2NtFU|Fl_nXorLE`?=1}*Ll@X&yKudVzumpt;!s)u&}Ne&F0pY%MnZ$3m*xGmzX$j z`?pD#vS(bKj(dN;$zb>?4`qj=nu6>RHZ>Q+4ycl6GEhfMDN%+OxX;TmR{8pQp=5VaCwJQDn5nj{4 z=J}Um*0MZoz5D;xCV>Nj?DzfOg*-Q$*UIQMFL~9^?tk-zZFt^ozrq)}^7fY~=D@GQ z)Ah;^pViKr$^YuOVeNCn(6?8=PB-MxQ@$>?hSTpwb^W!tdy73D*X!|aR`rZurvNNz zE~G|yrg?g5F@Q=aV6nx>!oUb*^>6~2NNgrXW(H=UcpDH40ofomAS}hm3Q-SaOGDXH zfNTw@8YUpykdcXj7f8>o4UHgD+5a0kq4OfV3a8=IvIr&Aw1&PV242Jx(nLL4#if~C6pc6wf zb0N+|^Q4vJ(k`H4VYp&fpr!t4X~n4}42G5lK7F4L0i{LZ(w@1A>8U=cdFdq?3`Qm< zCZ7totNy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ 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 d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..ae9f21180d62d668464b0c92af4f19be8610aafe 100644 GIT binary patch literal 2792 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 F`Y-5EWc~mE literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof 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 4d6372eebdb28e45604e46eeda8dd24651419bc0..cb02c95f149240d0c3b8b2c5d2d9258c44bf805c 100644 GIT binary patch literal 3800 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 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` 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),