aboutsummaryrefslogtreecommitdiffstats
path: root/ldr_to_ipr.py
blob: dbbd911652510daa44b01d41cbd98eae693db3f6 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/python3

from lark import Lark, Transformer, Token, Tree
import sys

from format_ldr import ScriptFormatLDR
from format_ipr import ScriptFormatIPR

def split_hex(value):
    """ split a string of hex digits into groups (bytes) of two digits. """
    return ' '.join(value[i:i+2] for i in range(0, len(value), 2))

def expand_cmd(cmd):
    ret = ""
    for e in cmd:
        if e[0] == 'hexstr':
            ret += e[1]
        else:
            raise ValueError("Unsupported '%s'" % (e[0]))
    return ret


def ldr_stmt_to_ipr(s):
    """ translate a single LDR statement to IPR format. """
    if s == None:
        None
    elif s == 'reset':
        print("RESET")
        print("")
    elif s[0] == 'rem':
        print("//\t%s" % s[1])
    elif s[0] == 'cmd':
        cmd = s[1]
        req = cmd['req']
        rsp = cmd['rsp']
        print("I: %s" % split_hex(expand_cmd([req])))
        if rsp != None and len(rsp) != 1:
            if rsp[0] != 'swmatch' or len(rsp[1]) != 1:
                raise ValueError("Unsupported '%s'" % (rsp))
            print("O: %s" % rsp[1][0])
        else:
            print("O:")
        print("")
    else:
        print("Unknown %s" % (s.pretty()))
        raise ValueError()


test_text = '''
RST
CMD     E0 CA DF 1F 13
CMD E0 CA DF 1F (90 00)
CMD E0 CA DF 1F (61 XX, 90 00)
REM foo bar
CMD     E4 DA DF 20 09 EA 53 F8 D7 64 1E D9 88 00 \\
        (90 00 , 6B 00)
'''


def run_statement(s):
    print(s)

def fii(s):
    if s.data == 'rst':
        print("=> RESET")
        # FIXME: actually perform card reset
    elif s.data == 'rem':
        print(s)
    elif s.data == 'cmd':
        #print(s)
        cmd = s.children[0]
        print(s.pretty())
        # FIXME: if swmatch: match all contained swpattern
    else:
        print("Unknown %s" % (s.pretty()))
        raise ValueError()


#process_ldr(test_text, run_statement)
#process_ldr(test_text, ldr_stmt_to_ipr)

fmt = ScriptFormatLDR()
fmt.parse_process_file(sys.argv[1], ldr_stmt_to_ipr)
#fmt.parse_process_file(sys.argv[1], run_statement)