Bug fix: state returned by each handle* func now
The variable state is not a global function.
So its value needs to be returned from each function
which might alter the state.
For now only two states exist: WAIT_RST, WAIT_CMD
FIXME: Probably there is a more elegant way to do that
diff --git a/usb_application/phone.py b/usb_application/phone.py
index e4d5ccd..5e0df9b 100755
--- a/usb_application/phone.py
+++ b/usb_application/phone.py
@@ -61,54 +61,75 @@
print(ep_out)
return (ep_in, ep_out)
-def handle_phone_request():
+WAIT_RST = 0
+WAIT_CMD = 1
+
+def handle_wait_rst(dev):
# ATR handling
- try:
- arr = dev.read(0x83, 64, 100) # Notification endpoint
- print("arr: ", arr)
- c=arr.pop()
- print(c)
+ arr = dev.read(0x83, 64, 1000) # Notification endpoint
+ print("arr: ", arr)
+ c=arr.pop()
+ print(c)
- if c == ord('R'):
- try:
- written = dev.write(0x1, atr, 1000) # Probably we received a Reset, so we send ATR
- print("Written data: " + written)
- except:
- print("Timeout sending ATR!")
- return
+ if c == ord('R'):
+ # We received a Reset, so we send ATR
+ written = dev.write(0x1, atr, 1000)
+ print("Written data: ")
+ print(written)
+ state = WAIT_CMD;
+ return state
- except:
- #print("Timeout receiving atr!")
- pass
-
+def handle_wait_cmd(dev):
# Read phone request
- try:
- cmd = dev.read(0x82, 64, 10000000)
- print("Received request!: ")
- print("".join("%02x " % b for b in ans))
+ print("Wait cmd")
+ cmd = dev.read(0x82, 64, 1000)
+ print("Received request!: ")
+ print("".join("%02x " % b for b in cmd))
- print("Write response");
- try:
- written = dev.write(0x01, RESP_OK, 10000000);
- print("Bytes written:")
- print(written)
- except:
- print("Timeout in send response")
-
- except:
- #print("Timeout in receive cmd")
- pass
+ send_response(dev, cmd);
+ return WAIT_CMD
+handle_msg_funcs = { WAIT_RST: handle_wait_rst,
+ WAIT_CMD: handle_wait_cmd }
+
+def handle_phone_request(dev, state):
+ state = handle_msg_funcs[state](dev)
+ return state
+
+INS = 1
+
+def send_response(dev, cmd):
+ print("Write response");
+
+# FIXME: We could get data of length 5 as well! Implement another distinct criteria!
+ if len(cmd) == 5: # Received cmd from phone
+ if cmd[INS] == 0xA4:
+ resp = [cmd[INS]] # Respond with INS byte
+ print("Cmd: ")
+ print(cmd)
+ elif cmd[INS] == 0xC0:
+ SW = [0x90, 0x00]
+ resp = [cmd[INS], 0xA, 0xA, SW] # Respond with INS byte
+ print("Cmd, resp: ")
+ print(cmd)
+ print(resp)
+
+ else:
+ # FIXME:
+ resp = [0x9F, 0x02]
+
+ print(resp)
+ written = dev.write(0x01, resp, 10000);
+ print("Bytes written:")
+ print(written)
def emulate_sim():
dev = find_dev()
+ state = WAIT_RST;
while True:
try:
- handle_phone_request()
+ state = handle_phone_request(dev, state)
- except KeyboardInterrupt:
- print("Bye")
- sys.exit()
- except:
- print("Timeout")
+ except usb.USBError as e:
+ print e