From 14981512290a29b5e5f27df8532e39bcd97c1f3f Mon Sep 17 00:00:00 2001 From: andrei1089 Date: Mon, 25 Jan 2010 15:03:19 +0200 Subject: [PATCH] Initial commit --- .pedometer.py.swp | Bin 0 -> 28672 bytes .pedometer_widget_home.py.swn | Bin 0 -> 36864 bytes .pedometer_widget_home.py.swo | Bin 0 -> 24576 bytes .pedometer_widget_home.py.swp | Bin 0 -> 32768 bytes core | Bin 0 -> 348160 bytes date.txt | 1 + date.txt~ | 1 + install.sh | 5 + pedometer.py | 153 ++++++++++++++++ pedometer.pyc | Bin 0 -> 5242 bytes pedometer_widget_home.desktop | 5 + pedometer_widget_home.py | 387 +++++++++++++++++++++++++++++++++++++++++ pedometer_widget_home.pyc | Bin 0 -> 13064 bytes pedometer_widget_home.py~ | 232 ++++++++++++++++++++++++ 14 files changed, 784 insertions(+) create mode 100644 .pedometer.py.swp create mode 100644 .pedometer_widget_home.py.swn create mode 100644 .pedometer_widget_home.py.swo create mode 100644 .pedometer_widget_home.py.swp create mode 100644 __init__.py create mode 100644 core create mode 100644 date.txt create mode 100644 date.txt~ create mode 100755 install.sh create mode 100644 pedometer.py create mode 100644 pedometer.pyc create mode 100644 pedometer_widget_home.desktop create mode 100644 pedometer_widget_home.py create mode 100644 pedometer_widget_home.pyc create mode 100644 pedometer_widget_home.py~ diff --git a/.pedometer.py.swp b/.pedometer.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..db49ff16ae9d5398d8692763da9db21a16bf6062 GIT binary patch literal 28672 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 AWdHyG literal 0 HcmV?d00001 diff --git a/.pedometer_widget_home.py.swn b/.pedometer_widget_home.py.swn new file mode 100644 index 0000000000000000000000000000000000000000..d4908be64906ed5a8906747a47e7f787dd14d190 GIT binary patch literal 36864 zcmeI5dz2ejdBBIH0TS{kl)&McK|Us0tkr65?AR_FaO|~r@p{+Ym2DE&s9I@uSGHDC zG^6#dd6c%4KuI8!N0Xcb4un$Ll5j|&hhRcz_@hlqf&-;+N}s$TE~SNp(jG{E-@S8Z z?ntt|?P=i@W{!WW(cJfUzx(>`)p)kBe|(R7MSi`*^^1=4yf+@&{p1@ic5d9^IORsQ z?bXEL%vWc&(+E0e_9L!Cex+RwDhspC<)M!6wf!NT!q7r<(KGigugbT;YY!f+Rp-56 zu#g`fiXN8q!;*x^w^q)cX6hrAKq>(w&6J<#l|U+iR0634QVFCINF|U;AeBHWfm8yi z1X2n7gd|X|I?gH5x>XDS?Ei}m;E_ul=O5uA_;WY`x5HcDM))l_0*7H7hT$?eAD#%G zx!7^;hChb4!zB@|7r>?9z{403z73y+hu}_lHM|NY;KgtboV?I+Zh_x{m%~Q5 z0KSP);X$|)J_OgnZg?p?6HZ;=IJdzPbYK#4@Ob#!^9cj5hwI=7?1d?KI{W~m$KCL8 zI05f~7EHj8FmT)o$KhId2|NidfG=ST`2%RcB1}OR&V_T}A&e)}kbxgyX!#`E1J}a~ z;SzWlgULtW!>|q>rGD-Qsizy@)vy&Vgn!4T@^4~fS>5H@*J88k?X6XgcgIW;9qnwi8bf(O+uCOL6ee%@hlT_+nHZ!9Np)#9^ z^WWvST(8YH7QIH0E#wP1w~*hMbBE=QKm7u^Bkn@2UTrq=T7*}1f}q*R&Id>GW8)J$ zrY1`>P=1hE7?JE`uzHNGX8_s)1 zCyS;1qtnIl?b{{>9LEU7NFiToHX77XHd9$BH|D)+Cg&QrQurv&zj4WzTP?3qEd|~( zA*VYHOECTY94Ob1^z-DSC6#8qv)BlgrPgeeM7G&bJjJPf+s8^XqZ6asi&N9#%{T?z zGqqzBAx-X@812nqEZ$(H{{++mq}C&7fQ-lblrY z+Hq20F!5nkzEu5YYMp<5y@on9Eit<)W;cx4l8%l#F2heqIgD;pYvp=#K3}d@OFAdn z%+zkgA^JBxIT9wIwfW zwb!aQ7yB{IA?i4CZnYeg2e!to%1WavbE2&|lX21Sz8Mn-D_g6`)haU;HYWX1nl01j z+a-UYc@)V}1&if?b|(d!%Vj2;4UgK+6h-ficDhH)zHSczO`~t->*ZOmt^#eBwxa4q zJh7#Qi?v0&etVPFJxp&rVFw`P&-$%$h0bJzF4a-8HR4SaFbpvvYM9Lo z4q93oOCv61(z~sp%D1h4aqi-XA`v9xIbE_MhNRCzVXOK_Hj{1 zc;GGOOBApcluD{Qh?A6&b-sEeA1u%*Rej~j#3{XNGFUjib(KxmI$cXUkTyTY_%*sZWDP}t()r_FLzwZZ5~)L7J$ zO1DnJqDdJita|gXqGyyDM*@yy zhL}_P@o{xIrmkl)8OK>O-<&=6t+W?tYxFNW%2)VD8K^NZXcLTHn@1jM>;s4a+a1w%j@Ztu%rc>gH8e9T zpCe*au=fVoQkiF~RP629Oi@{0+y&O>bC_uS1!Yu^k~8@-%l=xm?v)}FY^TM(gIAjC zG}y3cHjF`8XE}#4#b-~g(Y5s$bo*=|D$|-p0)m8!L6_ho&(=uoqrG92p$YV4&Ke){9)J%7s21NC;xYF zH{1+9Tn$^`Zj1}>h1=kja5e0NQMe5LgFX2#!WZB;ydJKDLvR^97ruMG<2(R&z?+~A z2Vg%u8=eK_6A-;}cfq74CRaPW}2Jr>`t#J9`w z?Vj<;QgM6_yR)>p8J@Enu0kq@F}4uLrY3gqd}E>D#AdhgP_@EMAq;C_lR@#vc-=$Y zYiBD915RZ@ww89PT`QC^tM{+e-fVPB4yX)=r6fbR~vYqO1VbX)h9 zyt?&$(ewTCJRY%|R~D@3W&&)cizYt5fnCoEiv=V1=i@m{2`IHWS%N z#Wp|JZZ5joAWN>@(3YqBiO94U#%-){Y}+k3Ym%4StXE?TEHAonahI-?N>p2_vIRry zm9H2T?VY6X5t%jpPQyEzU8t5?%A#BfR$5-p4ZqZ?Bbn%y0!UyJOgyr+HBYxl{UjsM zK8>kTn>8Ier&39zUn)rtn<tFy)(4_tP-nn!*1%iVUTft0*(D^Kj3WqM|` zgDvZZ=eF9-3N@D}SP@?p*-vFVsCiWSxx*bla8VIAV9QN}-0HMj?84!l(@TkBB7;7b z;82QERNGK5-{n%zqDoc!pV}C#cjNTEF2C}w0_kw(w)^wH8Knd_LF}l^GgQpF;-~V` zl(XhnLiPzFwryQNxr>X}>pc`|*uHg`a5!Q_VIMRO?A3iQIUK2!wZ-1vSvGrHR*;Ds6edUFT-p#jvqUu+vo2*&-SmE))tnwj*|Q2u0FyuN-m3N2~yG_Ts&ut_=3p ztIDmKi&;62V~Vzpx+2oL(P?wEL}&5zQK-%BWN$W6W^g1JNZ z>KAsyrhCI+R`cpc7f9;TaGz4uL@$Ujz|FeWw=lws%n*VLE0xyT{FbFx2bN*k) z|JUH&Fzh?{{B3wGRG|n3cm_N|qz}NS;r;MtSb}MI21ufhVITMsd>C$o*TAoX*bnx@ z^WhRWg`MC};hk_jtiUqtg*;pc-^NaGFZ>z29cJK4cnX}vK5znV2RZLAc7uJe1%8B` z;4|+sib0?hgUCilMrE}X((ti`$6mmuY+g7GvUYB0PcoA zfK`o;$4Otzu0=mpM1d$PgcJj3;xli0w9nsd+%ucFnyp>Psh8%hxR~hV^PkNnNcTR8=b{j4hl7m$#1K>wkp## zm3lb7B|0WKK&lRh%iKgF?;rbQSG-kLT@{XgswJsRX=JXajB6yAbK`7On$33AH`&ON z0+SZ6kqrh02I91Mj4)cYN?wOV1Q;x>;S?u4?B#%yneA-X+0N<&a&DK&P|ffBy63g@ z3~l?=)bx(huF+y?T#nxDmmd_k))j<(bGFeunsng-Nn7*9K^EYgJ+cC`R+my9Tz|;K zf;6(nC}AH@!wF9-{XG>Do|d~jE$3EpV#!jqDn{Hkm9I`g$0=&HK8->vWzXt*5TixG z70bfG!Qn&hi`_}BBhTeZXzC<0sz_UU z8;^Pt+iFkO4lElN`sL4G|&uF+g?y1|F9;uY>_k=KwO;xL-iohQ^&WOpyQp;F8 zQsGAjRCAEh;a83))@u#C=lxc_#=*x}aC6A1$*)js-P}33Z4bxnFK=J2E76oHs@rZ! zsM_x~iI12ygR!v3jZBK6!sxc3(lbhAJu1!Y*zJg4xtPX_3N`(F3wvGOTV~ng_vG4A z7;W_HcX(6ElQ^82>&_~fu{R!ii>A&xO16^SGvRiYF}gV7WLLI&U~itp=3He{iTVO! z&{p2wZUQHM6*a7)>XH&p9GT?6;u&A!EBhV!U^&pMIx7kl++XpBlo@%bw!Si0u9jPL zqw0Rc(1yW6VYoV^lq_Qzn@!iJWo-{K_NI{%MA(sHqEd@=MmDRTl&54u>4dbOSyosj zZOzhEyc}-Ntc0J(V$DqS)7_dW^$=#|m=c^kkSoy-T;o<2Xig0=gi6wG8SNq^ECfsL z+Bq4vxZ4nSX}uPkFp(8U#UB1iBy#nt5?OC2g3f2lvwoJu*E22V1B>qR06im$P#Ct9 zT@nnlu5NFOwr)f>HThy+ zeI4`|SEFWRC=+!aP$OG#uqFdpL&oWNEHlxm#}q^PS{H5b7-#t;TiqFqE;=(@mL#}z0nv&j>X$28kwjEgmqL7O(vzp(IhzOB>SwP({MZkQdyF^ z4xI|xN#xZvNzfk9TM{*eT2q|bF}0O`)vFwlIf`0=L~9aRJczlm%&%10NaM%8vLKRM zGwoFS|KDdFcq?m3S^v-R@fhoS`ThS%xC`C~*Fz0n1_$5@klzKI3#VA){{`F%$3cGY zKMUiq7EZCg{~UZ4?ttr{0y8iTJ7EBR$ol@va1XozT2O)s*bQsoaqthU@#QSR+u?1n z0MCaf!`E2j%kTZ)1g`;E_YXi8E(BTszX#q8uY)l-55B<~|0Kxz|1S6_+zQvh>tG2E z!b{-Aa0&b?>wP&>a6P;ceiaVF2%HE1!aDzcxD9?6UJE7I0-NDt_zLU$d*QwC8&H9l zfV>;vG3w->;1eMAa~!64J`4|Y|0#GEtUwV8@HF^3>;JppCip$bfxJWD5_pihJ^>$t zcfl**7|g>qcq$l$P7MO7L4X0!EaiV127yQyMJKx#Fk2#5uTI~mE#%RHS(fuJj0dcK z5o|td1RKsA!4+qXVEvgR*mTwihR+;vgw0H;0W&jT>gSFYY8HNIb0eJ1`_ZlS-vCsYyc`Dwi52Qj3_$h5gMEP&LZc!BD;*E zbdf)(WAqTanstOud=P5gNX?O3xlUuBk+^$oFJiQbZ5qB95oG`W&8&-ev38dA|3J9@ z{|f7RdGDXR>+f1P2-m;}3_unxf=5~3KLTF>dEeig;Wt6f06Z5SWnC}t_4@#rb^kc` zvhRP2wftYg{UGand9UA9AZz^Zke`2shu{vl9d3aDB(LUo13S1+uT%o51X2m45=bSG zN+6X$DuGl2KS>GbiMaZkZkeQ8CO_pZ6H6PTEoHNXBZu?SGnBEVJzR)~N97z5o!Ik# zj?PfZ`u{zw|J$;TX8k|JhwT4905`!Nkl+758-B=o{v^B)eji>1uY?02zah9BzRSA) z^KdWR1P5UZwgCVAxN`+;f+xdy@F;8jN8pR_1^6Jm1>`pXa`yi@a1O}1|A*lud=!p@ z?ESw1UJX7-8LovEG~o((27Hh5-3Rh}fb>cwkV+txKq`S$0;vR238WJES&@KD-dFX4 zBWG1U&+O~WuI436y{}UeVXrFr-k|B5n9?^f{l9q=)9PNtBrQR%zOTTE->Da`*Tu6s z(xl(;V7;}4{~x2-vfi=~`BcB6lphAL9WFnE3Ey?%hzE12DC4(#s382f(J}7wsr;Po zoj94~TL6;&`@Zca@xSS)xck34B^gz}*WHk|I*r(`@cMsVpw#-sQ0i+oWB;cm{{=AQ BG^PLm literal 0 HcmV?d00001 diff --git a/.pedometer_widget_home.py.swo b/.pedometer_widget_home.py.swo new file mode 100644 index 0000000000000000000000000000000000000000..7c1236494b3f5bcd00e1563e4da6b3d2274e0541 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core b/core new file mode 100644 index 0000000000000000000000000000000000000000..e54e9decaf5c04fa07440066b11ae5160e1634d4 GIT binary patch literal 348160 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 literal 0 HcmV?d00001 diff --git a/date.txt b/date.txt new file mode 100644 index 0000000..aa64af6 --- /dev/null +++ b/date.txt @@ -0,0 +1 @@ +100 100 100 diff --git a/date.txt~ b/date.txt~ new file mode 100644 index 0000000..5440dc5 --- /dev/null +++ b/date.txt~ @@ -0,0 +1 @@ +100, 100, 100 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..874338b --- /dev/null +++ b/install.sh @@ -0,0 +1,5 @@ +#!/bin/sh + + cp pedometer_widget_home.py /usr/lib/hildon-desktop/pedometer_widget_home.py + cp pedometer_widget_home.desktop /usr/share/applications/hildon-home/pedometer_widget_home.desktop + diff --git a/pedometer.py b/pedometer.py new file mode 100644 index 0000000..44a3775 --- /dev/null +++ b/pedometer.py @@ -0,0 +1,153 @@ +import math +import time +import logging +import gobject + +from threading import Thread + +logger = logging.getLogger("pedometer") +logger.setLevel(logging.INFO) + +ch = logging.StreamHandler() +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +ch.setFormatter(formatter) +logger.addHandler(ch) + + +class PedoIntervalCounter: + MIN_THRESHOLD = 500 + MIN_TIME_STEPS = 0.5 + x = [] + y = [] + z = [] + t = [] + + #TODO: check if last detected step is at the end of the interval + + def __init__(self, coords, tval): + self.x = coords[0] + self.y = coords[1] + self.z = coords[2] + self.t = tval + + def calc_mean(self, vals): + sum = 0 + for i in vals: + sum+=i + if len(vals) > 0: + return sum / len(vals) + return 0 + + def calc_stdev(self, vals): + rez = 0 + mean = self.calc_mean(vals) + for i in vals: + rez+=pow(abs(mean-i),2) + return math.sqrt(rez/len(vals)) + + def calc_threshold(self, vals): + vmax = max(vals) + vmin = min(vals) + mean = self.calc_mean(vals) + threshold = max (abs(mean-vmax), abs(mean-vmin)) + return threshold + + def count_steps(self, vals, t): + threshold = self.MIN_THRESHOLD + mean = self.calc_mean(vals) + cnt = 0 + + i=0 + while i < len(vals): + if abs(vals[i] - mean) > threshold: + cnt+=1 + ntime = t[i] + 0.5 + while i < len(vals) and t[i] < ntime: + i+=1 + i+=1 + return cnt + + def get_best_values(self, x, y, z): + dev1 = self.calc_stdev(x) + dev2 = self.calc_stdev(y) + dev3 = self.calc_stdev(z) + dev_max = max(dev1, dev2, dev3) + + if ( abs(dev1 - dev_max ) < 0.001): + logger.info("X chosen as best axis, stdev %f" % dev1) + return x + elif (abs(dev2 - dev_max) < 0.001): + logger.info("Y chosen as best axis, stdev %f" % dev2) + return y + else: + logger.info("Z chosen as best axis, stdev %f" % dev3) + return z + + def number_steps(self): + vals = self.get_best_values(self.x, self.y, self.z) + return self.count_steps(vals, self.t) + +class PedoCounter(Thread): + COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord" + COORD_GET_INTERVAL = 0.01 + COUNT_INTERVAL = 5 + STEP_LENGTH = 0.5 + + counter = 0 + update_function = None + + def __init__(self, update_function = None): + Thread.__init__(self) + self.update_function = update_function + + def get_rotation(self): + f = open(self.COORD_FNAME, 'r') + coords = [int(w) for w in f.readline().split()] + f.close() + return coords + + def reset_counter(self): + counter = 0 + + def get_counter(self): + return counter + + def start_interval(self): + logger.info("New interval started") + stime = time.time() + t=[] + coords = [[], [], []] + while len(t) == 0 or t[-1] < 5: + x,y,z = self.get_rotation() + coords[0].append(int(x)) + coords[1].append(int(y)) + coords[2].append(int(z)) + now = time.time()-stime + t.append(now) + time.sleep(self.COORD_GET_INTERVAL) + pic = PedoIntervalCounter(coords, t) + cnt = pic.number_steps() + + logger.info("Number of steps detected for last interval %d, number of coords: %d" % (cnt, len(t))) + + self.counter += cnt + logger.info("Total number of steps : %d" % self.counter) + return cnt + + def run(self): + while 1: + last_cnt = self.start_interval() + if self.update_function is not None: + gobject.idle_add(self.update_function, self.counter, last_cnt) + + def get_distance(self, steps=None): + if steps == None: + steps = self.counter + return self.STEP_LENGTH * steps; + + + + +if __name__ == "__main__": + a = PedoCounter() + a.run() diff --git a/pedometer.pyc b/pedometer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e64d6871acc8caac63bc010abdd0a2f61614eef5 GIT binary patch literal 5242 zcma)A-E$jP6+gTBuw={MA4zH2suWWN5**hIfl^4@#Bn@0a%SbyM$p+=YghKV(ypvs zCr)bf;yy6L4E!DNz%V@WU%&%1yuqIU!y_~B`<=Uz+++|~-lKcZo_p>+-{{*<>OSPh1-GhC@=A>SdejuU2Yf;B6B0D@gU042_hBNVHBwVIDeAzRdUi*fx~g) z&@?Tt({j6k7gf1x20*N$H6cZ7##*#yEtQHA(PdRC1ZO4{3<2FkFq|H8oqp2@`IemL zDI^Y%!dehGFIOp`Ef=)Sxq9(a{r2{a#kyX4 zXv}%sPaTF?jfYi@IJBQq_k-t3L^&PGI8G~*c&}PXQa^Y?N_7OPWmXmQrcnwHHZ*k| zlcCLES;#)r3)KWY7&YZdhC@LoP!ZLVO>#Pcg3h6j0u(_Ht{Z2jMZ4aq%F+!ZRfjVV zWKFe0^BZC5eoshg1|VGqMsrMxbdwy$9eG%@rZJ<=sRMw>|GE7uP`O|p& zaJ%mAJ#aP~4|aF%8THfGj18!Yk;6G^l2?gS-BU@eC{?#h=`Rse`#2+zbBpQQP12y3 zdJ?_mKnXkOql3JdV*G0)Lw{O*aa_Fz{ruOSsi?YK6wH*M=s;|`Cl6i6BCgTXt4!A8mu#VZ%F zInMOVa|c1{QcM@g{3J*=fl96d2#n9qf_=rBw+fa*d){g>Q4DI2ntmOK%(x~NO#%Xh ztzlUh8e=Hm3<^xkgM6dj`!*OjUlz`(634eS?ltoFapEumMxNgck}@`3ym&G_GMAdbR103?v`V0| z@Q|Z}>gc8F?oh5dJPAvC5$S&T$(M`eQh5TO+45Y<_++c~VvEJ~A9DRMK!8RFB@b}W zVj*DAVj+Pwk<`$d&;F(z;KH_^4M=E2v#)wBS8i*kj~sPd;!Tbs7+gLxZF=@k!73(!gz>L}+T`=#u-~ z#M_ZoUN#6>?BmH?X4<$q&&o#+)xdytSI>na!}@8l)y$&^!@p5@FO1&{+ONf|{X$%# z#z2OJEYVni7C>tut2OkHb?u<~T4Obm<6aP{_3!TPI``cB^$#9yYEQ^Uz7s}) z=J%x62~#cAVU#MS)j|3i^(D%-tsLE-tbeN0r%nlyj8R6)SYm4E$Eim>wlUB8&jo7( z#bB5Rm=9Dr)E^74`e7!M8rSSY%bM1a*-0x-&>wdMdKj7r93ms`0FjW5nBBSaaCgQz zOf&Ed;+^jSXk(-Mj@yetMsc&9VoWdZMA3#$@IH7O&!h*SAfXl+!y8|KE5IYNf8;;3 zs=w2=ODiGb5;wTsJS-1a#zh0cd4x*$3m`O2!YO`=ReAO?sFUyUR~n(ww`A0)tS_7pK6(|U7F&Y^)sw7ve4wzoxx^l?qfhb=%y7ca?KNkZIK zMb66u*|7v;Lt{zX&MGTnA)Ml?+qOG3palc4pUOzeuu>TsttU%_!P6>SSFe$%vR*$8 ze03YW!Qz-$No(qDE1{>=HOE)uHptPjRDIlKTUb?X$Nef2Q99zc>fflEl0b5E_jTA;7gKu{(y*AwVx<>bR-X!=cfCdlyC~f(j?-Io_;PnuqzO%tO&zW?BpqDOSWI}dp zbI;wb?`=9i{$NM*y+a=~Zb_Fi;h-y(yOx#`U*rfzrJmC$yNmR~mh(F1)ltoZF@+60;=Ds9o#weWsva8Pn~?h!D7XbNU0;O=bJxAq>4 zDvGf=U2xnv2bt6lVUeg6{1QA9TH4&?>oqn3&UJ!s5ZofT1E9Ug-QADsmz-#eFL^3+ zJ}Od6pZcWpE~nooP&MD@Xd7U3JRQAU`fh;eF`h5?B53`Kc7@$Y4xg2BG5bZL>xGf) z8m5e3haT^|2cV578`v;97+wQCA2SDU&CL*Lc1K%WjW1=19KXY#n$#z@>-Tq4=Ke;C zLf3uZMSchUFfH0TRHpaiJ}%<$Yn>tJvl%rFR-@O9G0*oi7A68Is%l#cq32LZ|4To5 l$oEX6_(SF*y&&;|TCwL4FLO4ps`y 1.95 m") + selectorH.connect("changed", selectorH_changed) + + heightPicker = hildon.PickerButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, hildon.BUTTON_ARRANGEMENT_VERTICAL) + heightPicker.set_alignment(0.0, 0.5, 1.0, 1.0) + heightPicker.set_title("Select height") + heightPicker.set_selector(selectorH) + heightPicker.set_active(widget.height) + + dialog.vbox.add(button) + dialog.vbox.add(modePicker) + dialog.vbox.add(heightPicker) + dialog.show_all() + response = dialog.run() + hildon.hildon_banner_show_information(self, "None", "You have to Stop/Start the counter to apply the new settings") + dialog.destroy() + + def close_requested(self, widget): + if self.pedometer is None: + return + + self.pedometer.request_stop() + if self.pedometer.isAlive(): + self.pedometer.join() + + def update_values(self, totalCurent, lastInterval): + print "update" + + self.totalCounter += lastInterval + dist = self.pedometer.get_distance(self.totalCounter) + + tdelta = time.time() - self.startTime + hours = int(tdelta / 3600) + tdelta -= 3600 * hours + mins = int(tdelta / 60) + tdelta -= 60 * mins + secs = int(tdelta) + + strtime = "%.2d:%.2d:%.2d" % ( hours, mins, secs) + + self.labelTimer.set_label(strtime) + self.labelLastCount.set_label(str(totalCurent) + " steps") + self.labelTotalCount.set_label(str(self.totalCounter) + " steps") + if dist >= 1000: + self.labelDistance.set_label(str(dist/1000) + " km") + else: + self.labelDistance.set_label(str(dist) + " m") + + def button_clicked(self, button): + print "button clicked" + + if self.pedometer is not None and self.pedometer.isAlive(): + #counter is running + self.pedometer.request_stop() + self.pedometer.join() + self.client.set_int(COUNTER, self.totalCounter) + self.button.set_label("Start") + else: + self.pedometer = PedoCounter(self.update_values) + self.pedometer.set_mode(self.mode) + self.pedometer.set_height(self.height) + + self.labelTimer.set_label("00:00:00") + self.labelLastCount.set_label("0 steps") + self.labelTotalCount.set_label("%d steps" % self.totalCounter) + self.labelDistance.set_label("0 m") + + self.pedometer.start() + self.startTime = time.time() + self.button.set_label("Stop") + + print "button clicked finished" + +hd_plugin_type = PedometerHomePlugin + +# The code below is just for testing purposes. +# It allows to run the widget as a standalone process. +if __name__ == "__main__": + import gobject + gobject.type_register(hd_plugin_type) + obj = gobject.new(hd_plugin_type, plugin_id="plugin_id") + obj.show_all() + gtk.main() + + + +############### old pedometer.py ### +import math +import logging + +from threading import Thread + +logger = logging.getLogger("pedometer") +logger.setLevel(logging.INFO) + +ch = logging.StreamHandler() +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +ch.setFormatter(formatter) +logger.addHandler(ch) + +class PedoIntervalCounter: + MIN_THRESHOLD = 500 + MIN_TIME_STEPS = 0.5 + x = [] + y = [] + z = [] + t = [] + + #TODO: check if last detected step is at the end of the interval + + def __init__(self, coords, tval): + self.x = coords[0] + self.y = coords[1] + self.z = coords[2] + self.t = tval + + def setThreshold(self, value): + self.MIN_THRESHOLD = value + + def setTimeSteps(self, value): + self.MIN_TIME_STEPS = value + + def calc_mean(self, vals): + sum = 0 + for i in vals: + sum+=i + if len(vals) > 0: + return sum / len(vals) + return 0 + + def calc_stdev(self, vals): + rez = 0 + mean = self.calc_mean(vals) + for i in vals: + rez+=pow(abs(mean-i),2) + return math.sqrt(rez/len(vals)) + + def calc_threshold(self, vals): + vmax = max(vals) + vmin = min(vals) + mean = self.calc_mean(vals) + threshold = max (abs(mean-vmax), abs(mean-vmin)) + return threshold + + def count_steps(self, vals, t): + threshold = self.MIN_THRESHOLD + mean = self.calc_mean(vals) + cnt = 0 + + i=0 + while i < len(vals): + if abs(vals[i] - mean) > threshold: + cnt+=1 + ntime = t[i] + 0.5 + while i < len(vals) and t[i] < ntime: + i+=1 + i+=1 + return cnt + + def get_best_values(self, x, y, z): + dev1 = self.calc_stdev(x) + dev2 = self.calc_stdev(y) + dev3 = self.calc_stdev(z) + dev_max = max(dev1, dev2, dev3) + + if ( abs(dev1 - dev_max ) < 0.001): + logger.info("X chosen as best axis, stdev %f" % dev1) + return x + elif (abs(dev2 - dev_max) < 0.001): + logger.info("Y chosen as best axis, stdev %f" % dev2) + return y + else: + logger.info("Z chosen as best axis, stdev %f" % dev3) + return z + + def number_steps(self): + vals = self.get_best_values(self.x, self.y, self.z) + return self.count_steps(vals, self.t) + +class PedoCounter(Thread): + COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord" + COORD_FNAME_SDK = "/home/andrei/pedometer-widget-0.1/date.txt" + COORD_GET_INTERVAL = 0.01 + COUNT_INTERVAL = 5 + + STEP_LENGTH = 0.7 + + MIN_THRESHOLD = 500 + MIN_TIME_STEPS = 0.5 + + counter = 0 + stop_requested = False + update_function = None + + def __init__(self, update_function = None): + Thread.__init__(self) + if not os.path.exists(self.COORD_FNAME): + self.COORD_FNAME = self.COORD_FNAME_SDK + + self.update_function = update_function + + def set_mode(self, mode): + #runnig, higher threshold to prevent fake steps + if mode == 1: + self.MIN_THRESHOLD = 600 + self.MIN_TIME_STEPS = 0.35 + #walking + else: + self.MIN_THRESHOLD = 500 + self.MIN_TIME_STEPS = 0.5 + + #set height, will affect the distance + def set_height(self, height_interval): + if height_interval == 0: + STEP_LENGTH = 0.5 + elif height_interval == 1: + STEP_LENGTH = 0.6 + elif height_interval == 2: + STEP_LENGTH = 0.7 + elif height_interval == 3: + STEP_LENGTH = 0.8 + elif height_interval == 4: + STEP_LENGTH = 0.9 + + def get_rotation(self): + f = open(self.COORD_FNAME, 'r') + coords = [int(w) for w in f.readline().split()] + f.close() + return coords + + def reset_counter(self): + counter = 0 + + def get_counter(self): + return counter + + def start_interval(self): + logger.info("New interval started") + stime = time.time() + t=[] + coords = [[], [], []] + while not self.stop_requested and (len(t) == 0 or t[-1] < 5): + x,y,z = self.get_rotation() + coords[0].append(int(x)) + coords[1].append(int(y)) + coords[2].append(int(z)) + now = time.time()-stime + t.append(now) + time.sleep(self.COORD_GET_INTERVAL) + pic = PedoIntervalCounter(coords, t) + cnt = pic.number_steps() + + logger.info("Number of steps detected for last interval %d, number of coords: %d" % (cnt, len(t))) + + self.counter += cnt + logger.info("Total number of steps : %d" % self.counter) + return cnt + + def request_stop(self): + self.stop_requested = True + + def run(self): + logger.info("Thread started") + while 1 and not self.stop_requested: + last_cnt = self.start_interval() + if self.update_function is not None: + gobject.idle_add(self.update_function, self.counter, last_cnt) + + logger.info("Thread has finished") + + def get_distance(self, steps=None): + if steps == None: + steps = self.counter + return self.STEP_LENGTH * steps; + diff --git a/pedometer_widget_home.pyc b/pedometer_widget_home.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ca03f47c9f92d7d9e70870ac351c43b311fdc45 GIT binary patch literal 13064 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 0: + return sum / len(vals) + return 0 + + def calc_stdev(self, vals): + rez = 0 + mean = self.calc_mean(vals) + for i in vals: + rez+=pow(abs(mean-i),2) + return math.sqrt(rez/len(vals)) + + def calc_threshold(self, vals): + vmax = max(vals) + vmin = min(vals) + mean = self.calc_mean(vals) + threshold = max (abs(mean-vmax), abs(mean-vmin)) + return threshold + + def count_steps(self, vals, t): + threshold = self.MIN_THRESHOLD + mean = self.calc_mean(vals) + cnt = 0 + + i=0 + while i < len(vals): + if abs(vals[i] - mean) > threshold: + cnt+=1 + ntime = t[i] + 0.5 + while i < len(vals) and t[i] < ntime: + i+=1 + i+=1 + return cnt + + def get_best_values(self, x, y, z): + dev1 = self.calc_stdev(x) + dev2 = self.calc_stdev(y) + dev3 = self.calc_stdev(z) + dev_max = max(dev1, dev2, dev3) + + if ( abs(dev1 - dev_max ) < 0.001): + logger.info("X chosen as best axis, stdev %f" % dev1) + return x + elif (abs(dev2 - dev_max) < 0.001): + logger.info("Y chosen as best axis, stdev %f" % dev2) + return y + else: + logger.info("Z chosen as best axis, stdev %f" % dev3) + return z + + def number_steps(self): + vals = self.get_best_values(self.x, self.y, self.z) + return self.count_steps(vals, self.t) + +class PedoCounter(Thread): + COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord" + COORD_GET_INTERVAL = 0.01 + COUNT_INTERVAL = 5 + STEP_LENGTH = 0.5 + + counter = 0 + update_function = None + + def __init__(self, update_function = None): + Thread.__init__(self) + self.update_function = update_function + + def get_rotation(self): + f = open(self.COORD_FNAME, 'r') + coords = [int(w) for w in f.readline().split()] + f.close() + return coords + + def reset_counter(self): + counter = 0 + + def get_counter(self): + return counter + + def start_interval(self): + logger.info("New interval started") + stime = time.time() + t=[] + coords = [[], [], []] + while len(t) == 0 or t[-1] < 5: + x,y,z = self.get_rotation() + coords[0].append(int(x)) + coords[1].append(int(y)) + coords[2].append(int(z)) + now = time.time()-stime + t.append(now) + time.sleep(self.COORD_GET_INTERVAL) + pic = PedoIntervalCounter(coords, t) + cnt = pic.number_steps() + + logger.info("Number of steps detected for last interval %d, number of coords: %d" % (cnt, len(t))) + + self.counter += cnt + logger.info("Total number of steps : %d" % self.counter) + return cnt + + def run(self): + while 1: + last_cnt = self.start_interval() + if self.update_function is not None: + gobject.idle_add(self.update_function, self.counter, last_cnt) + + def get_distance(self, steps=None): + if steps == None: + steps = self.counter + return self.STEP_LENGTH * steps; + + -- 1.7.9.5