4 #from pedometer import *
6 class HelloWorldDialog(gtk.Dialog):
8 gtk.Dialog.__init__(self, "Hello World", None,
9 gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR,
10 ("Close", gtk.RESPONSE_OK))
11 self.vbox.add(gtk.Label("Hello World!"))
14 def hello_world_dialog_show(button):
15 dialog = HelloWorldDialog()
19 class PedometerHomePlugin(hildondesktop.HomePluginItem):
23 labelTotalCount = None
30 gtk.gdk.threads_init()
31 hildondesktop.HomePluginItem.__init__(self)
32 button = gtk.Button("Start")
33 button.connect("clicked", self.button_clicked)
35 self.labelLastCount = gtk.Label("--")
36 self.labelTotalCount = gtk.Label("--")
37 self.labelDistance = gtk.Label("--")
39 mainVBox = gtk.VBox(spacing=1)
41 mainVBox.add(self.labelLastCount)
42 mainVBox.add(self.labelTotalCount)
43 mainVBox.add(self.labelDistance)
48 self.pedometer = PedoCounter(self.update_values)
50 def update_values(self, total, lastInterval):
54 dist = self.pedometer.get_distance()
56 self.labelLastCount.set_label(str(lastInterval))
57 self.labelTotalCount.set_label(str(total))
58 self.labelDistance.set_label(str(dist))
60 def button_clicked(self, button):
61 print "button clicked"
62 self.labelLastCount.set_label("updating")
63 self.labelTotalCount.set_label("updating")
64 self.labelDistance.set_label("updating")
66 self.pedometer.start()
67 print "button clicked finished"
70 hd_plugin_type = PedometerHomePlugin
73 # The code below is just for testing purposes.
74 # It allows to run the widget as a standalone process.
75 if __name__ == "__main__":
77 gobject.type_register(hd_plugin_type)
78 obj = gobject.new(hd_plugin_type, plugin_id="plugin_id")
84 ############### old pedometer.py ###
90 from threading import Thread
92 logger = logging.getLogger("pedometer")
93 logger.setLevel(logging.INFO)
95 ch = logging.StreamHandler()
96 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
97 ch.setFormatter(formatter)
101 class PedoIntervalCounter:
109 #TODO: check if last detected step is at the end of the interval
111 def __init__(self, coords, tval):
117 def calc_mean(self, vals):
122 return sum / len(vals)
125 def calc_stdev(self, vals):
127 mean = self.calc_mean(vals)
129 rez+=pow(abs(mean-i),2)
130 return math.sqrt(rez/len(vals))
132 def calc_threshold(self, vals):
135 mean = self.calc_mean(vals)
136 threshold = max (abs(mean-vmax), abs(mean-vmin))
139 def count_steps(self, vals, t):
140 threshold = self.MIN_THRESHOLD
141 mean = self.calc_mean(vals)
146 if abs(vals[i] - mean) > threshold:
149 while i < len(vals) and t[i] < ntime:
154 def get_best_values(self, x, y, z):
155 dev1 = self.calc_stdev(x)
156 dev2 = self.calc_stdev(y)
157 dev3 = self.calc_stdev(z)
158 dev_max = max(dev1, dev2, dev3)
160 if ( abs(dev1 - dev_max ) < 0.001):
161 logger.info("X chosen as best axis, stdev %f" % dev1)
163 elif (abs(dev2 - dev_max) < 0.001):
164 logger.info("Y chosen as best axis, stdev %f" % dev2)
167 logger.info("Z chosen as best axis, stdev %f" % dev3)
170 def number_steps(self):
171 vals = self.get_best_values(self.x, self.y, self.z)
172 return self.count_steps(vals, self.t)
174 class PedoCounter(Thread):
175 COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
176 COORD_GET_INTERVAL = 0.01
181 update_function = None
183 def __init__(self, update_function = None):
184 Thread.__init__(self)
185 self.update_function = update_function
187 def get_rotation(self):
188 f = open(self.COORD_FNAME, 'r')
189 coords = [int(w) for w in f.readline().split()]
193 def reset_counter(self):
196 def get_counter(self):
199 def start_interval(self):
200 logger.info("New interval started")
203 coords = [[], [], []]
204 while len(t) == 0 or t[-1] < 5:
205 x,y,z = self.get_rotation()
206 coords[0].append(int(x))
207 coords[1].append(int(y))
208 coords[2].append(int(z))
209 now = time.time()-stime
211 time.sleep(self.COORD_GET_INTERVAL)
212 pic = PedoIntervalCounter(coords, t)
213 cnt = pic.number_steps()
215 logger.info("Number of steps detected for last interval %d, number of coords: %d" % (cnt, len(t)))
218 logger.info("Total number of steps : %d" % self.counter)
223 last_cnt = self.start_interval()
224 if self.update_function is not None:
225 gobject.idle_add(self.update_function, self.counter, last_cnt)
227 def get_distance(self, steps=None):
230 return self.STEP_LENGTH * steps;