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()