From 14748f4abb64e9d70818508f0e70428bf8ef7cbd Mon Sep 17 00:00:00 2001 From: andrei1089 Date: Mon, 25 Jan 2010 16:20:58 +0200 Subject: [PATCH] Showing data in 2 separate columns for current and total values --- .pedometer_widget_home.py.swn | Bin 36864 -> 36864 bytes pedometer_widget_home.py | 156 +++++++++++++++++++++++++++++------------ pedometer_widget_home.pyc | Bin 13064 -> 14383 bytes 3 files changed, 110 insertions(+), 46 deletions(-) diff --git a/.pedometer_widget_home.py.swn b/.pedometer_widget_home.py.swn index d4908be64906ed5a8906747a47e7f787dd14d190..96b99eaf30a1228f29703ec910999eafe8b2e421 100644 GIT binary patch delta 5728 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 delta 3865 zcmaji3sh709l-G$6ePR?BBG!eGeIH{W6yZ#ijU%>7F31|u?`VPfCx!2307+>w(F#| z_^AKdq30<0XzN;~)3jSHwN!de&va^`>o6kG5JZ%tuu^x3%p1j|q?C=~)h+dvEUj z-#`ERzrWw_-fU?0+tBP6Q)(=jzd)OActGJ3t|;T5FUpSC9HwlWeI({vjk%J&DzBle z=fLLu9>{t!TD;%=S%=~a@Am-K<+$qoK8&>CyJ*Er zs6h_CXNsE9gjK`p6lEqG!3e^q%;&4H!HPvl#1QzQlljks4&QOF-bWi6@Kb2e#hkx| zH<5%M=KB=nyl=*OOhX9%<jPEPJiZWp;>&q9~EDyhvP| z5G`JxusyQiA^RG=;_J&=VzCv7-1sr#W_;wx*%qg(#8ze=d|VzHmEYIr{Rg9SN}Mjw z|GWQKYQDv4b`0JxhhQi%nG&7m>T*MAt;=P%4Q?Si6DEk4t-~X=nc50hl_963)LfmY zOG(k`6>-KoCeXKET(^!AuiB&XJzZ7HW_^S4wHa`(@3Q+_dxkf-rO`Oe^QRL%dWZP$ zB(-QuQpXzm=1g|t=|J8UPBn@J$>YTwTcj{1X~c-6e6c-gmoOz?)b!1n+2Lu|n37sI zYjuThn%TF|ZZms2_6+?;5A@Ieedi3k+`+y1F0FsBy~L#U3`On|2Mx7i%H(s?my+B& zWs*}ONJHfug<&5SBM%difFEe{6+XZ&$a5OQ+)srUh7rqwBBM0Ktx3&O)s>itd-CEf zS-a?T4y*HY@Mkn*9>(Gt9kgK^%t%2p_EJSwVj4p6SE|S7IF6lgVkxHLI3qrQ{dfXP zWrdl`#vF{pzo{M@}f7B{FQhf#({pvHeFAn&6M zJMlQy$_kUpMijcJASbaIrN~D#t}rulcABsRxyV5=WR;-wm5i4^>emHP%qkqZqbg|nO64SrSn_o3% zlie!!dYgPG_S%aHHMeMeP%U1wjtY0W9Em21mR_5r)oHCd(Q6wo4@~hLm^{U3G~PQ} zWuwT&(z8m(_~edSSQc&41Hh)y?3_LWv+1!=)lu#aJ?}&&8}k4u0+|< zy*_Fk%)$Tb!jq}g|3`HOv2o#9(UhlAQ;8iec|e>lHi&)p7;z&{7u|OOH4Y1NtE;Us zmAK40cf{gSe^1^OkUx7M^N!R}TFJ9_@FLb?IkJ#~WXLyx%e23QcJH|_vHmrlfeHCA zVl?j1=^32HL2Sippn2zD-ATL{S7*%TWPA2RxFcsgEpdaBZ+^EF^7yR5b*lQ@ba5U4;lrbCNQNYtZ{C9)D(7zclx zCl3!o=IchpA_hN@d<_ehc|pu@V*(z=(h$EV$McY3)NrN1DIbwtSd~OH;dVWe!(~ z^cmr*R55?XA4IP++g)6Gz+c2?#<&kv&c0W$Z*y`pBanep&Z?Kd_&Yjq46mR878GI$ z(jlJ?L(old{1MG)f_#-M#eBr0o47a!`TE#`dX!>0InF~Gc5*S~g4bPzl#mGT6 zegYN#MsUdLzXLC#5($XFC4xh~N^Zdh$biu!5h0L)vk!Z*Q3lS#Z204Af};a6aE{?^ zG@~9Hu^P)T6EmQ}O#($e1sd=?eu-tsgg>qmAg8b&+wlyFF%=mIt7GvcfzgfwcnW2h z3HjdH%We4w-h;eFO<2VKDd=MR1MINh?PsTkdgEqtfTzxEWftc#(=uH2-f;PnFp%};S6GE*codn? zBN3tKAsp`D0^~1`t#}%;*2JNQD3HG}4#5{D^Vyc=r8`8)QvSs4KLr^U@+ZbakRfr6 z0sRx5Xu)CZf(vr6zW0LJ!EV*ir-OKu1iLM1M}~T?XdhSPppm?y$=)kE!)P0^0P>Ax z4DK?*4!nYw@g$zW63FU15jPm=d9*0jFh*hY89qAa2TU_8toCxCTKU0gF7QMJ(NkAMjxaYpd q`DK;ZX|?fQ9XI|*A8|UP*7HmhzpERe^R)6l#rhtCy1o}_0_1;;to=R! diff --git a/pedometer_widget_home.py b/pedometer_widget_home.py index da1c33a..9fd5b8c 100644 --- a/pedometer_widget_home.py +++ b/pedometer_widget_home.py @@ -11,21 +11,29 @@ print "!!!!" PATH="/apps/pedometerhomewidget" COUNTER=PATH+"/counter" +TIMER=PATH+"/timer" MODE=PATH+"/mode" HEIGHT=PATH+"/height" class PedometerHomePlugin(hildondesktop.HomePluginItem): button = None - loader = None - labelTimer = None - labelLastCount = None - labelTotalCount = None - labelDistance = None - labelAvgDistance = None + + #labels for current steps + labelsC = { "timer" : None, "count" : None, "dist" : None, "avgSpeed" : None } + + #labels for all time steps + labelsT = { "timer" : None, "count" : None, "dist" : None, "avgSpeed" : None } pedometer = None startTime = None + totalCounter = 0 + totalTime = 0 + mode = 0 + height = 0 + + counter = 0 + time = 0 def __init__(self): @@ -35,43 +43,112 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.client = gconf.client_get_default() try: self.totalCounter = self.client.get_int(COUNTER) + self.totalTime = self.client.get_int(TIMER) self.mode = self.client.get_int(MODE) self.height = self.client.get_int(HEIGHT) except: self.client.set_int(COUNTER, 0) + self.client.set_int(TIMER, 0) self.client.set_int(MODE, 0) self.client.set_int(HEIGHT, 0) - self.totalCounter = 0 - self.mode = 0 - self.height = 0 + + self.pedometer = PedoCounter(self.update_values) + self.pedometer.set_mode(self.mode) + self.pedometer.set_height(self.height) self.button = gtk.Button("Start") self.button.connect("clicked", self.button_clicked) - self.labelTimer = gtk.Label("00:00:00") - self.labelLastCount = gtk.Label("--") - self.labelTotalCount = gtk.Label("%d steps" % self.totalCounter) - self.labelDistance = gtk.Label("--") + self.create_labels(self.labelsC) + self.create_labels(self.labelsT) + + self.update_ui_values(self.labelsC, 0, 0) + self.update_ui_values(self.labelsT, self.totalTime, self.totalCounter) + + mainHBox = gtk.HBox(spacing=1) + + descVBox = gtk.VBox(spacing=1) + descVBox.add(gtk.Label()) + descVBox.add(gtk.Label("Time:")) + descVBox.add(gtk.Label("Steps:")) + descVBox.add(gtk.Label("Distance:")) + descVBox.add(gtk.Label("Avg Speed:")) - mainVBox = gtk.VBox(spacing=1) - mainVBox.add(self.button) - mainVBox.add(self.labelTimer) - mainVBox.add(self.labelLastCount) - mainVBox.add(self.labelTotalCount) - mainVBox.add(self.labelDistance) + currentVBox = gtk.VBox(spacing=1) + currentVBox.add(gtk.Label("Current")) + currentVBox.add(self.labelsC["timer"]) + currentVBox.add(self.labelsC["count"]) + currentVBox.add(self.labelsC["dist"]) + currentVBox.add(self.labelsC["avgSpeed"]) - mainVBox.show_all() - self.add(mainVBox) + totalVBox = gtk.VBox(spacing=1) + totalVBox.add(gtk.Label("Total")) + totalVBox.add(self.labelsT["timer"]) + totalVBox.add(self.labelsT["count"]) + totalVBox.add(self.labelsT["dist"]) + totalVBox.add(self.labelsT["avgSpeed"]) + + mainHBox.add(self.button) + mainHBox.add(descVBox) + mainHBox.add(currentVBox) + mainHBox.add(totalVBox) + + mainHBox.show_all() + self.add(mainHBox) self.connect("unrealize", self.close_requested) self.set_settings(True) self.connect("show-settings", self.show_settings) + def create_labels(self, labels): + labels["timer"] = gtk.Label() + labels["count"] = gtk.Label() + labels["dist"] = gtk.Label() + labels["avgSpeed"] = gtk.Label() + + def update_ui_values(self, labels, timer, steps): + def get_str_distance(meters): + if meters > 1000: + return str(meters/1000) + " km" + else: + return str(meters) + " m" + + def get_avg_speed(timer, dist): + if timer == 0: + return "N/A km/h" + speed = 1.0 *dist / timer + #convert from meters per second to kilometers per hour + speed *= 3.6 + return "%.2f km/h" % speed + + tdelta = timer + hours = int(tdelta / 3600) + tdelta -= 3600 * hours + mins = int(tdelta / 60) + tdelta -= 60 * mins + secs = int(tdelta) + + strtime = "%.2d:%.2d:%.2d" % ( hours, mins, secs) + + labels["timer"].set_label(strtime) + labels["count"].set_label(str(steps)) + + dist = self.pedometer.get_distance(steps) + + labels["dist"].set_label(get_str_distance(dist)) + labels["avgSpeed"].set_label(get_avg_speed(timer, dist)) + + def update_current(self): + self.update_ui_values(self.labelsC, self.time, self.counter) + + def update_total(self): + self.update_ui_values(self.labelsT, self.totalTime, self.totalCounter) def show_settings(self, widget): def reset_total_counter(arg): widget.totalCounter = 0 - widget.labelTotalCount.set_label("%d steps" % widget.totalCounter) + widget.totalTime = 0 + widget.update_total() hildon.hildon_banner_show_information(self,"None", "Total counter was resetted") def selector_changed(selector, data): @@ -136,27 +213,15 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.pedometer.join() def update_values(self, totalCurent, lastInterval): - print "update" - self.totalCounter += lastInterval - dist = self.pedometer.get_distance(self.totalCounter) + self.counter = totalCurent - 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) + tdelta = time.time() - self.time - self.startTime + self.time += tdelta + self.totalTime += tdelta - 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") + self.update_current() + self.update_total() def button_clicked(self, button): print "button clicked" @@ -166,16 +231,17 @@ class PedometerHomePlugin(hildondesktop.HomePluginItem): self.pedometer.request_stop() self.pedometer.join() self.client.set_int(COUNTER, self.totalCounter) + self.client.set_int(COUNTER, int(self.totalTime)) 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.time = 0 + self.counter = 0 + + self.update_current() self.pedometer.start() self.startTime = time.time() @@ -194,8 +260,6 @@ if __name__ == "__main__": obj.show_all() gtk.main() - - ############### old pedometer.py ### import math import logging diff --git a/pedometer_widget_home.pyc b/pedometer_widget_home.pyc index 8ca03f47c9f92d7d9e70870ac351c43b311fdc45..fb6e5d731249fc01edef0c4ea86410c2990ea55d 100644 GIT binary patch delta 5317 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 delta 4047 zcmZWrYiwIt5kAL>oj8u;8z;8oq)D9S>dH-4sXx+MPc`1 z)l46&`-K^1+mx{SggqdvlxIj2cR~eEP4Y1+%*f`U28Bt-=;EWcZ)%6&;>mP}eouZv zxA|skl7jOr0`vkAI!}fo(PiVWJ-Y{`w&iJb?JvcePi#}M8;`5V56_DJ(cC5S*JH?2kBJD%;pbgimmKpUrm%~G+MIAY z$PH2Bgwt+y!^RE67#qfb3^o*YoV|iw0!OYd*d^+kz=kHdp=shJLLy!_?cNyJH0=>J z%-#X;nn8kye39HFMEBO+q?vL{j$w;!a@P}b@(H>73AtxeCX5l>DHI2=6-5&3k|%W7 z7T&slGX*K(4s0I}@%T>tEC2ZZM#|<%w_I_M?3tN^{O2Iolas6)HdBskRUEeod9P%1 zb}4U59SaP}L47cAPk$7!Yb`W(an*IpC9LH}9}|~yMLT!dGF?BZk7qAhMM8)WMQ{uD zidA*d5?DN*b=)K6)spK*HdG5`H(T^{;SJqU+i|m{oaMs%)6bTJ*W3o;vZkqj*)-P; z?|I0vipwqzwvx3=WOq$J8XUD$h%|llIY)^IUsxKxh-{EC`c2aR4*m_wpbYz>GG70p zG!`Y^*!uOgkVS_K%N%yZs@MyjIIpi4!Z&@!4L=$Q5@k}D(@7mM;^R+~0U`W0VVV3S zsQ7?x5~K00JdMx87E^XI@J!sTraqke%Cl5$F$M@@wVfna4;mu<)mJ0&lw%C zK~z;7B&vVcJ|w5fdPFCqo$_;fD!MeZ3q!HTEjvj}<1}hF$R7QJXreyxAJLdRrTrbp zrBADlcbd{WU=h%#J5^u;Y(hWiERzF$vA7)7`(m$MU^lP>XXDDn@-;OG%OR)`rz)iy zxH2urt(LE+5koZwG7T~VvKM5Qh>J6tcD7i~t1c*a>yh{~A-3c>`}E=FftEB49iz{g z*WZet)PIi`3^zz}#WKq)mTOhjxL!<52fS_cqt>SaYM91vt-qW2zN~Se7f5zniR3MJ z$=r@MmjKJl5dy0&;L8WGORfT>ydj#za8~_LF(BNkN|B%jh@{~TAJfHwT}Jq7)gsup z>JO5UAcqUv>Yugl(W}F0eW<%#enqS9T{S@d2z}09i4crF{XD9kSRpP2MLF$t0a8)J z6rxO*8#!P%qT~r>W`kI3@X#o!9x-*Zl?fI}<8{5}&6Yu`Adk^?OScoZnGo)5x<5AB zPMBrxsXX4sa)75r7}l&dSlzTajh1fb`kj$wS#p#G%}-lub(k+uX;XDOh&C;CjUb7^w3^raApy+8I^IJvTwd zj>^Drk%(7tV|sdGrq)gJ_vmwW5E0VvOHnuSQ{SPk)PUZTpl%hG5wGW-0pK})S(*Vh@1j@24t&;7!YxcZQjP=eA2{KAB=koEcjPPj&7C90muP`B?liAs)%5#2 zWAbH8G;qJ=vc=qzmQFgW8a2i+YrRBgJAzUE+E!8dbPA+j}W#TtS@Ar zOmh_!VX*?j2P4G(-2W~{GWv$8yk^@_4%>4 zW#9`i4rw`l&P(iFU?;#&fTy({e=WA@#5VssJR>R|aY&mJ|EBCOPM+{zBKeqpIC)pT zrRS%5V&_Qadd?Ngj#Y<(erYNxuW|t1n=<4X{imtt4CIor+aq~ ze-@EY2#wfQtXIbv_u{^t!q!_@xpHY)wL*znnLoVnyyAWvg>fecCy*GykL7~7R4K0J?b4Eay<(}Net&l4 z@DN5ZAFo|?3le%dJ(tKZ&o2|VfLoFzg}PuBy>O0`1@&dE_wO$U7&rxeZ~tNWG5z8G PZoe=2AmG=L1F8Q3z{2k> -- 1.7.9.5