def play(fname, node, tstart, rt_rate, fixed_rate, filter_names=()): p = CHIL.Player(fname) try: tstart_float = float(tstart) p.setCursor(datetime.datetime(year=datetime.MINYEAR, month=1, day=1)) tzero = p.timeOfNextMessage() p.setCursor(tzero + datetime.timedelta(seconds=tstart_float)) except: p.setCursor(datetime.datetime.strptime(tstart, Strptime_Fmt)) if rt_rate is not None: assert(fixed_rate is None) tstart_playback = relativeTime() try: while True: m, td = p.nextMessage() if m is None: break if isinstance(m, str): warning(m) m = None if len(filter_names) and m.__class__.__name__ not in filter_names: continue time_to_sleep_for = tdToFloatSeconds(td) - rt_rate * (relativeTime() - tstart_playback) if time_to_sleep_for/rt_rate > 10: warning('more than 10 seconds until next message will be sent (%gs)' % (time_to_sleep_for/rt_rate)) while time_to_sleep_for > 0: sleep_step = min((time_to_sleep_for/rt_rate, 0.2)) time_to_sleep_for -= sleep_step*rt_rate time.sleep(sleep_step) sys.stdout.write('.'); sys.stdout.flush() if m is not None: if Sonar_Timestamp_Munge and isinstance(m, msg.SonarImageMessage): unix_time = time.mktime(p.cursor().timetuple()) + p.cursor().microsecond/1e6 # for some reason the message seems to be immutable... m = msg.SonarImageMessage( m.source, msg.PolarImage( m.image.data, m.image.encoding, m.image.bearing_bins, m.image.rangeStart, m.image.rangeEnd, m.image.rangeConversion, msg.TimeStamp(int(unix_time), int(1e6*(unix_time-int(unix_time)))) ) ) node.send(m) except Exception, e: error('error in playback: ' + str(e)) raise debug('playback finished')
p_LocalNodeOutput.setParseAction(lambda x: messaging.LocalNodeOutput(*x[0])) p_NodeInputArc << pp.Group(l \ + p_str + c \ + p_NodeOutput \ + r) p_NodeInputArc.setParseAction(lambda x: messaging.NodeInputArc(*x[0])) p_NodeOutputArc << pp.Group(l \ + p_NodeInput + c \ + p_str \ + r) p_NodeOutputArc.setParseAction(lambda x: messaging.NodeOutputArc(*x[0])) p_TimeStamp << pp.Group(l \ + p_int + c \ + p_int \ + r) p_TimeStamp.setParseAction(lambda x: messaging.TimeStamp(*x[0])) p_SonarDataLine << pp.Group(l \ + p_byteVec + c \ + p_int + c \ + p_int + c \ + p_int + c \ + p_int \ + r) p_SonarDataLine.setParseAction(lambda x: messaging.SonarDataLine(*x[0])) p_PolarImage << pp.Group(l \ + p_byteVec + c \ + p_ImageEncodingType + c \ + p_int32Vec + c \ + p_float + c \ + p_float + c \ + p_float + c \
time.sleep(time_to_sleep_for) sys.stdout.write('.'); sys.stdout.flush() if m is not None: if Sonar_Timestamp_Munge and isinstance(m, msg.SonarImageMessage): unix_time = time.mktime(p.cursor().timetuple()) + p.cursor().microsecond/1e6 # !!! TODO: for some reason the message seems to be immutable... m = msg.SonarImageMessage( m.source, msg.PolarImage( m.image.data, m.image.encoding, m.image.bearing_bins, m.image.rangeStart, m.image.rangeEnd, m.image.rangeConversion, msg.TimeStamp(int(unix_time), int(1e6*(unix_time-int(unix_time)))) ) ) node.send(m) tlast = relativeTime() except Exception, e: error('error in playback: ' + str(e)) raise debug('playback finished') if __name__ == '__main__': p = argparse.ArgumentParser(description='play a CHIL log file') p.add_argument('file', metavar='FILE', type=str) p.add_argument('-s', '--start', dest='start_t', default="0", help='start time: offset seconds or absolute %s' % Strptime_Fmt.replace('%','%%'))