[chirp_devel] [PATCH] [ft4] retry if errors on serial port [#6623]

# HG changeset patch # User DanClemmensen DanClemmensen@gmail.com # Date 1553022344 25200 # Tue Mar 19 12:05:44 2019 -0700 # Node ID 21c550448ce827b6f11df3ed218ec499613eec50 # Parent 7a03f1cb10bd11b4dbd37d23eb6a6ff1db785ed8 [ft4] retry if errors on serial port [#6623] Fixes: #6623 (NOTE: tested the clone-mode retries. Did not test the checksum retries, but it cannot be any worse than is was without them. download and upload still work just fine.)
diff -r 7a03f1cb10bd -r 21c550448ce8 chirp/drivers/ft4.py --- a/chirp/drivers/ft4.py Tue Mar 19 10:54:33 2019 -0700 +++ b/chirp/drivers/ft4.py Tue Mar 19 12:05:44 2019 -0700 @@ -261,7 +261,7 @@ msg = "Bad echo. Sent:" + util.hexprint(cmd) + ", " msg += "Received:" + util.hexprint(echo) LOG.debug(msg) - raise errors.RadioError("Incorrect echo on serial port.") + raise errors.RadioError("Incorrect echo on serial port. Bad cable?") if response_len is None: return variable_len_resp(pipe) if response_len > 0: @@ -275,6 +275,23 @@ return response
+def enter_clonemode(radio): + """ + Send the PROGRAM command and check the response. Retry if + needed. After 3 tries, send an "END" and try some more if + it is acknowledged. + """ + for use_end in range(0, 3): + for i in range(0, 3): + try: + if b"QX" == sendcmd(radio.pipe, b"PROGRAM", 2): + return + except: + continue + sendcmd(radio.pipe, b"END", 0) + raise errors.RadioError("expected QX from radio.") + + def startcomms(radio, way): """ For either upload or download, put the radio into PROGRAM mode @@ -287,8 +304,7 @@ progressbar = chirp_common.Status() progressbar.msg = "Cloning " + way + " radio" progressbar.max = radio.numblocks - if b"QX" != sendcmd(radio.pipe, b"PROGRAM", 2): - raise errors.RadioError("expected QX from radio.") + enter_clonemode(radio) id_response = sendcmd(radio.pipe, b'\x02', None) if id_response != radio.id_str: substr0 = radio.id_str[:radio.id_str.find('\x00')] @@ -309,6 +325,7 @@ read a single 16-byte block from the radio. send the command and check the response places the response into the correct offset in the supplied bytearray + returns True if successful, False if error. """ cmd = struct.pack(">cHb", b"R", addr, 16) response = sendcmd(pipe, cmd, 21) @@ -316,11 +333,12 @@ msg = "Bad response. Sent:" + util.hexprint(cmd) + ", " msg += b"Received:" + util.hexprint(response) LOG.debug(msg) - raise errors.RadioError("Incorrect response to read.") + return False if checkSum8(response[1:20]) != bytearray(response)[20]: LOG.debug(b"Bad checksum: " + util.hexprint(response)) - raise errors.RadioError("bad block checksum on read from radio.") + return False image[addr:addr+16] = response[4:20] + return True
def do_download(radio): @@ -334,9 +352,14 @@ image = bytearray(radio.get_memsize()) pipe = radio.pipe # Get the serial port connection progressbar = startcomms(radio, "from") - for _i in range(radio.numblocks): - getblock(pipe, 16 * _i, image) - progressbar.cur = _i + for blocknum in range(radio.numblocks): + for i in range(0, 3): + if getblock(pipe, 16 * blocknum, image): + break + if i == 2: + raise errors.RadioError( + "read block from radio failed 3 times") + progressbar.cur = blocknum radio.status_fn(progressbar) sendcmd(pipe, b"END", 0) return memmap.MemoryMap(bytes(image)) @@ -614,10 +637,8 @@ )
rp.pre_download = "".join([ - "1. Turn radio off.\n", - "2. Connect cable to MIC jack.\n", - "3. Turn radio on.\n", - "4. Press OK within 3 seconds" + "1. Connect programming cable to MIC jack.\n", + "2. Press OK." ] ) rp.pre_upload = rp.pre_download
participants (1)
-
DanClemmensen