# HG changeset patch # User Jim Unroe rock.unroe@gmail.com # Date 1479507921 18000 # Node ID 09f726c48ffde792ab267a822e23dcf854fe9906 # Parent cb8d0bab7c18aff9cd59d1e4393019bb7f5b754b [NC-630A] Driver Cleanup
The main purpose of this patch is a general cleanup of the kyd.py driver. Some things were tweaked to more closely match how the "factory" software behaves during the cloning process. Also, code was also added to be more selective in detecting KYD NC-630A images.
Except for adding an alias for the Plant-Tours MT-700, this patch does not add any new features and does not make any changes that will be apparent to the CHIRP user.
Related to #4235
diff -r cb8d0bab7c18 -r 09f726c48ffd chirp/drivers/kyd.py --- a/chirp/drivers/kyd.py Wed Nov 16 20:23:27 2016 -0800 +++ b/chirp/drivers/kyd.py Fri Nov 18 17:25:21 2016 -0500 @@ -63,7 +63,6 @@ """
CMD_ACK = "\x06" -BLOCK_SIZE = 0x08
NC630A_POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00), chirp_common.PowerLevel("High", watts=5.00)] @@ -91,8 +90,6 @@ serial = radio.pipe
try: - serial.write("\x02") - time.sleep(0.1) serial.write("PROGRAM") ack = serial.read(1) except: @@ -109,7 +106,7 @@ except: raise errors.RadioError("Error communicating with radio")
- if not ident.startswith("P32073"): + if not ident.startswith(radio._fileid): LOG.debug(util.hexprint(ident)) raise errors.RadioError("Radio returned unknown identification string")
@@ -123,24 +120,16 @@ raise errors.RadioError("Radio refused to enter programming mode")
-def _nc630a_exit_programming_mode(radio): - serial = radio.pipe - try: - serial.write("E") - except: - raise errors.RadioError("Radio refused to exit programming mode") - - def _nc630a_read_block(radio, block_addr, block_size): serial = radio.pipe
- cmd = struct.pack(">cHb", 'R', block_addr, BLOCK_SIZE) + cmd = struct.pack(">cHb", 'R', block_addr, block_size) expectedresponse = "W" + cmd[1:] LOG.debug("Reading block %04x..." % (block_addr))
try: serial.write(cmd) - response = serial.read(4 + BLOCK_SIZE) + response = serial.read(4 + block_size) if response[:4] != expectedresponse: raise Exception("Error reading block %04x." % (block_addr))
@@ -160,8 +149,8 @@ def _nc630a_write_block(radio, block_addr, block_size): serial = radio.pipe
- cmd = struct.pack(">cHb", 'W', block_addr, BLOCK_SIZE) - data = radio.get_mmap()[block_addr:block_addr + 8] + cmd = struct.pack(">cHb", 'W', block_addr, block_size) + data = radio.get_mmap()[block_addr:block_addr + block_size]
LOG.debug("Writing Data:") LOG.debug(util.hexprint(cmd + data)) @@ -187,18 +176,16 @@ status.cur = 0 status.max = radio._memsize
- for addr in range(0, radio._memsize, BLOCK_SIZE): - status.cur = addr + BLOCK_SIZE + for addr in range(0, radio._memsize, radio._block_size): + status.cur = addr + radio._block_size radio.status_fn(status)
- block = _nc630a_read_block(radio, addr, BLOCK_SIZE) + block = _nc630a_read_block(radio, addr, radio._block_size) data += block
LOG.debug("Address: %04x" % addr) LOG.debug(util.hexprint(block))
- _nc630a_exit_programming_mode(radio) - return memmap.MemoryMap(data)
@@ -212,25 +199,30 @@ status.max = radio._memsize
for start_addr, end_addr in radio._ranges: - for addr in range(start_addr, end_addr, BLOCK_SIZE): - status.cur = addr + BLOCK_SIZE + for addr in range(start_addr, end_addr, radio._block_size): + status.cur = addr + radio._block_size radio.status_fn(status) - _nc630a_write_block(radio, addr, BLOCK_SIZE) + _nc630a_write_block(radio, addr, radio._block_size)
- _nc630a_exit_programming_mode(radio)
+class MT700Alias(chirp_common.Alias): + VENDOR = "Plant-Tours" + MODEL = "MT-700"
@directory.register class NC630aRadio(chirp_common.CloneModeRadio): """KYD NC-630A""" VENDOR = "KYD" MODEL = "NC-630A" + ALIASES = [MT700Alias] BAUD_RATE = 9600
_ranges = [ - (0x0000, 0x0338), + (0x0000, 0x0330), ] - _memsize = 0x0338 + _memsize = 0x03C8 + _block_size = 0x08 + _fileid = "P32073"
def get_features(self): rf = chirp_common.RadioFeatures() @@ -403,9 +395,11 @@ _skp = self._memobj.skipflags[bytepos]
if mem.empty: - _mem.set_raw("\xFF" * (_mem.size() / 8)) + _mem.set_raw("\xFF" * 16) return
+ _mem.set_raw("\x00" * 14 + "\xFF" * 2) + _mem.rxfreq = mem.freq / 10
if mem.duplex == "off": @@ -504,3 +498,20 @@ except Exception, e: LOG.debug(element.get_name()) raise + + @classmethod + def match_model(cls, filedata, filename): + match_size = match_model = False + + # testing the file data size + if len(filedata) in [0x338, 0x3C8]: + match_size = True + + # testing model fingerprint + if filedata[0x01B8:0x01BE] == cls._fileid: + match_model = True + + if match_size and match_model: + return True + else: + return False