mirror of https://gerrit.osmocom.org/pysim
85 lines
2.0 KiB
Python
Executable File
85 lines
2.0 KiB
Python
Executable File
#!/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)
|