From dd5f0b20375a4f1fa69cd906deb07132e55c4363 Mon Sep 17 00:00:00 2001 From: Ingmar Jager Date: Tue, 5 Nov 2019 14:38:59 +0100 Subject: [PATCH] Add plots for position, speed and acceleration --- app/analysis.py | 165 ++++++++++++++++++++++++++ app/assets/icon.jpeg | Bin 0 -> 15065 bytes app/{serialmanager.py => comports.py} | 0 app/parse.py | 39 ------ app/settings.py | 1 + 5 files changed, 166 insertions(+), 39 deletions(-) create mode 100644 app/analysis.py create mode 100644 app/assets/icon.jpeg rename app/{serialmanager.py => comports.py} (100%) delete mode 100644 app/parse.py create mode 100644 app/settings.py diff --git a/app/analysis.py b/app/analysis.py new file mode 100644 index 0000000..6c335d4 --- /dev/null +++ b/app/analysis.py @@ -0,0 +1,165 @@ + +import numpy as np +import pandas as pd + +from PySide2 import QtCore + +from settings import DOWNWEIGHTS_g + +TICKS_PER_MM = 75/25.4 * 4 + +class KeyPress: + + def __init__(self, timestamps: list, positionData: list): + + record_threshold_min_mm = 1 + complete_threshold_mm = 15 + self.timestamps, i = np.unique(np.array(timestamps), return_index=True) + self.positionData = np.array(positionData)[i] / TICKS_PER_MM + + # Find index for T_0 where key starts to go down significantly + first_index = np.argmax(self.positionData > record_threshold_min_mm) + + # Index for T_1, key push (almost) complete + last_index = np.argmax(self.positionData > complete_threshold_mm) + + if last_index: + self.y = self.positionData[first_index:last_index] + self.t = self.timestamps[first_index:last_index] + else: + self.y = None + self.t = None + + def dt(self): + return self.t[-1] - self.t[0] + + def dy(self): + return self.y[-1] - self.y[0] + + def valid(self): + return self.y is not None + + def metrics(self): + + t, accel, accel_polyfit = self.accel_data() + average_acceleration = np.mean(accel_polyfit) + + rise_time = self.t[-1] - self.t[0] + + return rise_time, average_acceleration + + def speed_data(self): + time_s = self.t / 1000 + speed = np.gradient(self.y, time_s) + + MODEL_ORDER = 2 + coeffs = np.polyfit(self.t, speed, MODEL_ORDER) + + poly = np.poly1d(coeffs) + speed_polyfit = [poly(x) for x in self.t] + + return (self.t, speed, speed_polyfit) + + def accel_data(self): + + t, speed, speed_polyfit = self.speed_data() + + time_s = self.t / 1000 + + accel = np.gradient(speed, time_s) + accel_polyfit = np.gradient(speed_polyfit, time_s) + + return self.t, accel, accel_polyfit + + + def constantAccel(self): + + press_time_sec = (self.t[-1] - self.t[0]) / 1000 + + const_accel = 2*self.y[-1]/press_time_sec**2 + + return const_accel + + def averageAccel(self): + + time_s = self.t / 1000 + speed = np.gradient(self.y, time_s) + accel = np.gradient(speed, time_s) + + return np.average(accel) + + # def sliceRectangle(self, record_threshold_min_mm = 1, complete_threshold_mm = 10) + + +class Analysis(QtCore.QObject): + + textStream = QtCore.Signal(str) + + def __init__(self): + super(Analysis, self).__init__() + + + def estimateAcceleration(self, timestamps: list, positionData: list): + """ + + record_threshold_min_mm: int + minimum distance after which we start measuring + complete_threshold_mm: int + distance the key needs to travel in order to count it as a real push + """ + + keyPress = KeyPress(timestamps, positionData) + + # timestamps = np.array(timestamps) + # positionData = np.array(positionData) / TICKS_PER_MM + + # # Find index for T_0 where key starts to go down significantly + # first_index = np.argmax(positionData > record_threshold_min_mm) + + # # Index for T_1, key push (almost) complete + # last_index = np.argmax(positionData > complete_threshold_mm) + + # if not last_index: + # raise Exception("Threshold distance not reached!") + + # dataslice = positionData[first_index:last_index] + # timeslice = timestamps[first_index:last_index] + + # width = timeslice[-1] - timeslice[0] + # height = dataslice[-1] - dataslice[0] + + + # press_time_sec = (timestamps[last_index] - timestamps[first_index]) / 1000 + + # # Acceleration (assuming it is constant) in mm/s**2 + # const_accel = 2*dataslice[-1]/press_time_sec**2 + # print("Estimated accel: {:.0f} mm/s² ({:.1f} mm in {:.3} sec)".format(const_accel, dataslice[-1], press_time_sec)) + + # speed = np.gradient(dataslice, timeslice/1000) + # accel = np.gradient(speed, timeslice/1000) + + # accel_check = (speed[-1] - speed [0]) / press_time_sec + + # MODEL_ORDER = 2 + # coeffs = np.polyfit(timeslice, speed, MODEL_ORDER) + + # poly = np.poly1d(coeffs) + # speed_polyfit = [poly(x) for x in timeslice] + # accel_polyfit = np.gradient(speed_polyfit, timeslice/1000) + + + # average_accel = np.average(accel) + # average_accel_ployfit = np.average(accel_polyfit) + + + # index = pd.to_timedelta(timeslice, unit='ms') + # df = pd.DataFrame(index=index, data=accel) + # ds = df.resample('5ms').mean() + + # ds_avg = ds.mean()[0] + + # print('Average acceleration: ', average_accel) + # # Create a Rectangle patch + # # rect = patches.Rectangle((timeslice[0],dataslice[0]),width,height,linewidth=1, + # # edgecolor='r',facecolor='none', linestyle='--') + diff --git a/app/assets/icon.jpeg b/app/assets/icon.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..61872c85c32401708d2e4c02bc8f8aec225016f5 GIT binary patch literal 15065 zcmbWe2|QH$8$W)=5D{9?&C=BER!VZaNNJgoiz^A)LYi(VjHE6i#nI}fM0@FK2H6eS zOUtxtlYJCv5-|v2Y-8rk?>RF_eeeJOy1!qqCTBjK{MMFBpFQ>RQ*QdF8Ueb)5(>RR))W|1@(EmE6rWVl>? z@o#H&7yUYG)!Z5QO$f4ba&VQZf`aN2tyx-2{;&Ut9w5`?2sMOK?1%5R6y#>>rHm-A3{Q^nU`^tb4%%5hd&tI@md(mP8!{tURRvMfBZf0)r zhvj;E2S+F8%`UDxJa+E#^zx?p2L$d93O*2W^w{we5r3bIJa_)W#Y>m3T#Zdgypfcg zlA4yDo0nfuSaj=l@uSC2o<1vi{^Dh2Rdo%!_U*g6#!pSnpIchFZS6h1eZ2mG!J%P3 zZWjR|O3WI!><7E1fn8G4(nM)l+%AGt5N`N1X_>jpCQUc7ll^nwjGuoyET^*WY<$kc z$@BC#eO2B5SB1RVF9wbCdvMdlmi;%wj{HAaHg4EAyXufBL;`?EoQ9B*{+HSb;quza z=P6313uwQ6w4cHVVodJUex9DZufwu6+7&4}Yi?%WSHhef+|N+Bs^Z~D&evm-yr{0o z?Xy;~$xCOluP?O!5Wb|s_M|gAu0`1uId{5xfn$I2tm+_!!YsJJbnpFqy5xc%Z?!t4 zV&J&=zPr+d@uA+28biILK6s^n+S#9SQkIEWnbY)s4XN7js)I6P*XhV~PpYe5-As1) zQV+Yc4p{m9`~yv+Uj#iJ7IkpNmgk8-i*IH2h+i)Ay29~T`@yOw8F0Ow-SAO%>`s{Y zHG`|FTiztz`}MsZ6LA~8z-xpuW+2Q8xBT{~@seVD`#T@6A63ss3PWv1UJWZtQngzK~mJ_pfx^K+Z^IA_ny+rX!{ zx$X-N;~?+LmN4Hhm}ir+UucHd`u>iFBpSzH{l4g*UMb8R^1z2C{+fjYlOjaO+7wKL zycZ!o0fbY+8{~Ty190AM5%P!}kCvs05Y`}B;4VukXSG&~5Y7l4TN=J>;|srq&TIofnFG)+|PZTy`0=xH8(=H2PY9hC+Hgwzx!nXD+YkGRCKikjRu%KSlg8 zUxeIG5`l!XeI3d79Gh#(!D{?in?@V0&M1<5IjK-E`D-zd{ zdvO<(feR=OV4`K&?UpTKdo_gAGDD-jZEjTsPfglVL~bfcOWFxrK+JsJysB{n+cQOH9vG0J7q z437aFs>$^V^n3hj+4cEre8FG$TVaA}DeG@;b^TyczreDjkA~bTPN#oLn*{8(d)F3g z^|gGuzX(~ALVD4$YmI{GHhtPC>Xcb1ZZVFvQ`x|z;}fIfM?ysXfreZ!{u}G}LAQCK zePdo*Z=gFhppZO>HHnZ@4EbrCqi1MeoGDGQXQ;~WG_TB$RqHIfaRgFY*&oCsgMg?^!SSwL&qytg7`nY&?agW=1q z|7-|55pJM+ZE%?gdBEb$+tihQsdVIT5%Q7BpO#i+D}5)m!ER4tAYxS;Ud1zIh&D^;Tj*d2(cF-L=p0i=Bt-2kP{)sNLwRWJFQ(VME-iXdV`_|HAlWC zQ>eJ3ofMc#R9Yzfg7#OVT*tKHoE^KZfrQB!A|&1^s~x!q0MD?&1{t4VLw)Qtej6gxd6`xD<6=!-`4G+EN4UMhMuvWl~3PLPpSG?Eam zE3d6$OE80vb%5oxb7oV{$miaCK4;+PI5Xt0BB##e25IRl^Itu%u_b(-+)t`@O1e=W zp3<@RvcJaE z$yY~O`_&p*>NVxJD?63bZi$eJH#!=dRvR_BsVfVP?7m+_=C56kR3$`eBlw3=VZxAi zCI{5cPt~*XW0wCW@M`+u$?_-u8RaotPtkv&3)@+Dg}_HrRqI5Nm*2 z35R=TDGs*?$*n2XDcHp^;ztjWuvf0eHVrmONZ?dqg?%;tPdSkqpXqDbWw@JVy16c* zfrhj==IlL+#b#s2U9V+m>|c5Tt@6OO=l|O?>N9k&87Yz5GJq2Y19$Byty1PgetKOl z>zpEd%DlkU(Xbgg<+iBYmKf!DYb2Sep0RJx8u_dE>SNCjS3Lk+J{OHisyQ>6A9>^j zD?o(wmx~at4nP8om=I>~C*XWrz zfY9tL%@AFc3${{~>e>c`jjdg=O@TX3kh)P*_o%W4!>1h!Wl#=wB3z5c;r5_-)Y^9e zidghafr1EGXSlo_p+g)g;&C)+SIofU=!B3}jXn?|1Fq}}tQj@g?A(bZig9JPL}6K^ zLFZvxS$ky@K$EAs1~KHTmsGFqaC*!$j7|+@GnCfU&pe71r}U{N73a?1y%o~QW)YI) zHQ@>09_d6|?guK6oGmDIYjEjV?uT~f)7jyx+{sz8@Yo4SGk58U}D@X^6x8u=NDnee6l5h>uNIU=nC+- zV>PQ;3-Vp<#ab+q)?)DH)R41Hst9?$3e+uICtIje^V&O3E!_Cvo+H`1c7@!p{cO#Rr_IZqWeuzo1J`+GpJMtc=ekpUq;ocF~je zVslnFh>)yA5n@6^PSmg}K8cXSKxp%n1_xh_!D*wIe?xc7_i}#qLJMI&NU=|R1zKZ* zeM0AMxi^A>8F2lVf+{b1yDqEaACxc0P|BTsBqjap1hm5pZ;CZ~A4?r+OxaC^3d4Fk zF6&tPtK!|XCFHhz>I+)ezp#rQXnQy>Ojc-kS%mD$&`7_S;b~_FSMS8EDOv;cLFcc` zV_Y4Q%}B6YN{C&8a%&PV8>l5m&vyC$>{D2tGtS$XS3Nc2G}|1$|Y zqI3GbUqAUPS$OG=t}M1D6K;K)ic_HQ2MRQeQ2^3(nV*~bH3)~z=((DE{q(T6HS>X! zFiWnEQ&71W0Y5PU014j+2GWzxd)nLZJB)g1=R=)t?ruMe*1E8GY7AwID(sUuKktCh z4)pocSROfmr|6pVI1j>Cu%>Ccy$-DsA*QYmbNw2OgaPCiK0!|+)QU);GCaeqJ>#N2 zm!iH(jD09zKSqXeO}Dn;jB9!?4Qab;?C(byM1@moJ!KnIp9b%4VRJebVy9`HzzE3P zi)19|<1`?+0b^srQbfqsAS!=R#?>n0`2isKxVraA)SZ2`LYtU^M}Cb4E&_-#BnD~2 zjbSIU)Kkc&6wMDw6)bgjIoho1*$?1V^g3<)am02~oXRFh?Uq&)nYjr^DJorI9ickm zJ(f@G(Ar1fU1fJ+S%Y8Ffx%Nsb0e_(&LV^of;=xo-&=?fDIi3Y)%`R#a@USgMsO%I zx)Vc9?nm(mYxzdi8e9%#+J_=OeTc-%;!uDCZhHJiWh`9h@Le$n+T6P%L`YL*33l%z z+)V}vya^Iu0?IE=;i0BoMNMwXY1E=HpJIr-+p_C-LyWO6J(xr z8jd-aW9yd)P~4B|myn=cYh_;gV~AHzoV({kEs_cYgFzTz%>!oiD~_jt_tZy)GZ+k6 zbtc)=$=Zn?&rn+Uq(m)KWgtCX|PVLe0Tv!b+H%i6CkzpBXGdBt;zIZLmknn|cZA46aVZ*PPOe*=(xt zr<(UBkl>BZI-mp~zNC%FBx;C#N1Xeg!K(aa|Ndt={s8JW0CoE1 zP}9sp!)w|6Hb2nH%4_$-mjDNxaUIG59#AE)SkKMNbOQkZG~KE-+UoQ@T?#-yE|d7W zTp}A%R59zgPy9!xwe&$XF%cZS`Rci}d?=Cje$XLvXQG=?9<6p3jdMp_y1yODZ`yd5 z57bILck7^&upYgS#xN9sfsTU}V^jE}GU0R{fua^v+43LfAX$^G=tugnw6_Qmt96JpDZo}H z))k=g|2|Dn`&+>qkS6Xyny~oB7&_DlZ-6oXAx&5-jAwZK>=5a4PoNTyYnqxq&|y~8hiRd^&-TKiR{Mb-XM$c7AO~jOddtoxcOoIz)+yWxB%X1F0|jV0N2L%Ga}TQR(0iz4cqge5k=oC|Hc znrMIss%Nf##_Eo4rfsOU?>#DP6ht8*&PQ0y(^7R$gifK(=ddf?pxwU~-Oyrh!K8fblFE$BGJ zv4rSCEb`L5-&(thD({w+pgpY+r&OqH6OtH8>iWHUO@g-J)EGfx4;JvHoY?CfRK&E1 z)u&ANGq}^fq#_ovq<4jpEARO|Cif~;vO3;CZDz(iFophjs5U#;6EmrE79MZ~Eri=W zf&wCSE_ZPV;=?mM3o8X?P}^pH#CsajlRdT2@RbM=(_llORj6AJNf2SEJo=p;i(Ce= z!XNkTr~B7F&n-}4gn@H^f8lbQsjP%P_lN3FGC-MKf%73iQc1eD!E&(Fi4Fxb5Cggx zE0opI=L?{=0do_ZvJE1-=!4O{s%>EgIAS7%%>l?twtCJQwqb`aD4mtO>vTD>&)i#r zy?tl}_7yXai}i>&+|N+n@RbT{>a}9;cYoxrz4#zl52|{SSQ&!82B;7`>?jfha1?ZC zq@Kn!v^K5`J4I^^cyrQS4OTF-)km{NVOG$8${OBWv{zv?Yv|)y!`ll6^2KRnLe?0^ zoV>n|s)gd1ho#_{FTj@%2a3+1O>a0D%N}sEqG-xrms#q48wmcTB6g2gDYD97*EN8f zxL@E?E6^7qb2@dfyPYV{wKlpxoBFj@a5SIA?*p;M6T@jp433Rs0HcHI1@!pLQ=s0} zgr>Fgz_B0VF&>G(!1#43EjSu8b&Vb=N4Zxz7XJ7+rBZLmIi?}#NEJ}$s*a8!v$1Sg z(VK&3hz%DAU)ZF5KJLcyB{xSh#-NSQn3Q2tUM?%sL>`u*3Vq?sLxC;p_mb6loLT7e z#UrCoFJs8=I$h;&?nQW)Xz(5=wclGKrO7gOV?Ln`n*x(`9E(?;mdxI@iug!08-?Xq z&`m(nYg3h(u0(Hf;dQDeH$4_t0Cb^RO&MMRD4Jrc4M}_+bVe(Dw_yLN46LXiH_!4G zmw}Z|`|&bx!bllK-NDWbQNceaF2$6~Ska3)>-+pPCxH1gEd2XW7)cVtd+J>H>Y?l2 z`hS$PkRy6;jN_;TOl~<{E`9V~hzL2sY9@is)W&6Fr(Ao6hRYhaK5Wb$mTg1(Tfuz^ z>~P~DXv#6fG9F#dhOlU$vBOT}>R}zWvQa~Tpm8*tB%FRRD)wE^Lcs|`y^$So-SixN z*xwO9h?r+CVH3M7g50d161oeVqPO`flLdZ#z60)9$l=fB65s7!3r)GKIGG)9L-C*m z5eG19j!H^?vIIX_EP8!!-@|O%o@l|5?)x`UZgcih|L1&LLae@Z>8x+KCTYg*@_zAx zydLQ%O@ikvF6kg+(IMU2xH?C^27yq9?A@{fWgJpF$4c?rjXsy9Zxm3KW^CDCODsy2yZ@3q4+aN9dOQ9M%a}pxul?}55 zI}`FoEXV2#1xIypg;>cYt{*GtB%#TKHcbm=1l6|{$`{xOXU-2<14FH|mroc%4!n(_r6>ZVeprW72G8(3I_Mg{+W!f?cV@K+>AZ~nz5ZdTU+{TsT^+qr zPdN2rSxdOq58h^W<5*HR0G2HN+zxtaz-;_cg;#l(L7CSe2j@pLxUx4M$z8Ixot+!N zn5^hX?}{C*-mWi$Q{4w)$)I`hbMDv2T=LcIO+68Uqk3Ute3#H8NL|q_UIY+caj<%o z8X4?@IhS*b1Im%a>v=f-HNu&gNg*8_Bp_!p<^bgh#jdk*KhXX0^NgPW65$b6((^w?T zt5hFcK#JAh0Hjyg|9+VMmDI8IX=B;Y*YOH0xHDy~pMc1(y@?m^1{^-GP@>Uz@jkB6 zINSx)BoB^|4V8PzA$ZDMcl$OHz}~9wzVIZud0{$w2mjilPf`9M3)WgRvWDf`P)jn; zv{pa1O#l?0yGBp=4!)Pm=4^&Q_GoiaBL(`nh}ZB{Ji~1@2Ovfo5B-UU2PYGvLFZ*w z7+-|k0@xjT&~exo7k@GnA$w7M$}|vbeGu#6M1$8L)?qZCJ?^ackdkI`itzJ8M*ge}gd@koCN zRn{Jy4`<@X_@MBglJM3Fv{}QapAOZ+8aq7Fo%5-~lj?-9qOAbkHh^xCq-}H}(v+gQ zC#;R{92Z=Lt@&1*Cu|9Y)!V8bx&(f23H%0-J*W!>ve4C2RiattVQ2LOMEuL7Z?2H= zK<}M@EBb&uKpW6gg2EBHFk3Hy)w(_>SvR)*kQHF7f*MFP?3C=Kt zGjw%?wQz>=mg_#5P#YWzpbvr+{BDRGl!<7dJ}Rh6@&H;0bX-Ct)mZG!(KXysh*aNh zi3%9eJDjoG(JekTcijQR`m#(i&J#TrJ4NVE;?J;^IaCq53u+Ux!LF-Nn<$sM z<5S7T#fV2pG+O}k*Hr;gL-J3Y23|8)JU49puzX#iQ>O^A$%z&m*A3A*eROki^7);q z&vM+KwwUKmcJK>$9PXg`%%sbU_{cLq)@7@i2cfWOe%_{8hSjWX~@b< zx-)+sR&OKR3i@`;<_{4C2p4IXLWMy;nxFovUD*NGQ z1?FTqu4lLF3=!g+MNX`>+3BsCZ~J(9=b4`>wQGOr{GC8~hqpotXNL$<`0bWlsgi>I*Z{pDnwz`GRM%t8~YfvbRgg_hz?m`p5_w zHp3kYNK@J_@xzk#Y29|2lXv^7#_KDMi6{TjR4bt&eWZVLOof56@>^=#awGo-TU`zb zJ6qP@ey9Izg%gpXm0^QT`_4()-(bnQ_ITOZ^ftSHb~-t(XuDVx@}>5XEBW9UnjPkk zAG?~xJ#qfEUgf%OJ*o6+&h7QHXFccI(2)AP4U5^aJXKefIvE!gB$;u=L!EA@aXJ$D zw3<3g-LWs^C$dYE>gSnGxurknsvvWyS7QE}yyp19XNf6pR1@8MPYyPo-_!s8Ra~a# zU&m%Mg0lA8$Z^Bt3Xh@nKGE$wLNj%gb3F#3N18?|!hA)@liE!5(ZU;&cSZ8>_ekhp zPqvZp4e?R$esd~m>~h0~E!@I=!PnMTsr{^*wd8~MJkH$r5BDeq&A2mU5ms|Ygveb# zFW!B}N=3-ia@h-`&%;#LFf(sHfBjib+xhb^|1{73bkE{DU#9K&dggDNQZE}};Vmqh zqR=S!qB7I18c!7OoxSBAs9sI+X0v}a^Yfeid`Cl0kp2$;nX7LvOk308GD!ycW0AMM zH!SNa zNfHj?is2p!Ghs{gqI^=+c*Ot*h}o|U1HQHtQJ%l)fI^!Sh2@18zrSD-XI~hWowv-hxiJ;N1NS394G@A?pz@$|3<| z(@ECjZ$iOFOgF3Pr3k_9LCeL>Y3TFon<1H7n0+0XHU&{y~3yv}+Yl8IH z%jNaEa!TzA8xjqI_FoYH|fdDdCzK^z!kcPyM7}?XX!Q}kq|Gtv36xe?8IiN!j`R2dd*jOOdXKF z2L1p0S#NHYnquo`o?v}ZHNp;uQnZpLhJ~b}#z)xuK_BMWOhw=7*a8uQnDTFcxs!nf zqXUd7B19Uzn**+{@5afi>VF+Nb7ws*L`V@ws1sYf_*+vSTDaqT_)7Y4$8*OUv&UVz zW!I0h9A7))>&LN=&IhO^zsW=#$V5T+1etj8pJc)*AbMD~K2%&wIu_syi>P^+$$+>E z;!`fe$Ggq=#(>(nNNs|*KJ*3cVqx;P8o+PLV}5hLxGy$BaDk+VzFq7ml;Vf4GRCj- zhS^T3tc14;bsW7hVeSxY7`S}gRhaa8qY#8A9 zCRhhEiz8tiGB1n9O%=aQg0~yh&Kp4KYYB70@2$B9cbn`)aPNIL$v8=SBmaWmCadQ&$jer7IkphWv5bRIjs2Hro1EE-kuwOGXVDKJbhTb(oh9|QB6hLRFwiFZcEZZE5m zioT$H3YlipAhx=j)lr8E z5&Zjq*z2Xk@;X|<56>!w?TYxKU@a6iv(-4T@eSeJF4hlFalFAl_JKSl zwENAN^F}q$ORRxoZ`O_eB%YZ_{eri($vhc_<{(2_x{+8(f7v$G77K(ob??J)zz4un^cpL&nLw1>Pacr^tw^Y2ydqT%XX%!G3d_G3M zds#1Ub@ad+-rW&4Leu$TFW!{w%a3o+j~^WA`xdNwu2!J(m3Q&xDu+KPrXW383HM|y zhmn!--J5vc5tEqeM@(Y8i2qd2n9EYP{xv%HXA!dRvwi;(D!=B{+g$a$-PD({n>7y4 z{Xp*~JQuJoBHwmo$8<+htn91po6}QxMuhY|YtVHQww>DzuPhZ021L!aSY@Y@H=|s8 z)`GhO&1L)0r3t^~&SHDzy`UW1O$wI^Uo$=OL|t$f<3zwn?ws90_T_2(*^6DjIcnTa z*V0;#%{yj*ri(Tyr}V{b>4dyvcj^ycwV2%pAnyyiI79Jj{h!;^NP*SbgfH(ee&GH z=e&q9tgEt7`9bim|ME5(r+dTs9q^Wp>f745_gB00K3AJNnHra>9nhW{b@VIZ9O`TA zZZf59(1Y@}D<$5Zx7t>^8uHwCsw-J>ZN2Gcl{t8_s%Kw5YMha>KnhdoG~e(yvo<59 z`^@u{@UWC&$BdtDs)ZYV)RZq=EO!}kJS@rR8~%(9ovT8i?^84Rbkk4wiq@-`mqClP zOf*}HFK?)s-1*ou5_ws8*JYXJEz1baucQX_5wk|;)YNyMGSDZFl%_i^HkKunROyy= zP}HlPOzzdles!a#lX)S211B;>$m&j3_et_lG4d`U2h9(p4&&P*5s*8-qp>`3l?Q;!XSjGbaA#+vUmTk=}f;+GsmInD6m z0Ml;hiDlQ{{=m^0l)~Hp9M!+m7o*%jGSjq`4k}VUIP!O{Zm+^@lbAFAggE}0B4F(= znv+Y^bY$gD31BGgue1yp+&L#->92O~)9M0022(7|}>|Haj8?^F1U0|Y8g{CVHd-{!Z$L{iJoW*p}=gr2=St^ z`o_#j!pdvV*0>^J&qDmy1~d$uDEDiW1$jkq`(L2v)E3mf>1*Xh+5ByK?JI>|Qk^x; z`#&CzxFUR8Ld^(~e=@S9X!`0(LFLLPiGzj$1?G)&TB5R(vpYY(nt)ncxx zj*{HG7&D)`t(gyZT${Y&!NW$6LF(6xZZEkum%g{e>)KNNs^Huiaw{x1r*buANgImD z%(>qXL~0XqSoww%Fsnqp+P_)BP)ygEIbz`mWZusid_otvlj_v71$~91R&a^5$Y(S8 z6GqxZ2(5;6`uFSH2=Y*m0U`Z$YSPsssqLFTDnDTxc0T@qeOhwrP*h2b$Gnu;7v~h- z!eRZ`OdPbRuuu(Cn6vCD@@EwJ^GJd2jdN{XFHL-cRt9Q0@ZPi7#d?5idXF4zOZ;WhABL#DWJaDlbLy@MV$!R}|xzvjgG37Y_ z|DYv~m`*Si@wMB``Oe(7MiESWY}utFR;^#YMIU&84tJ zIyz44FOsl*+E}382=>EnMJ5t0WUh>rhGI zA~ntKH=_Nf?cs~=A_M7VUMU4M)#M8*gfqJ@S6&@Zm0HklUV5-U^4e0x>tt!?U#Tu# zw2z`1JLjNdP@!yr*QZzq+exM_X`Oc0=JS~6j+}p`LO3;`igl9yq;|1uFRjsr+aueB z$I&}h_~YqILhL?AuScG%S+&{EPdHPP_&IW~2}N}}vdW=js_L( zLz(3V7OaE07s|`qEU}%W_tv@c{Qu0_YXnxJ`wQ>pv{}FdiJF_Ulh*96-p`~i+4T2Q z#LjBlD#v5TlxntVCp|^XK1c5OU73~_xr{QaY_~Eki%mP|blc8aTbuaPJG~?$$<3dR zd*p|EYkbjZ+X!=a#WwR2!Pb8+MZ(R)m1=g+Ns(d5v434mS+oyUFcTUqW5<&x)RyAk mG#IN-H%+Yd^1s!JGV>=CqgE3NTKvKb6E4#I;b|n%yZ-|McP_R7 literal 0 HcmV?d00001 diff --git a/app/serialmanager.py b/app/comports.py similarity index 100% rename from app/serialmanager.py rename to app/comports.py diff --git a/app/parse.py b/app/parse.py deleted file mode 100644 index 8d2d849..0000000 --- a/app/parse.py +++ /dev/null @@ -1,39 +0,0 @@ -from PySide2 import Qt, QtCore - -START = 'Start Encoder' -END = 'End' - -class SerialParser(QtCore.QObject): - - - newDataSet = QtCore.Signal(list, list) - - def __init__(self): - super(SerialParser, self).__init__() - self.started = False - self.timestamps = [] - self.positions = [] - - @QtCore.Slot(str) - def parse_line(self, line: str): - - if line.startswith(END): - self.started = False - self.newDataSet.emit(self.timestamps, self.positions) - - if line.startswith(START): - encoder = int(line[len(START):]) - self.started = True - self.timestamps = [] - self.positions = [] - return - - if self.started: - res = line.split(":") - self.timestamps.append(int(res[0])) - self.positions.append(-1*int(res[1])) - - - - - diff --git a/app/settings.py b/app/settings.py new file mode 100644 index 0000000..3646002 --- /dev/null +++ b/app/settings.py @@ -0,0 +1 @@ +DOWNWEIGHTS_g = [40, 40, 40, 40, 40, 40, 40, 40, 40, 40] \ No newline at end of file