wire: use memoryview() asap in the parsing process

pull/25/head
Jan Pochyla 8 years ago
parent 67ac47f087
commit 688d293b01

@ -76,8 +76,10 @@ Receives report payloads.
Sends (msg_type, data_len) to target, followed by data chunks. Sends (msg_type, data_len) to target, followed by data chunks.
Throws EOFError after last data chunk, in case of valid checksum. Throws EOFError after last data chunk, in case of valid checksum.
Throws MessageChecksumError to target if data doesn't match the checksum. Throws MessageChecksumError to target if data doesn't match the checksum.
Pass report payloads as `memoryview` for cheaper slicing.
''' '''
message = memoryview((yield)) # read first report message = yield # read first report
msg_type, data_len, data_tail = parse_message(message) msg_type, data_len, data_tail = parse_message(message)
target = genfunc(msg_type, data_len, session_id, *args) target = genfunc(msg_type, data_len, session_id, *args)
@ -95,7 +97,7 @@ Throws MessageChecksumError to target if data doesn't match the checksum.
checksum = ubinascii.crc32(data_chunk, checksum) checksum = ubinascii.crc32(data_chunk, checksum)
if data_len > 0: if data_len > 0:
data_tail = memoryview((yield)) # read next report data_tail = yield # read next report
msg_footer = data_tail[:_MSG_FOOTER_LEN] msg_footer = data_tail[:_MSG_FOOTER_LEN]
if len(msg_footer) < _MSG_FOOTER_LEN: if len(msg_footer) < _MSG_FOOTER_LEN:

@ -40,6 +40,8 @@ Receives report payloads.
Sends (msg_type, data_len) to target, followed by data chunks. Sends (msg_type, data_len) to target, followed by data chunks.
Throws EOFError after last data chunk, in case of valid checksum. Throws EOFError after last data chunk, in case of valid checksum.
Throws MessageChecksumError to target if data doesn't match the checksum. Throws MessageChecksumError to target if data doesn't match the checksum.
Pass report payloads as `memoryview` for cheaper slicing.
''' '''
message = yield # read first report message = yield # read first report

@ -1,4 +1,4 @@
import ubinascii from ubinascii import hexlify
from micropython import const from micropython import const
from trezor import msg, loop, log from trezor import msg, loop, log
@ -8,12 +8,12 @@ _DEFAULT_IFACE = const(0xFF00) # TODO: use proper interface
def read_report_stream(target, iface=_DEFAULT_IFACE): def read_report_stream(target, iface=_DEFAULT_IFACE):
while True: while True:
report, = yield loop.Select(iface) report, = yield loop.Select(iface)
log.debug(__name__, 'read report %s', ubinascii.hexlify(report)) log.debug(__name__, 'read report %s', hexlify(report))
target.send(report) target.send(memoryview(report))
def write_report_stream(iface=_DEFAULT_IFACE): def write_report_stream(iface=_DEFAULT_IFACE):
while True: while True:
report = yield report = yield
log.debug(__name__, 'write report %s', ubinascii.hexlify(report)) log.debug(__name__, 'write report %s', hexlify(report))
msg.send(iface, report) msg.send(iface, report)

Loading…
Cancel
Save