def __init__(self, gpsiface, **opts): super(OdoIface, self).__init__(**opts) self.gps = gpsiface self.odofile = open(opts['--odo-file'], 'r+') self.overall = float(self.odofile.readline()) # Seek to the end of file self.odofile.seek(0, 2) self.current = 0 self.step = 0 self.avg_start = None self.avg_speed = AvgValue() self.gps.add_hook('gotclock', self.set_avg_start) self.gps.add_hook('onupdate', self.on_gpsupdate)
class OdoIface(HilgaObject): """Odometer Save odometer data to file. First line in odo file is: OVERALL_METERS so first line is 20 chars length not including \n. Following lines are entries in form: TIMESTAMP METERS\n """ def __init__(self, gpsiface, **opts): super(OdoIface, self).__init__(**opts) self.gps = gpsiface self.odofile = open(opts['--odo-file'], 'r+') self.overall = float(self.odofile.readline()) # Seek to the end of file self.odofile.seek(0, 2) self.current = 0 self.step = 0 self.avg_start = None self.avg_speed = AvgValue() self.gps.add_hook('gotclock', self.set_avg_start) self.gps.add_hook('onupdate', self.on_gpsupdate) def set_avg_start(self, seconds): self.avg_start = seconds def odo_increase(self, meters): """Increase odometer values.""" self.overall += meters self.current += meters self.step += meters if meters > 0: self.run_hook('onincrease', meters) def update_odofile(self): self.odofile.write('{} {}\n'.format(int(time.time()), self.step)) # Prepare to move again self.step = 0 self.avg_speed.reset() self.avg_start = time.time() # Update overall self.odofile.seek(0, 0) self.odofile.write('%20s\n' % self.overall) self.odofile.seek(0, 2) self.run_hook('odoflush') def avg_time_delta(self): if self.avg_start is None: return 0 return time.time() - self.avg_start def on_gpsupdate(self, gps): # in meters per sec gspeed = 10.0 / 36 * self.gps.speed_kmh() avgspeed = self.avg_speed.avg_with(gspeed) delta = avgspeed * self.avg_time_delta() - self.step self.odo_increase(delta) # Write updates only when car stops, but less then every 100 meters # Also write when step > 10k if (int(gspeed) == 0 and self.step > 100) or (self.step > 10000): self.update_odofile()
class OdoIface(HilgaObject): """Odometer Save odometer data to file. First line in odo file is: OVERALL_METERS so first line is 20 chars length not including \n. Following lines are entries in form: TIMESTAMP METERS\n """ def __init__(self, gpsiface, **opts): super(OdoIface, self).__init__(**opts) self.gps = gpsiface self.odofile = open(opts['--odo-file'], 'r+') self.overall = float(self.odofile.readline()) # Seek to the end of file self.odofile.seek(0, 2) self.current = 0 self.step = 0 self.avg_start = None self.avg_speed = AvgValue() self.gps.add_hook('gotclock', self.set_avg_start) self.gps.add_hook('onupdate', self.on_gpsupdate) def set_avg_start(self, seconds): self.avg_start = seconds def odo_increase(self, meters): """Increase odometer values.""" self.overall += meters self.current += meters self.step += meters if meters > 0: self.run_hook('onincrease', meters) def update_odofile(self): self.odofile.write('{} {}\n'.format(int(time.time()), self.step)) # Prepare to move again self.step = 0 self.avg_speed.reset() self.avg_start = time.time() # Update overall self.odofile.seek(0, 0) self.odofile.write('%20s\n'%self.overall) self.odofile.seek(0, 2) self.run_hook('odoflush') def avg_time_delta(self): if self.avg_start is None: return 0 return time.time() - self.avg_start def on_gpsupdate(self, gps): # in meters per sec gspeed = 10.0/36 * self.gps.speed_kmh() avgspeed = self.avg_speed.avg_with(gspeed) delta = avgspeed * self.avg_time_delta() - self.step self.odo_increase(delta) # Write updates only when car stops, but less then every 100 meters # Also write when step > 10k if (int(gspeed) == 0 and self.step > 100) or (self.step > 10000): self.update_odofile()