From eed9e324a77ca5c692d697526562bdf2ea083d60 Mon Sep 17 00:00:00 2001 From: a2nr Date: Tue, 24 Sep 2024 10:10:13 +0700 Subject: [PATCH] update berhasil signal tertangkap, saatnya troubleshoot front end --- Software/ALL-H3-CC-V1.0A Headers.ods | Bin 42794 -> 43013 bytes Software/dashboard/Makefile | 8 +- Software/dashboard/lib/hal/X9C10X.dart | 5 + Software/dashboard/lib/hal/ads1256.dart | 114 ++++---- .../dashboard/lib/hardware/heartbeatmice.dart | 54 +++- Software/dashboard/lib/main.dart | 86 +++--- Software/dashboard/lib/ui/plot.dart | 252 ++++++++---------- .../dashboard/pulseview_session_setup.pvs | 189 +++++++++++++ 8 files changed, 463 insertions(+), 245 deletions(-) create mode 100644 Software/dashboard/pulseview_session_setup.pvs diff --git a/Software/ALL-H3-CC-V1.0A Headers.ods b/Software/ALL-H3-CC-V1.0A Headers.ods index 369c90759432f2970ef796483dc94c642669231a..08d14452f3e294c273a9ba296db7fdd438a0a977 100644 GIT binary patch delta 12359 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 Cr>n&P delta 12129 zcmZX4b9AQ9mh~H_W83T)9kXMnW81d%CLO1Pj&0kvZQHh;eEsXWcfLC_^-oppXV*Ea zo?5G_PVEyo1zIuz3NI%G295>*Km!0jENG(P<-z_`u}C1qv0|VIQ2&BsFF;uT;unAL zMG&;VZC{XY|J2bL#IdFz82=jf7y3gdj(+~jiq2sFOVVe9f`*3v$3?6bC?&8PK|>E6 zKQeY{Ht)zOlDD8=Z)N#ijSAUKJ;j}E;u>;_jFnc!BkF-3FX_>=S>jMKd^$XMG0PQH%@O;PB4J$U& z)M4ywsn=aXw#r(p4%3DLof)E#lp@~2I!` z+>{)dQt=8y#}pJw9~w%&u(!6`pDfz5;z$r35u{@flU9#o&%Iioxq7)I&f z%qn>wSKeXfL#1+LDdRvI-ne@T!TMTVhaCq?m8;rXrqT#$jCF0e75C>PXz9%h!*7~M z@pMbhw6d^ADkdyhv00wC5^^?DiVHo5a|Imaar*;Jnl5bp>oZ7SK47LNM3MW@e>wC! zvr&~q;2Q?DupQLxHy|Hxufcdr^2W7FFI>|Vq+3JHb|(Zg2;u?FPY)j~_X3b;CdwE= z;)svi<}_RiH4-Rhho3|z(_les4?v%nV5$g>*(=Ei-LJ*@ZuKh%ZOuaTa6l2K!0oYk zj~rUtuQky&LA8Y(wQF_Jz+-bM+S zgLYvgaF_`X%D92xaM#~Ax@T>PlhmKYxpi4v=-aG&Xg%>PhhKciAWigtigh+Hs^;>9 zoot|r1~7}-e!gc;2RDj7oCJs+Tu^!iqtpes;B(N1K<&=3iIh+$QdK5Ubivj|Dv^|V zs*J%*)p_BG7|LXjge9Qm)6hViZ9N2^sjGmn-U%wuKz{=Up=2a>Yq=c{2A(|iwXDlA zT0loZM9-@~1wJ0;NymwNRj-&v39}=C@#@kM^*iL}4?kVk@GbmWyelBk`?|p50IpsP zHSMgc(jppBK(o=YNf0~fhTO5qWFb4xVWZOub4q%s{OQ49wV^jgkAYDD_rBJ4(riF# zw;e8jlY9$AMNZ1?NKMm~o_==g`-YUnk@K~(`OX9uNK9MfS3w&yQm-UP`%#u+M1%G_ z0^%b{-^34TVi|lbulRpTL=2T4z_$dHmfeS+xU6%~b_rzs!kD@D{8I_8 zyBQ635h9E^O;Zdp1|7pTrkQtT0lR_7c8?3gpJtY+Wk3U~C)iZ$9>_p4#lsK6LC2Ma zNzNpx(OpV#zCkcepbvQ*evdsXY$iKWJ06Lk4qlA3KV)K}KAWPax`_Ff`n}(ir|9d# zO;aUMhK&1Ow~i$&Rxt^J`l>`CPyebUT#+jp)yNRcZTTP}i_pq~ZG`meCUi~7Zhclx z05!<3EP0ebzn_&@@>c>!vb5G4a*}K`;Xlt}54{|4&4@6-I*zx~+&RHjPQ1r%o!}uL z4pf56v#vmOI&v*IPSmCJdNsD~nhm&EEaJm}@T@R>YGI%q?j|4`b{AR`+Qm-^j02DH z4VENrdNTV;krmXEYKRD!CfQf)vv+c~3dsa(`U>H_lv@$Y;l%3ZLoPCE3*S!h5jJr4 zhe$VmW4i`5csuN6%STG7bjAOqYF1H|aw!FIO0$nJ%gfkdL>|2$uY>I|9%9B4f}5HG znr=Y(2YSvjR-9sh2`pMdepC?5o2U!NkYDOPf_K}0n-oKhYN7AtlK@qOdca`7U%DM= zVfRhz6NA(ItrpEKjfsrtnZEut2VH%(47axM>-iqXz?5-S5v(Dax;Z$u^?DQz7JF;y zX$EGQsSh-&EHsTs=}GJAZhU)7yUXe!aJ2r3kNiufe`Dz_b+x*4u--!IUOcRzHy+w} ztzB}_vbC!Cvn5Pz$LCZL!eBZ_CpQkpg*f;uK(#ZCT^VscP03YrL<)DnBg9t12)8P` zLZDE&Q&#M~XRSl_S3uK&cW%n#a>U7TMLod^GFYcsfX=rRhm-PLD2C7f44LPYy>o znrmg5@2$&ZARb4ePrmXtM72HQJyG~tRjl8=aBkRF62rbkHz+;7#!o^*E zX4P%0Ru{k3atC)7SML#JHNyV1l2*RWzy!MnvF1~!A(_nvcVV9yy}++G*ahSz8vVya zV|EpYk}f|Kh9_Zn2#o=kPVjo?`{tmiG6o2=kyx-QGD(msql>o>#-ock^f1Lg-KEhB|MEGU)QB7(1{<*N=7b?t1L9NECZq`*%ug3hX z+G@`nqTc?ZqtYaAGEn;cNB9#+Cx)Uczr}L5*}Ra`Ml%-~?Wh~&nv9uN!>(w$7kCrg zLxNQLS{$oD637^@8hTjts+3E4<3>%Zs^?I}$gB8ez0@Ud^xXzX{wMSr&q($oPuyCu zZMPD))z7uYq0h0{RI(xh=m%Ju9C8T&hb`%^Y3iZ_XSkAEF5m`DHVA*vS(>(BUqs*X z?zF2a!sl^7GwL<-#*sZV>4zY+RFHgwI(`06dWS%`0&1Y|lox<+uiq95EqoA<4Nrp& zt89+4DRT?i631DiJz5x_@33$h9*v^lrQ`~15B>B^4*7$ISfH{4UDMlO?NKD$RSHN? zk8^eRJNt>C5{ONgk1wY1X9J{{OdgM{h$EbyZVxEU%@y?Ov|r%O6Z{D7JE!yix}OLB znyerg6$SkgtIVxjgH$P2Y}C2-5;1wn>YhU0+ud)W&LsXb0~RvBj;|w&#hy%eiJb?g z9yX3bK^iy*`BqVbsEuNZe08RB4he0vRfbKfN)|Cw^U{Ut z%*e?3ZA}$pX}xe33$HvQeX(3NEmzVu7NDnt9U{=@Jh(C@#yHH}Gb`*fU&0wS3MR<^ z2Bh|KhayKZA$54ge8}E{E$BnJJT@-GeALA@SskzvRPOsa+B#IZryST;*x)KPdOgKB zDAm8#wqw4-qYSJ?ABcH5xIbO2JoCt=masG_qDr-_Xo*{r46avi0$viuTa019r~fJ^ z2y1GxXSK|)p|f#TMSpeLQju?Pw6s+>1txZX$ZZBq8!*_8>fD6xkORe1Z#yc#82fqO z3VuWd(o)Bc942bEl!mKOp)kqs{>(g`PubDsR?@K+px_w^C7T0;aBVd2kJ0+z=kG4< zEZU=Crd=Hnl8)Q8wOZP9X*!?lOcbi#4)2|vczGP_XuA;*8qoVVW~ZjLQg7B?0o|;% zTGzgN8SR^}(XjtEE+ino^`rD)~;Ttpud4BL6I=zkg?dF8#f8AvSIhm2sz+S z;Dwf`TqsKzrkd2LMuS0D%9B=>8RMsRRC_!2M}k z>)V*u9wJhL{EgU#`rVGC;6#&&AYL^;)vo@ME!OOP?!p@aZ^SB))4#sr!s$QX`S zqaCUYP8=6UqhYaxOAy2cY{m1M8-Mt)U{j5v{HUa{DChOxMXTMM7mYl8lKwGmN=Mt8 zDowk|fRRDmVdHu?QaWr83#o-#w(DwfxitvBRhlPWf#P9bDDAq!YZay)Eym!xKE2FO z1WG^iD^=DUdlsg%SXH7sNEZm2R=^T9%S>S;C7GbjtU<;}zPulVVIHVzl>wCp(<{+e zgIfX@dz-m>gG;`7d$TyRjepH0|AvagL%9dvarDiLkAW}N!k-Od_6mTV4UNY~cFJz_o0 z7ZVl&?{B1`rIn6|nPWt|Au*>~+p#g+etp^WB)g|tlVzDc!`^hC&apD6Lf|lyeDbkz zsHVV4B0^A`p6DUS<|r+uWk_!w9&YYc+zyaww;JX9p1>Ro*M9zcUtm}W?BUdU97ONA zE!71nZxEf!G**!7MNoJsRyW*DHLHDWVqr& zKHe8j2*}m5ch2=zuZXv%dl?@IsB%uw@vK-6G$9a**bX!^ATDU*niqE$S#=Ah`Hms> z@REKAukr5aMDUb_xGVwF`ds^xAavg$vH)nS?()$`$Osjc9Od|F2XPG;zweF z{3tIJ*_6DIiB>N8J#I{t`t{-ieohHyazPn;ui#5|Sp7?owD$J0?`h1Z{5Rc*d?Da{ zk&DKR8oQ%iz*bTwp&_#}etw>3;U{bAnx7Sl6r;*rn!YlqB4_3qR%)DriM0yQp@jVJ_y({_lekG`Vu7aGmT zJe_NTd-mY^o#$Zhgq{#Wd$rz}Yny(l97kryV3sn9%PKTt;4R1ky1}%pY_4ti3RS;i zJlu$OeP_S zpoY%kXDv{8Qa96($&tHmoN%uKXy7u6n zs6cdb4mK}!{S1Y3u;OvDMc3G0FGue#hbODTfzk24!U#M$vsEB|xbBPHhtdQ4L6p4e z7?-3&Mh}j&?c7^E$M~J<=^Wqo&PIzGo*=P9)jM#J#K7&FCWNOLs78I1TTB~CyI zfi+yY8F$5cj$(Vhq$@Cp9Bn+6M4(1{RJvvnows54Q;Ku4wV2d&wU}(>Y%V2j~< z9|SN8i5O3Bajre4tyM9AL z8s$n}N1Ocij5znZ^^Wu(YpWStcPDF94;{!_}uX6F5}!HCwE4h8vXkGO8d8VZro`IP(q*8ONyF^{41>lAABtFz^X7B zL=Tw}3a%jd_6LqB%9{-%wK{3WD|=H7#T%9GkVbArAj_ewu|50FND3n-V^NnLqa{JU``ka>hF(Y&c_f zRVZDQ5^9}fWSY%TVwSSS(IwoEb#D=FgKo*d>`=*(nZNrX8P&GZm?INiU2j=&aPW9N zW)?P+@&fp)cpu+GSL9^Lwo)>TTW23BH*NTb+haeyo(8#XnX6^&OxzC~5Z2__c-aGh zK&dMmb`H%aBHzw%MjWH#R?`gRrS4?QF#$V_6w?jRrsHm{jx2Vq0}td0QFzyMsD&>}+EGrLF76yU0Ry4u&=% zUS3{n(Q@_0t^v4mHlU6-cIr1qcB55zpkOa+_X+*!erwGH>SQKV(uc-38(D764Lok< zGh%-z@u@Oby_W|PGVRDFS0Cc3xjfh0j%Uw9QI6iJrp30O5z~aKx-%b4p3xHtjD|LR zleaa;Q}Fgtaa`plZ=Ux?dEa;;B6+Tf8YeM-%U`CCOAxwFyd13(U)AQjSUqB90I%gN z8>Tw0n{K0(@1X*Njov0X(j8zQPqpd_GJ=)D zO=Yrr{I$;M7;^}Dq(c`U^uv(p98I43O7Wa^43XT5j^#c0nXPGhNP{w)Ql|8hHv#8{ifHi?S|7iT?P1`f4@Lh10lYoEC+tM zL*5J32VDj&K=pFN1RJH7y0#72eIIVN#htnmOc3WDvp(c(-&pf@+)Uc+^?_(Cq+@_% z1OTx&6K9s}{C^637}K_GZ8q~=2cnu=i_fWMfMUj=S}bjGLU((WkMdZ zVKRDGZ?}j^*WxaU@}pQq0bP*JpvJZNB&Pea&q0qJpqe5ww8UM{19gPqia!TU&DREd zR?mj8*8x0O6-1y(fH-vJ))S;}oE)uH z=51B=xa}^%2&ogWsVf}wtxiiCZ&d=50SKC@glz4l)B2}Zy$h#DPD?Fsdv%2h2B+6O z1>ZUI;{p{U9VCkdl>#vv2g$DVtD^gbx}Er7Vy`F8SU*YVAP)f5@HpTtI|XpK3Nk36i4hcq z0GCV14U(JMpbiyyW!zg`Sb^szMTn0gb5`hNM@Z`%oi1A76`^)I&5nT#mCccVI(+2n zk!bwd6|R{!1)LnX+36Kuwk!PVRc6Ibgk{FUo~z4vYyFsr=W)}gGfvpZn+3&03`Y65 z?x}wyFc2lwrhckBN>oQV`Q_8JnpB+K5Jq5<&1xx(=<>(UsqfKmM?)+&YJ_n2nYbTw zF2+#Ozps*ScjCp)>QcCIEG(&hOY^N%K=d=gU4 zI~vm_3=-5R4_ykc+^eT4Q#?s8U^Bn9;4J}rM@w3u9T#WJ-#Eh<3(4S2f&wQl8wzw= zFs?}9ECI9I1gJ7`k%?e|CW#SUY-?yj9ZV>`dG%WdZfp4XIn&ejp1~NO2FbKeyj-;VXrHd{Emc6jgICacKR*3R7d)QHE^3a28B^ix=XD+e9T@$;!876 z)1=Mnn!;y_iF-wP2N` zUlc47Xjin_&dz=A&Ei2--gHS#uouC{B+(62>^d+GVL?_fchdYN2g5VikjE1LNfftt z`NO$>HnbU&{2A5a#MZpnOlNgXAkUHk9EcqlbK#y~Ebz>I}OU15`%GE+3Q`x$_sIAwgKxx_RZMsc_**Z1dDcgpZ3~W({W3Mt58Kg4{)8D zw|Y5=$MGXND>mF~f9Z$jEy6GSlOt^D6quMnfz%DX z*_dV^a}lG}sycHqSLX}P{B#T1CYIQqu{G?;;6!nmF06c&>?xu~gT_c*pI{C)mMGj; z*CySd1;Hmtd;sQT+MBCgPz*~80B{0{7S6G^Gcs+n=uLd%3+)CLS{o5M>BCl&3pAmM zavTt*o?9+v-4E>1U8?C+fNxXcjYx|9j(E@3aAGw$f_wK~P;$v7af4ZnauZCVl9goJ zqv8R5xFNU5h0X++TlRoSMLgTkX=*MdI9-|)_si3NBNv*Ub0k0qke`&NuzNUS(Rf`q8#0# zT+T9(bOA;aCM)!vMSRBY5~w~|Y70u|g~pr)g5=|dnMf=`2(HO>t?vjBtb3K9iAxa$ z2!OIz-O6X>*|ToutGr;9sqM_e=)Zve^c+rUOcu;Yn zd53rAqkd-K{&?`>Or*p0kma+BrpaT;>IrKrqWFlO0m||WV zLLLkc&QW72R_cwZaGAVCm*-g$4T^zxc>opqW9w+JY8AVa)~W3s^4-vX%C0p=#l5g(C%ML)N(iwURz)jCm;{t~x0a2e z=0-6krUi$8WO{r?bn)R}n(4jwj&^+2idCZ}Pd|e=a`n+KV_9&@z zn%CNzT#}w=H9~>bIDcA!E9v2|s6CkC{c3`FlJ*GK8#sklPEJ!;le0lRqJFp8YO<2_ zTPN&8!!v0NRixwC<(1B=Gkw_){8K2Sq^@T1C;l(gFS|~QNWVG{iK&g#zaWoz zq8AbF7sj6su zw3*!0c5Uob(&`lcNV&0h_6}s_tN-w%?72(geW4QL&8fr$9>Qj@;LOo^C57%{Z+pPP zM4lK^?v_2vx_;7&QBNM)K|vzQxrR#kKV1) z$bdvmPB0aqDqFV2q`BAm)WLZV7dE|-Lv9e)w1=G3BTxWmVhnnbmQNa&CO?;P)%q1nsg z63*iKYv`=*E^!fzIsVTZ2&;B_i50J9mYAX8YpyN-{wjz>hT1;c!|L;Rxr?hKx6OyW zr;j`PQ%RnSN(lVDuU}V9Rn5IiiXm_e&Cs9~jY6dh+ScB}g7}3V`Q_r{h>Gz(gz-M0 zs*)uwCnJUz`)p7Z>Z(t>KwfyWRkrhzTPPr9SRHvM?RF{E5HLF+=M6gXceHDgOK+wyH6$_LUwOxv; zEj|o6txxfQ++g%Sr}p2aQz`hM_;wE`-a9q7iI-n&ihhs0YeXLU@)qvT_dcmUB^FW} z58^+?6q}1)5MF}bYC;keSmm=q6;Zz*-0%|#ZtxopjuOd1h@SU19Ghvhnm6R7DBGo2 z%8JF4)KGgPemx@e*VGO9Pf1|=DeyUs%hX^G+3W4AkREg2eL{L|X*Dz+3b$!vsG|$( zMA|n{u2{0H`HG?-xESy5>`{;-ME3J3QOvLOjOkx zE$37FV-dqs*W4*6hrcOMyG)}oC;Pv1i0N?bc$7ycjvz2c-7CQ@zmnZ3EbCho8!|zk zS-%7fs!-*uNMk9Z+6DLJ%7Uv;l#Z|;E0d3PqmiDY4{~GON@7G!qjmVPRW#|8E?3ej zCtK7q{9f)4!420&(iYtxr^&;!MGXuu6UEX$Ox-I%?r5Xy zqlB4&@>X8hvmYMgR1lKwO~6wWG-E;FSE^(wanxB4lXq97tr>lErOd)aKAg_s2+ODh z*T9CF4obgcf2~m5b7Phd4S$>PIdNqMsqaMcM(aN>gI#rkrU_<}IPYpsX9+ZD2Ce8j zC-ce=5}~Gprv)-2ilCCkCxjUf$*OY4w+nllDOJvq8`<{_^dvDYZPzg0VOkg*VYiL; zjv#Z5kn&ycR1BufkQy{k&OC%1R0YuT6nUID7<{PadUFyHvVDwz)c zslbLzg8h+;buCe($brd;%6QkyGz@-;KZ9Pn58d>W0m{s%!gt_%_G}i(=*>Z z^$5V4U;x-#+IpEg-S7O+4NH7-n)d5v1L(ZRf%Ey>vVmcOKd;zs43jZ+t~mAAwMell z|EL&XxXmoW(WY6p!L5a;d7os#s?u@P9oLyyXEQ9~<%+BRI9J|eHn50in9MOMRHm|a zjPrnJ*P2V&SgXSKvGG`A`1WGvK#P*}_XPVdZA##%!D9cgfoZjso2y@m6Gx}UFP4>X z!V*>7dK41fW5IB*d=7u_G_tBgK07*L0FkU7|HP#Olioa`Dx7c-NYwXWm%Cj^h+?9g zIH7>2vh~2Pvew3P95|T?yN#7h1m&WN&?%H_?fALX6o@vEz?*ygFH&v}6|Cj4afg+@9{MmL4Q@^g~BlMOj7GU;j)b$KZSF z`}hr|yux{~g%ToDd5!Og8HGGGaTqFvF%V|6-6WeDvzWXkFqL#lt8^U z-jq4(8zb9c3omZrU^drpUp|iNc&B|nkVJ>Nle}0bAnw?@F0RQVYcaH&AOvP1U!kSZ zKJ@v@x{b@;>QIO^^|e%Rh-=`TlK#4zAJO74*16#3n*Zu}m!D0jDp@ieD31A-F0k+g zHe!Mu@w;$@Y(jF^007g{Dg8j1=g&?)brf(pJde{J8LdP}itYK%#i0PgAAJju0i=0J zyF8sB`Lv(BS~kDWDc{l^X8}PK_KNBAhD((JUz9Cx=B0+NTW zbJYuBS7YHuX(gMWBj|*u-$Y=~i_4v$VWq?KQAMxzBYFd8%lkK&NPwXaUgi@5Yu~?F z7lsMwCV_xJ5Io}*ZQ zyBf-uwV+YYCW%~aWnOH|WcCR4)H;#LNn{-zXgLGEv1fsg1n}){lWWpXf$#rRsBwj+ z{{#8*t*mZ?Hc(dz0{`g-@L`7Q#$m*NkxVxw{Q2dpAG17!AXE3nx?1B{gISdI60Dm` zz}uCbOS^Y{w_IwfVz{X`e0jV|Wvlxo*5^l)38|8Yg2#t?B}WQ;oRqz6-N4 z-LpMV0(zb{zOueE20m9g`Vij$J@fsZlO8(nH9U@-P&UxVXF*q&h@Xi6D8f<9sk%5= z06=gO$R8aa1QZSM-?`bb$+`cPU0sof8+($AhG}ADtM6p&!0^9$WBIrsVX0 z_y41e|C6=w|I0vZMFFnRKb-$m&;O*a|3`s9{*&im?4(ccW^MKFzw>WD|E=!C!WGi} zof}UfE=WnNS|R0M&(?Lm^2~oc(}Dv4=>K68062`zC?xyK`Oj5?{U02y*zH0B$jY35 G!2bsZs1BY0 diff --git a/Software/dashboard/Makefile b/Software/dashboard/Makefile index 366a386..a54f669 100644 --- a/Software/dashboard/Makefile +++ b/Software/dashboard/Makefile @@ -21,7 +21,7 @@ comp: copy_target: sshpass -p $(TARGET_PASS) rsync -a --info=progress2 ./build/flutter_assets $(TARGET_USER)@$(TARGET_HOST):$(TARGET_PATH) run: - sshpass -p $(TARGET_PASS) ssh -t $(TARGET_USER)@$(TARGET_HOST) 'echo $(TARGET_PASS) | sudo -S flutter-pi -r 90 --release $(TARGET_PATH)/flutter_assets' + sshpass -p $(TARGET_PASS) ssh -t $(TARGET_USER)@$(TARGET_HOST) 'echo $(TARGET_PASS) | sudo -S flutter-pi -r 270 --release $(TARGET_PATH)/flutter_assets' run_debug: sshpass -p $(TARGET_PASS) ssh -t $(TARGET_USER)@$(TARGET_HOST) 'echo $(TARGET_PASS) | sudo -S flutter-pi -o landscape_left $(TARGET_PATH)/flutter_assets' install_dep: @@ -29,8 +29,8 @@ install_dep: libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-alsa' install_flutter_pi: sshpass -p $(TARGET_PASS) ssh -t $(TARGET_USER)@$(TARGET_HOST) 'cd ~/Documents && git clone --recursive https://github.com/ardera/flutter-pi || cd flutter-pi && mkdir build || cd build && cmake .. && make -j`nproc` && echo $(TARGET_PASS) | sudo -S make install' -# -C D0=CS1,D6=CS2,D1=MISO,D2=MOSI,D3=CLK,D4=DRDY1,D5=DRDY2 probe: - sshpass -p $(PROBE_PASS) ssh -t $(PROBE_USER)@$(PROBE_HOST) 'echo $(PROBE_PASS) | sudo -S sigrok-cli -d fx2lafw:conn=2.4 -o $(PROBE_PATH)/test.sr -w -t D0=f -M spi --config samplerate=100k --samples 500k --time 1s' \ - && sshpass -p $(PROBE_PASS) rsync -a --info=progress2 $(PROBE_USER)@$(PROBE_HOST):$(PROBE_PATH)/test.sr ./build/ + sshpass -p $(PROBE_PASS) ssh -t $(PROBE_USER)@$(PROBE_HOST) 'echo $(PROBE_PASS) | sudo -S sigrok-cli -d fx2lafw -o $(PROBE_PATH)/test.sr -w -t D3=f -M spi --config samplerate=200k --samples 2m --time 5s' \ + && sshpass -p $(PROBE_PASS) rsync -a --info=progress2 $(PROBE_USER)@$(PROBE_HOST):$(PROBE_PATH)/test.sr ./build/ \ + && pulseview -i ./build/test.sr -s ./pulseview_session_setup.pvs diff --git a/Software/dashboard/lib/hal/X9C10X.dart b/Software/dashboard/lib/hal/X9C10X.dart index 69ddf88..59a8bc3 100644 --- a/Software/dashboard/lib/hal/X9C10X.dart +++ b/Software/dashboard/lib/hal/X9C10X.dart @@ -50,5 +50,10 @@ class X9c10x { inc.write(true); onRelease.call(); } + void dispose(){ + inc.dispose(); + ud.dispose(); + ss?.dispose(); + } } diff --git a/Software/dashboard/lib/hal/ads1256.dart b/Software/dashboard/lib/hal/ads1256.dart index d92a0cf..f452855 100644 --- a/Software/dashboard/lib/hal/ads1256.dart +++ b/Software/dashboard/lib/hal/ads1256.dart @@ -14,6 +14,10 @@ extension Ads1265Int on int { } double toMilliVolt() => toMicroVolt() / 1000.0; double toVolt() => toMicroVolt() / 1000000.0; + toListBoolbit() => [(this & 0x01)==0x01?true:false, (this &0x02)==0x02?true:false, (this &0x04)==0x04?true:false, (this &0x08)==0x08?true:false]; +} +extension Ads1265ListBool on List { + toNibble() => (this[0]?0x01:0x00) | (this[1]?0x02:0x00) | (this[2]?0x04:0x00) | (this[3]?0x08:0x00); } class Ads1256 { late SPI spi; //SPI @@ -21,12 +25,14 @@ class Ads1256 { late GPIO? rst; late GPIO? cs; //GPIO late Logger log; + bool isCSActiveHigh; Ads1256({ required int spiBus, required int spiChip, required int gpioChip, required int pinDrdy, + required this.isCSActiveHigh, String? tag, int? pinReset, int? pinCS }){ @@ -37,10 +43,10 @@ class Ads1256 { log = Logger("[Ads1256][$tag]"); } - void skipClk()=>sleep(const Duration(microseconds: 1 )); + void skipClk() => sleep(const Duration(microseconds: 1 )); void writeRegister(int reg, int wdata) { - log.info(' writeRegistere() <${reg.toRadixString(16)}> <${wdata.toRadixString(8)}>'); + log.info(' writeRegistere() <${reg.toRadixString(16)}> <${wdata.toRadixString(16)}>'); waitDRDY(); spi.transfer([CMD_WREG | reg, 0, wdata], false); skipClk(); @@ -62,27 +68,30 @@ class Ads1256 { csOn(); waitDRDY(); spi.transfer([cmd], false); + skipClk(); csOff(); } int get offsetCalibration { csOn(); + skipClk(); int x = readRegister(RADD_OFC0) | readRegister(RADD_OFC1) <<8 | readRegister(RADD_OFC2) <<16; csOff(); - return x; + return x; } int get fullscaleCalibration { csOn(); + skipClk(); int x = readRegister(RADD_FSC0) | readRegister(RADD_FSC1) <<8 | readRegister(RADD_FSC2) <<16; csOff(); return x; } - void calibrateOffsetGain()=>sendCommand(CMD_SELFCAL); - void calibrateOffset()=>sendCommand(CMD_SELFOCAL); - void calibrateGain()=>sendCommand(CMD_SELFGCAL); - void calibrateSystemOffset()=>sendCommand(CMD_SYSOCAL); - void calibrateSystemGain()=>sendCommand(CMD_SYSGCAL); - void stopContinueRead()=>sendCommand(CMD_SDATAC); - void resetCommand()=>sendCommand(CMD_RESET); + void calibrateOffsetGain() => sendCommand(CMD_SELFCAL); + void calibrateOffset() => sendCommand(CMD_SELFOCAL); + void calibrateGain() => sendCommand(CMD_SELFGCAL); + void calibrateSystemOffset() => sendCommand(CMD_SYSOCAL); + void calibrateSystemGain() => sendCommand(CMD_SYSGCAL); + void stopContinueRead() => sendCommand(CMD_SDATAC); + void resetCommand() => sendCommand(CMD_RESET); void doReset(){ waitDRDY(); @@ -98,34 +107,47 @@ class Ads1256 { } void csOn(){ - cs?.write(false); - log.info("============== Start transfer"); + cs?.write(isCSActiveHigh?true:false); + skipClk(); + skipClk(); + skipClk(); + log.info(" > Start transfer"); } void csOff(){ - log.info("============== End transfer"); - cs?.write(true); + log.info(" > End transfer"); + cs?.write(isCSActiveHigh?false:true); + skipClk(); + skipClk(); + skipClk(); } void begin(int drate, int gain, bool buffen) { log.info("begin() : <${drate.toRadixString(16)}> <${gain.toRadixString(8)}> <$buffen>"); doReset(); - csOn(); resetCommand(); + skipClk(); + skipClk(); + csOn(); syncIt(); - buffer = buffen; - autoCalibration = true; - clockOutRate = CLKOUT_1; - programmableGain = gain; - dataRate = drate; - log.info(" status : ${status.toRadixString(16)}"); - log.info(" adcon : ${controlRegister.toRadixString(16)}"); - log.info(" drate : ${dataRate.toRadixString(16)}"); + skipClk(); + skipClk(); + bufferNCS = buffen; + autoCalibrationNCS = true; + clockOutRateNCS = CLKOUT_1; + programmableGainNCS = gain; + dataRateNCS = drate; + var st = statusNCS.toRadixString(16); + var ac = controlRegisterNCS.toRadixString(16); + var dt = dataRateNCS.toRadixString(16); csOff(); + log.info(" status : $st"); + log.info(" adcon : $ac"); + log.info(" drate : $dt"); + skipClk(); calibrateOffsetGain(); } void syncIt(){ - spi.transfer([CMD_SYNC], false); skipClk(); skipClk(); @@ -134,54 +156,54 @@ class Ads1256 { skipClk(); } - int get status => readRegister(RADD_STATUS); + int get statusNCS => readRegister(RADD_STATUS); - set buffer(bool isEnable){ - isEnable ? writeRegister(RADD_STATUS, (status | (0x01 << 1))): - writeRegister(RADD_STATUS, (status & ~(0x01 << 1))); + set bufferNCS(bool isEnable){ + isEnable ? writeRegister(RADD_STATUS, (statusNCS | (0x01 << 1))): + writeRegister(RADD_STATUS, (statusNCS & ~(0x01 << 1))); } - set autoCalibration(bool isEnable){ - isEnable ? writeRegister(RADD_STATUS, (status | (0x01 << 2))): - writeRegister(RADD_STATUS, (status & ~(0x01 << 2))); + set autoCalibrationNCS(bool isEnable){ + isEnable ? writeRegister(RADD_STATUS, (statusNCS | (0x01 << 2))): + writeRegister(RADD_STATUS, (statusNCS & ~(0x01 << 2))); } - int get controlRegister => readRegister(RADD_ADCON); - set clockOutRate(int clk)=>writeRegister(RADD_ADCON, controlRegister | (clk << 5 )); - set programmableGain(int gain)=>writeRegister(RADD_ADCON, controlRegister | gain); + int get controlRegisterNCS => readRegister(RADD_ADCON); + set clockOutRateNCS(int clk) => writeRegister(RADD_ADCON, controlRegisterNCS | (clk << 5 )); + set programmableGainNCS(int gain) => writeRegister(RADD_ADCON, controlRegisterNCS | gain); - int get dataRate =>readRegister(RADD_DRATE); - set dataRate(int rate) => writeRegister(RADD_DRATE, rate); + int get dataRateNCS => readRegister(RADD_DRATE); + set dataRateNCS(int rate) => writeRegister(RADD_DRATE, rate); set ioDir(List dir){ csOn(); - int d = dir[0] | dir[1]<<1 | dir[2]<<2 | dir[3]<<3; - writeRegister(RADD_IO, d <<4); + int d = (dir[0] | dir[1]<<1 | dir[2]<<2 | dir[3]<<3) <<4; + writeRegister(RADD_IO, d); csOff(); } List get dIO { csOn(); int dio = readRegister(RADD_IO); csOff(); - return [(dio & 0x01)==0x01?true:false, (dio &0x02)==0x02?true:false, (dio &0x04)==0x04?true:false, (dio &0x08)==0x08?true:false]; + return dio.toListBoolbit(); } set dIO(List io){ csOn(); - writeRegister(RADD_IO, (io[0]?0x01:0x00) | (io[1]?0x02:0x00) | (io[2]?0x04:0x00) | (io[3]?0x08:0x00) ); + writeRegister(RADD_IO, io.toNibble() ); csOff(); } - set channel(int c) => writeRegister(RADD_MUX, c<<4); + set channelNCS(int c) => writeRegister(RADD_MUX, c); - int analogRead(int channel){ - log.info(" analogRead() <${channel.toRadixString(16)}>"); + int analogRead(int pChannel, int nChannel){ + var nc = pChannel | nChannel; + log.info(" analogRead() <${pChannel.toRadixString(16)}> <${nChannel.toRadixString(16)}> = <${nc.toRadixString(16)}>"); csOn(); - waitDRDY(); - this.channel = channel; + channelNCS = nc; waitDRDY(); spi.transfer([CMD_RDATA], false); skipClk(); - List d = spi.transfer([0, 0, 0], true); + var d = spi.transfer([0, 0, 0], true); csOff(); int v = d[0] << 16 | d[1] << 8 | d[2]; log.info(" > $v"); diff --git a/Software/dashboard/lib/hardware/heartbeatmice.dart b/Software/dashboard/lib/hardware/heartbeatmice.dart index 45e6348..dc22272 100644 --- a/Software/dashboard/lib/hardware/heartbeatmice.dart +++ b/Software/dashboard/lib/hardware/heartbeatmice.dart @@ -1,11 +1,28 @@ import 'package:dashboard/hal/X9C10X.dart'; +import 'package:logging/logging.dart'; import '../hal/ads1256.dart'; class HeartBeatMice { - Ads1256 adc1 = Ads1256(tag: "adc1", spiBus: 1, spiChip: 0, gpioChip: 1, pinDrdy: 202, pinCS: 13, pinReset: 20); - Ads1256 adc2 = Ads1256(tag: "adc2", spiBus: 1, spiChip: 0, gpioChip: 1, pinDrdy: 6, pinCS: 21); + Ads1256 adc1 = Ads1256(tag: "adc1", + spiBus: 1, + spiChip: 0, + gpioChip: 1, + pinDrdy: 202, + pinCS: 13, + isCSActiveHigh: false, + pinReset: 20); + Ads1256 adc2 = Ads1256(tag: "adc2", + spiBus: 1, + spiChip: 0, + gpioChip: 1, + pinDrdy: 6, + pinCS: 21, + isCSActiveHigh: false, + /*pinReset: 20*/); X9c10x pot = X9c10x(ohm: 104000, gpioChip: 1, pinUd: 204, pinInc: 205); + Logger log = Logger("[HeartBeatMice]"); + void potSelect(){ @@ -14,17 +31,38 @@ class HeartBeatMice { } void init(){ - adc1.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, false); - adc2.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, false); + adc1.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, true); + adc2.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, true); adc1.ioDir = [Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT]; adc2.ioDir = [Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT]; - print('adc = ${adc1.analogRead(0).toVolt()}'); } - void test(){ - print('adc = ${adc1.analogRead(0).toVolt()}'); + + int readAnalog(int no){ + var adc = switch (no) { + 1 || 2 || 3 || 4 || 9 || 10 || 11 || 12 =>adc2, + 5 || 6 || 7 || 8 || 13 || 14 || 15 || 16 || _ =>adc1, + }; + var ain = switch (no) { + 1 || 15=>Ads1256.MUXP_AIN0, + 2 || 14=>Ads1256.MUXP_AIN1, + 13=>Ads1256.MUXP_AIN2, + 8=>Ads1256.MUXP_AIN3, + 12=>Ads1256.MUXP_AIN4, + 4 || 6 || 11=>Ads1256.MUXP_AIN5, + 3 || 5 || 10=>Ads1256.MUXP_AIN6, + 7 || 9 || 16=>Ads1256.MUXP_AIN7, + _=>Ads1256.MUXP_AINCOM + }; + log.info('readAnalog() <$no>'); + log.info('> adc : <${adc.log.name}> | ain : <${ain.toRadixString(16)}> '); + var r = adc.analogRead(ain, Ads1256.MUXN_AINCOM); + log.info('> $r'); + return r; } - void dispose(){ + + void dispose(){ adc1.dispose(); adc2.dispose(); + pot.dispose(); } } diff --git a/Software/dashboard/lib/main.dart b/Software/dashboard/lib/main.dart index 843b12b..c0e37d6 100644 --- a/Software/dashboard/lib/main.dart +++ b/Software/dashboard/lib/main.dart @@ -1,14 +1,17 @@ +import 'package:dashboard/hal/ads1256.dart'; import 'package:dashboard/hardware/heartbeatmice.dart'; +//import 'package:flutter/cupertino.dart'; + +import 'ui/plot.dart'; import 'package:flutter/material.dart'; import 'util/mouse_cursor.dart'; import 'package:logging/logging.dart'; -import 'ui/plot.dart'; void main() { Logger.root.level = Level.ALL; Logger.root.onRecord.listen((record){ - print('[${record.level.name}:${record.loggerName}][${record.time.hour}:${record.time.minute}:${record.time.second}] ${record.message}'); + print('[${record.time.hour}:${record.time.minute}:${record.time.second}][${record.level.name}][${record.loggerName}] ${record.message}'); }); runApp(const MyApp()); } @@ -19,16 +22,16 @@ class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { - //return SoftwareMouseCursor( - /*child :*/ return MaterialApp( + return SoftwareMouseCursor( + child : MaterialApp( title: 'Heart Beat Mice', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Heart Beat Mice Coba'), + ) ); - //); } } @@ -42,28 +45,21 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - int _counter = 0; - HeartBeatMice drive = HeartBeatMice(); + late HeartBeatMice device; + Logger log = Logger("_MyHomePageState"); @override - void initState(){ + void initState() { super.initState(); - drive.init(); + device = HeartBeatMice(); + device.init(); } - @override - void dispose(){ + void dispose() { super.dispose(); - drive.dispose(); + device.dispose(); } - void _incrementCounter() { - setState(() { - _counter++; - }); - drive.test(); - } - @override Widget build(BuildContext context) { return Scaffold( @@ -71,26 +67,38 @@ class _MyHomePageState extends State { backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), - body: Center( - child: Column ( - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - Container ( width: 350, child : const LineChartSample10()) - ], - ) - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), - ); + body: ListView.builder( + itemCount: 10, + itemBuilder: (BuildContext context, int index){ + log.info("build ListView index : $index"); + return Center( + child: Column ( + children: [ + const SizedBox(height: 10,), + SizedBox ( + height: 100, + width: MediaQuery.of(context).size.width-100, + child : LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { + double height = constraints.maxHeight; + double width = constraints.maxWidth; + var i = index; + return Plot( + title: "analog $i", + aspectRatio: (height/width), + maxTimeSeconds: 10, + sampleTimeMillis: 2, + readAnalog: () async { + return await device.readAnalog(i).toVolt(); + }, + ); + }) + ), + const SizedBox(height: 10,), + ], + ) + ); + }) + ); } } diff --git a/Software/dashboard/lib/ui/plot.dart b/Software/dashboard/lib/ui/plot.dart index 0f0c0a4..c6178d4 100644 --- a/Software/dashboard/lib/ui/plot.dart +++ b/Software/dashboard/lib/ui/plot.dart @@ -1,171 +1,127 @@ + import 'dart:async'; +import 'dart:core'; import 'dart:math' as math; - import 'package:fl_chart/fl_chart.dart'; -//import 'package:fl_chart_app/presentation/resources/app_resources.dart'; import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; -class AppColors { - static const Color primary = contentColorCyan; - static const Color menuBackground = Color(0xFF090912); - static const Color itemsBackground = Color(0xFF1B2339); - static const Color pageBackground = Color(0xFF282E45); - static const Color mainTextColor1 = Colors.white; - static const Color mainTextColor2 = Colors.white70; - static const Color mainTextColor3 = Colors.white38; - static const Color mainGridLineColor = Colors.white10; - static const Color borderColor = Colors.white54; - static const Color gridLinesColor = Color(0x11FFFFFF); - static const Color contentColorBlack = Colors.black; - static const Color contentColorWhite = Colors.white; - static const Color contentColorBlue = Color(0xFF2196F3); - static const Color contentColorYellow = Color(0xFFFFC300); - static const Color contentColorOrange = Color(0xFFFF683B); - static const Color contentColorGreen = Color(0xFF3BFF49); - static const Color contentColorPurple = Color(0xFF6E1BFF); - static const Color contentColorPink = Color(0xFFFF3AF2); - static const Color contentColorRed = Color(0xFFE80054); - static const Color contentColorCyan = Color(0xFF50E4FF); +class Plot extends StatefulWidget { + const Plot({ + super.key, + required this.title, + required this.aspectRatio, + required this.maxTimeSeconds, + required this.readAnalog, + required this.sampleTimeMillis}); + final String title; + final double aspectRatio; + final int maxTimeSeconds; + final Future Function() readAnalog; + final int sampleTimeMillis; + @override + State createState() => _Plot(); } -class LineChartSample10 extends StatefulWidget { - const LineChartSample10({super.key}); +class _Plot extends State { + late Timer timer; + late int limit= ((widget.maxTimeSeconds)/(widget.sampleTimeMillis/1000)).toInt(); + late List adc = []; + int index = 0; + double el = 0.0; - final Color sinColor = AppColors.contentColorBlue; - final Color cosColor = AppColors.contentColorPink; + late Logger log; @override - State createState() => _LineChartSample10State(); + void dispose() { + super.dispose(); + timer.cancel(); + } + + @override + void initState() { + super.initState(); + log = Logger("Plot : ${widget.title}"); + log.info('limit : $limit'); + timer = Timer.periodic(Duration(milliseconds: widget.sampleTimeMillis), (timer) { + widget.readAnalog().then((val){ + if (index>=limit) { + log.info('================================================================ reset $index : $el : ${index != 0 ? adc[index-1] : 0}'); + index = 0; + el = 0.0; + adc.clear(); + } + setState(() { + el = (index * widget.sampleTimeMillis)/1000; + adc.add(FlSpot( el, val)); + log.info('================================================================ $index : $el : ${adc[index]}'); + index +=1; + }); + }); + }); + } + + @override + Widget build(BuildContext context) { + return AspectRatio( + aspectRatio: widget.aspectRatio, + child : LineChart( + LineChartData( + minY: -5, + maxY: 5, + minX: 0, + maxX: widget.maxTimeSeconds.toDouble(), + lineBarsData: [LineChartBarData( + spots: adc, + dotData: const FlDotData( + show: false, + ), + barWidth: 2, + isCurved: false, + )], + titlesData: const FlTitlesData(show: true, + rightTitles: AxisTitles(sideTitles: SideTitles(reservedSize: 40, showTitles: false)), + topTitles: AxisTitles(sideTitles: SideTitles(reservedSize: 40, showTitles: false)), + ), + gridData: const FlGridData(show: true, drawVerticalLine: false), + ) + ) + ); + } } -class _LineChartSample10State extends State { - final limitCount = 100; - final sinPoints = []; - final cosPoints = []; - +class DummyData { + late int limitCount; + late List sinPoints; double xValue = 0; double step = 0.05; - + int index = 0; late Timer timer; + late void Function() stateChange; - @override - void initState() { - super.initState(); - timer = Timer.periodic(const Duration(milliseconds: 40), (timer) { - while (sinPoints.length > limitCount) { - sinPoints.removeAt(0); - cosPoints.removeAt(0); - } - setState(() { - sinPoints.add(FlSpot(xValue, math.sin(xValue))); - cosPoints.add(FlSpot(xValue, math.cos(xValue))); - }); - xValue += step; - }); + DummyData(){ + limitCount = (20/step).toInt(); + sinPoints = List.generate(limitCount+1, (index) => FlSpot(index+step,0)); } - @override - Widget build(BuildContext context) { - return cosPoints.isNotEmpty - ? Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox(height: 12), - Text( - 'x: ${xValue.toStringAsFixed(1)}', - style: const TextStyle( - color: AppColors.mainTextColor2, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - Text( - 'sin: ${sinPoints.last.y.toStringAsFixed(1)}', - style: TextStyle( - color: widget.sinColor, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - Text( - 'cos: ${cosPoints.last.y.toStringAsFixed(1)}', - style: TextStyle( - color: widget.cosColor, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 12, - ), - AspectRatio( - aspectRatio: 1.5, - child: Padding( - padding: const EdgeInsets.only(bottom: 24.0), - child: LineChart( - LineChartData( - minY: -1, - maxY: 1, - minX: sinPoints.first.x, - maxX: sinPoints.last.x, - lineTouchData: const LineTouchData(enabled: false), - clipData: const FlClipData.all(), - gridData: const FlGridData( - show: true, - drawVerticalLine: false, - ), - borderData: FlBorderData(show: false), - lineBarsData: [ - sinLine(sinPoints), - cosLine(cosPoints), - ], - titlesData: const FlTitlesData( - show: false, - ), - ), - ), - ), - ) - ], - ) - : Container(); + void begin(Function() sc) { + stateChange = sc; + timer = Timer.periodic(const Duration(milliseconds: 2), (timer) { + stateChange.call(); + if (xValue >= 20) { + xValue = 0; + index = 0; + sinPoints.clear(); + } else { + xValue += step; + index += 1; + } + // print("$index : $xValue"); + }); } - LineChartBarData sinLine(List points) { - return LineChartBarData( - spots: points, - dotData: const FlDotData( - show: false, - ), - gradient: LinearGradient( - colors: [widget.sinColor.withOpacity(0), widget.sinColor], - stops: const [0.1, 1.0], - ), - barWidth: 4, - isCurved: false, - ); - } - - LineChartBarData cosLine(List points) { - return LineChartBarData( - spots: points, - dotData: const FlDotData( - show: false, - ), - gradient: LinearGradient( - colors: [widget.cosColor.withOpacity(0), widget.cosColor], - stops: const [0.1, 1.0], - ), - barWidth: 4, - isCurved: false, - ); - } - - @override - void dispose() { - timer.cancel(); - super.dispose(); + void update(){ + sinPoints.insert(index, FlSpot(xValue, 1 - (math.Random(xValue.toInt()).nextDouble()*2))); } } - diff --git a/Software/dashboard/pulseview_session_setup.pvs b/Software/dashboard/pulseview_session_setup.pvs new file mode 100644 index 0000000..c1ba3e8 --- /dev/null +++ b/Software/dashboard/pulseview_session_setup.pvs @@ -0,0 +1,189 @@ +[General] +decode_signals=3 +meta_objs=0 +views=1 + +[D0] +color=4279638298 +conv_options=0 +conversion_type=0 +enabled=true +name=CS1 + +[D1] +color=4287582722 +conv_options=0 +conversion_type=0 +enabled=true +name=MISO + +[D2] +color=4291559424 +conv_options=0 +conversion_type=0 +enabled=true +name=MOSI + +[D3] +color=4294277376 +conv_options=0 +conversion_type=0 +enabled=true +name=CLK + +[D4] +color=4293776384 +conv_options=0 +conversion_type=0 +enabled=true +name=DRDY1 + +[D5] +color=4285780502 +conv_options=0 +conversion_type=0 +enabled=true +name=DRDY2 + +[D6] +color=4281623972 +conv_options=0 +conversion_type=0 +enabled=true +name=CS2 + +[D7] +color=4287045754 +conv_options=0 +conversion_type=0 +enabled=false +name=PROBE + +[decode_signal0] +channel0\assigned_signal_name=CLK +channel0\initial_pin_state=2 +channel0\name=CLK +channel1\assigned_signal_name=MISO +channel1\initial_pin_state=2 +channel1\name=MISO +channel2\assigned_signal_name=MOSI +channel2\initial_pin_state=2 +channel2\name=MOSI +channel3\assigned_signal_name=CS2 +channel3\initial_pin_state=2 +channel3\name=CS# +channels=4 +color=4286722730 +conv_options=0 +conversion_type=0 +decoder0\ann_class0\visible=true +decoder0\ann_class1\visible=true +decoder0\ann_class2\visible=true +decoder0\ann_class3\visible=true +decoder0\ann_class4\visible=true +decoder0\ann_class5\visible=true +decoder0\ann_class6\visible=true +decoder0\id=spi +decoder0\options=0 +decoder0\row0\visible=false +decoder0\row1\visible=false +decoder0\row2\visible=true +decoder0\row3\visible=false +decoder0\row4\visible=false +decoder0\row5\visible=true +decoder0\row6\visible=true +decoder0\visible=true +decoders=1 +enabled=true +name=ADC2 + +[decode_signal1] +channel0\assigned_signal_name=CLK +channel0\initial_pin_state=2 +channel0\name=CLK +channel1\assigned_signal_name=MISO +channel1\initial_pin_state=2 +channel1\name=MISO +channel2\assigned_signal_name=MOSI +channel2\initial_pin_state=2 +channel2\name=MOSI +channel3\assigned_signal_name=CS1 +channel3\initial_pin_state=2 +channel3\name=CS# +channels=4 +color=4294277376 +conv_options=0 +conversion_type=0 +decoder0\ann_class0\visible=true +decoder0\ann_class1\visible=true +decoder0\ann_class2\visible=true +decoder0\ann_class3\visible=true +decoder0\ann_class4\visible=true +decoder0\ann_class5\visible=true +decoder0\ann_class6\visible=true +decoder0\id=spi +decoder0\options=0 +decoder0\row0\visible=false +decoder0\row1\visible=false +decoder0\row2\visible=true +decoder0\row3\visible=false +decoder0\row4\visible=false +decoder0\row5\visible=true +decoder0\row6\visible=true +decoder0\visible=true +decoders=1 +enabled=true +name=ADC1 + +[decode_signal2] +channel0\assigned_signal_name=CLK +channel0\initial_pin_state=2 +channel0\name=CLK +channel1\assigned_signal_name=MISO +channel1\initial_pin_state=2 +channel1\name=MISO +channel2\assigned_signal_name=MOSI +channel2\initial_pin_state=2 +channel2\name=MOSI +channel3\initial_pin_state=2 +channel3\name=CS# +channels=4 +color=4288937984 +conv_options=0 +conversion_type=0 +decoder0\ann_class0\visible=true +decoder0\ann_class1\visible=true +decoder0\ann_class2\visible=true +decoder0\ann_class3\visible=true +decoder0\ann_class4\visible=true +decoder0\ann_class5\visible=true +decoder0\ann_class6\visible=true +decoder0\id=spi +decoder0\options=0 +decoder0\row0\visible=false +decoder0\row1\visible=true +decoder0\row2\visible=true +decoder0\row3\visible=false +decoder0\row4\visible=true +decoder0\row5\visible=true +decoder0\row6\visible=true +decoder0\visible=true +decoders=1 +enabled=true +name=DBG + +[view0] +D0\trace_height=34 +D1\trace_height=34 +D2\trace_height=34 +D3\trace_height=34 +D4\trace_height=34 +D5\trace_height=34 +D6\trace_height=34 +D7\trace_height=34 +offset=22 serialization::archive 19 0 0 0 0 288246 67324217 57335168 31063910 15766034 0 -8 1 0 6 +scale=2.0767525574050047e-05 +segment_display_mode=1 +splitter_state="@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0^\0\0\x5=\x1\0\0\0\x1\x1\0\0\0\x1\0)" +v_offset=-77 +zero_offset=22 serialization::archive 19 0 0 0 0 0 0 0 0 0 0 0 0 0 6