6 from threading import Thread
8 logger = logging.getLogger("pedometer")
9 logger.setLevel(logging.INFO)
11 ch = logging.StreamHandler()
12 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
13 ch.setFormatter(formatter)
17 class PedoIntervalCounter:
25 #TODO: check if last detected step is at the end of the interval
27 def __init__(self, coords, tval):
33 def calc_mean(self, vals):
38 return sum / len(vals)
41 def calc_stdev(self, vals):
43 mean = self.calc_mean(vals)
45 rez+=pow(abs(mean-i),2)
46 return math.sqrt(rez/len(vals))
48 def calc_threshold(self, vals):
51 mean = self.calc_mean(vals)
52 threshold = max (abs(mean-vmax), abs(mean-vmin))
55 def count_steps(self, vals, t):
56 threshold = self.MIN_THRESHOLD
57 mean = self.calc_mean(vals)
62 if abs(vals[i] - mean) > threshold:
65 while i < len(vals) and t[i] < ntime:
70 def get_best_values(self, x, y, z):
71 dev1 = self.calc_stdev(x)
72 dev2 = self.calc_stdev(y)
73 dev3 = self.calc_stdev(z)
74 dev_max = max(dev1, dev2, dev3)
76 if ( abs(dev1 - dev_max ) < 0.001):
77 logger.info("X chosen as best axis, stdev %f" % dev1)
79 elif (abs(dev2 - dev_max) < 0.001):
80 logger.info("Y chosen as best axis, stdev %f" % dev2)
83 logger.info("Z chosen as best axis, stdev %f" % dev3)
86 def number_steps(self):
87 vals = self.get_best_values(self.x, self.y, self.z)
88 return self.count_steps(vals, self.t)
90 class PedoCounter(Thread):
91 COORD_FNAME = "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
92 COORD_GET_INTERVAL = 0.01
97 update_function = None
99 def __init__(self, update_function = None):
100 Thread.__init__(self)
101 self.update_function = update_function
103 def get_rotation(self):
104 f = open(self.COORD_FNAME, 'r')
105 coords = [int(w) for w in f.readline().split()]
109 def reset_counter(self):
112 def get_counter(self):
115 def start_interval(self):
116 logger.info("New interval started")
119 coords = [[], [], []]
120 while len(t) == 0 or t[-1] < 5:
121 x,y,z = self.get_rotation()
122 coords[0].append(int(x))
123 coords[1].append(int(y))
124 coords[2].append(int(z))
125 now = time.time()-stime
127 time.sleep(self.COORD_GET_INTERVAL)
128 pic = PedoIntervalCounter(coords, t)
129 cnt = pic.number_steps()
131 logger.info("Number of steps detected for last interval %d, number of coords: %d" % (cnt, len(t)))
134 logger.info("Total number of steps : %d" % self.counter)
139 last_cnt = self.start_interval()
140 if self.update_function is not None:
141 gobject.idle_add(self.update_function, self.counter, last_cnt)
143 def get_distance(self, steps=None):
146 return self.STEP_LENGTH * steps;
151 if __name__ == "__main__":