From 5b15a3661fd83866aa0b1d11e97da88d6f45fb17 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Tue, 8 May 2012 23:45:30 +0200 Subject: digital/io-hub/tools: add script to decode FSM traces --- digital/io-hub/tools/decode_fsm.py | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 digital/io-hub/tools/decode_fsm.py (limited to 'digital/io-hub/tools') diff --git a/digital/io-hub/tools/decode_fsm.py b/digital/io-hub/tools/decode_fsm.py new file mode 100644 index 00000000..ef8e57d8 --- /dev/null +++ b/digital/io-hub/tools/decode_fsm.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +"""This script will read FSM header file and proto output and decode to human +readable transitions.""" +import re +import sys +import optparse + +def parse_header(fsm_name, fname): + """Parse header file and return a dict of states and a dict of events.""" + r = dict(state = { }, event = { }) + state_re = re.compile(r'^\s*FSM_(STATE)_%s_(.*) = (\d+),$' % fsm_name) + event_re = re.compile(r'^\s*FSM_(EVENT)_%s_(.*) = (\d+),$' % fsm_name) + with open(fname) as f: + for l in f: + m = state_re.match(l) or event_re.match(l) + if m: + t, name, value = m.groups() + t = t.lower() + value = int(value) + r[t][value] = name + return r['state'], r['event'] + +def parse_proto(states, events): + """Parse proto output from stdin and output FSM transitions.""" + fsm_re = re.compile(r'^!F([0-9af]{2})([0-9af]{2})([0-9af]{2})$') + for l in sys.stdin: + m = fsm_re.match(l) + if m: + old, event, new = [ int(i, 16) for i in m.groups() ] + try: + old = states[old] + event = events[event] + new = states[new] + except 1: + print "unknown transition" + else: + print "%s -> %s -> %s" % (old, event, new) + +op = optparse.OptionParser(description=__doc__) +op.add_option('--file', '-f', metavar='HEADER', + help="give path to generated header file (default: %default)", + default='fsm_AI_gen.h') +op.add_option('--fsm-name', '-n', metavar='NAME', + help="FSM name (default: %default)", + default='AI') +options, args = op.parse_args() +if args: + op.error("too many arguments") + +states, events = parse_header(options.fsm_name, options.file) +parse_proto(states, events) -- cgit v1.2.3