Source code for msgtransfer.logplayer

"""
Module **sesf.msgtransfer.logplayer** can play a log file generated by
msgtransfer.servicetester.
Run ``python logplayer.py <logfile> --sart <tester_art>``
"""

import matplotlib.pyplot as plt
from sesf.util.playerfwd import PlayerFwd
from matplotlib.animation import FuncAnimation
# import mpl_toolkits.axes_grid1
# from matplotlib.widgets import Button
import numpy as np
import time, pickle, argparse, importlib, sys

[docs]class Artbase(): def __init__(self): self.artists = {} self.fig = plt.figure('msgtransfer', figsize=(5,5)) self.ax = plt.subplot(polar=True) self.ax.axis('off') self.art_ended = False # def pltshow(self): # plt.show() def init_node_coords(self, n): """Return polar coordinates of nodes, placed uniformly in a circle.""" alpha = 2*np.pi/n # offset = alpha/2 offset = 0 theta = [(alpha*j + offset) for j in range(n)] return list(zip(theta, [0.3 for j in range(n)])) def init_artist(self, init_event, artmodule_name): if not artmodule_name: return False artmodule = importlib.import_module(artmodule_name) art = artmodule.Artist(self, init_event[2]) self.artists[event[0]] = art return True # def add_artist(self, name, obj): # self.artists[name] = obj def set_artevent(self, event): # print("Artbase.set_artevent called", event, flush=True) if self.art_ended: return if event == 'END': self.art_ended = True time.sleep(0.4) plt.close() return # not art_ended, not 'END' event if event[0] in self.artists: self.artists[event[0]].update_art(event) else: print("Unknown artist", flush=True)
######### end of class Artbase ################################# if __name__ == '__main__': p = argparse.ArgumentParser() p.add_argument("logfile", type=str, help='pickled eventlog file') p.add_argument("--sart", type=str, help='service artist module') p.add_argument("--cart", type=str, help='checker artist module') args = p.parse_args() # print('args:', args, flush=True) with open(args.logfile, 'rb') as infile: eventlog = pickle.load(infile) artbase = Artbase() srval = crval = False if eventlog[0][0:2] == ('service', 'init'): event = eventlog.pop(0) srval = artbase.init_artist(event, args.sart) if eventlog[0][0:2] == ('checker', 'init'): event = eventlog.pop(0) crval = artbase.init_artist(event, args.cart) if not (srval or crval): print('no artist; exiting', flush=True) sys.exit() def init_update(): artbase.set_artevent(eventlog[0]) def update(j): artbase.set_artevent(eventlog[j]) # ani = FuncAnimation(artb.fig, update, frames=len(eventlog), # init_func=init_update, repeat=False) ani = PlayerFwd(artbase.fig, update, maxj=len(eventlog)-1, init_func=init_update, repeat=False, interval=200) # uncomment to save as mp4: use with FuncAnimation, not PlayerFwd # ani.save('msgxfr.mp4') plt.show()