summaryrefslogtreecommitdiff
path: root/digital/io-hub/tools/decode_fsm.py
blob: 41e9fe37c5edbe4ef245ed45c92e7a8796324d9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/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-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})')
    obstacle_re = re.compile(r'!o([0-9a-f]{4})([0-9a-f]{4})')
    for l in sys.stdin:
        for m in fsm_re.finditer(l):
            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)
        for m in obstacle_re.finditer(l):
            x, y = [ int(i, 16) for i in m.groups() ]
            print "obstacle %s %s" % (x, y)

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)