# HG changeset patch # User Zachary T Welch zach@mandolincreekfarm.com # Fake Node ID a5082b8f73767bc7d39b51a452c0930ff780fb54
Fix style issues in icf.py (#2355)
diff --git a/chirp/drivers/icf.py b/chirp/drivers/icf.py index dad20ca..06e7b2b 100644 --- a/chirp/drivers/icf.py +++ b/chirp/drivers/icf.py @@ -22,12 +22,13 @@ from chirp.settings import RadioSetting, RadioSettingGroup, \ RadioSettingValueBoolean, RadioSettings
CMD_CLONE_OUT = 0xE2 -CMD_CLONE_IN = 0xE3 +CMD_CLONE_IN = 0xE3 CMD_CLONE_DAT = 0xE4 -CMD_CLONE_END = 0xE5 +CMD_CLONE_END = 0xE5
SAVE_PIPE = None
+ class IcfFrame: """A single ICF communication frame""" src = 0 @@ -37,15 +38,15 @@ class IcfFrame: payload = ""
def __str__(self): - addrs = { 0xEE : "PC", - 0xEF : "Radio"} - cmds = {0xE0 : "ID", - 0xE1 : "Model", - 0xE2 : "Clone out", - 0xE3 : "Clone in", - 0xE4 : "Clone data", - 0xE5 : "Clone end", - 0xE6 : "Clone result"} + addrs = {0xEE: "PC", + 0xEF: "Radio"} + cmds = {0xE0: "ID", + 0xE1: "Model", + 0xE2: "Clone out", + 0xE3: "Clone in", + 0xE4: "Clone data", + 0xE5: "Clone end", + 0xE6: "Clone result"}
return "%s -> %s [%s]:\n%s" % (addrs[self.src], addrs[self.dst], cmds[self.cmd], @@ -54,6 +55,7 @@ class IcfFrame: def __init__(self): pass
+ def parse_frame_generic(data): """Parse an ICF frame of unknown type from the beginning of @data""" frame = IcfFrame() @@ -71,6 +73,7 @@ def parse_frame_generic(data):
return frame, data[end+1:]
+ class RadioStream: """A class to make reading a stream of IcfFrames easier""" def __init__(self, pipe): @@ -81,7 +84,7 @@ class RadioStream: if not self.data.startswith("\xFE\xFE"): raise errors.InvalidDataError("Out of sync with radio") elif len(self.data) < 5: - return [] # Not enough data for a full frame + return [] # Not enough data for a full frame
frames = []
@@ -89,7 +92,7 @@ class RadioStream: try: cmd = ord(self.data[4]) except IndexError: - break # Out of data + break # Out of data
try: frame, rest = parse_frame_generic(self.data) @@ -118,19 +121,20 @@ class RadioStream: self.data += _data
if not nolimit and len(self.data) > 128 and "\xFD" in self.data: - break # Give us a chance to do some status + break # Give us a chance to do some status if len(self.data) > 1024: - break # Avoid an endless loop of chewing garbage + break # Avoid an endless loop of chewing garbage
if not self.data: return []
return self._process_frames()
+ def get_model_data(pipe, mdata="\x00\x00\x00\x00"): """Query the radio connected to @pipe for its model data""" send_clone_frame(pipe, 0xe0, mdata, raw=True) - + stream = RadioStream(pipe) frames = stream.get_frames()
@@ -139,6 +143,7 @@ def get_model_data(pipe, mdata="\x00\x00\x00\x00"):
return frames[0].payload
+ def get_clone_resp(pipe, length=None): """Read the response to a clone frame""" def exit_criteria(buf, length): @@ -155,6 +160,7 @@ def get_clone_resp(pipe, length=None):
return resp
+ def send_clone_frame(pipe, cmd, data, raw=False, checksum=False): """Send a clone frame with @cmd and @data to the radio attached to @pipe""" @@ -181,17 +187,18 @@ def send_clone_frame(pipe, cmd, data, raw=False, checksum=False): print "Saving data..." SAVE_PIPE.write(frame)
- #print "Sending:\n%s" % util.hexprint(frame) - #print "Sending:\n%s" % util.hexprint(hed[6:]) + # print "Sending:\n%s" % util.hexprint(frame) + # print "Sending:\n%s" % util.hexprint(hed[6:]) if cmd == 0xe4: # Uncomment to avoid cloning to the radio # return frame pass - + pipe.write(frame)
return frame
+ def process_bcd(bcddata): """Convert BCD-encoded data to raw""" data = "" @@ -207,6 +214,7 @@ def process_bcd(bcddata):
return data
+ def process_data_frame(frame, _mmap): """Process a data frame, adding the payload to @_mmap""" _data = process_bcd(frame.payload) @@ -226,6 +234,7 @@ def process_data_frame(frame, _mmap): (bytes, saddr, len(_mmap)) return saddr, saddr + length
+ def start_hispeed_clone(radio, cmd): """Send the magic incantation to the radio to go fast""" buf = ("\xFE" * 20) + \ @@ -250,6 +259,7 @@ def start_hispeed_clone(radio, cmd): radio.pipe.write(buf) radio.pipe.flush()
+ def _clone_from_radio(radio): md = get_model_data(radio.pipe)
@@ -261,7 +271,8 @@ def _clone_from_radio(radio): if radio.is_hispeed(): start_hispeed_clone(radio, CMD_CLONE_OUT) else: - send_clone_frame(radio.pipe, CMD_CLONE_OUT, radio.get_model(), raw=True) + send_clone_frame(radio.pipe, CMD_CLONE_OUT, + radio.get_model(), raw=True)
print "Sent clone frame"
@@ -300,6 +311,7 @@ def _clone_from_radio(radio):
return _mmap
+ def clone_from_radio(radio): """Do a full clone out of the radio's memory""" try: @@ -307,6 +319,7 @@ def clone_from_radio(radio): except Exception, e: raise errors.RadioError("Failed to communicate with the radio: %s" % e)
+ def send_mem_chunk(radio, start, stop, bs=32): """Send a single chunk of the radio's memory from @start-@stop""" _mmap = radio.get_mmap() @@ -338,6 +351,7 @@ def send_mem_chunk(radio, start, stop, bs=32):
return True
+ def _clone_to_radio(radio): global SAVE_PIPE
@@ -387,6 +401,7 @@ def _clone_to_radio(radio):
return result.payload[0] == '\x00'
+ def clone_to_radio(radio): """Initiate a full memory clone out to @radio""" try: @@ -394,6 +409,7 @@ def clone_to_radio(radio): except Exception, e: raise errors.RadioError("Failed to communicate with the radio: %s" % e)
+ def convert_model(mod_str): """Convert an ICF-style model string into what we get from the radio""" data = "" @@ -404,6 +420,7 @@ def convert_model(mod_str):
return data
+ def convert_data_line(line): """Convert an ICF data line to raw memory format""" if line.startswith("#"): @@ -433,13 +450,14 @@ def convert_data_line(line):
return _mmap
+ def read_file(filename): """Read an ICF file and return the model string and memory data""" f = file(filename)
mod_str = f.readline() dat = f.readlines() - + model = convert_model(mod_str.strip())
_mmap = "" @@ -449,6 +467,7 @@ def read_file(filename):
return model, memmap.MemoryMap(_mmap)
+ def is_9x_icf(filename): """Returns True if @filename is an IC9x ICF file""" f = file(filename) @@ -457,6 +476,7 @@ def is_9x_icf(filename):
return mdata in ["30660000", "28880000"]
+ def is_icf_file(filename): """Returns True if @filename is an ICF file""" f = file(filename) @@ -468,18 +488,21 @@ def is_icf_file(filename):
return bool(re.match("^[0-9]{8}#", data))
+ class IcomBank(chirp_common.Bank): """A bank that works for all Icom radios""" # Integral index of the bank (not to be confused with per-memory # bank indexes index = 0
+ class IcomNamedBank(IcomBank): """A bank with an adjustable name""" def set_name(self, name): """Set the name of the bank""" pass
+ class IcomBankModel(chirp_common.BankModel): """Icom radios all have pretty much the same simple bank model. This central implementation can, with a few icom-specific radio interfaces @@ -490,7 +513,7 @@ class IcomBankModel(chirp_common.BankModel):
def get_mappings(self): banks = [] - + for i in range(0, self._radio._num_banks): index = chr(ord("A") + i) bank = self._radio._bank_class(self, index, "BANK-%s" % index) @@ -503,8 +526,8 @@ class IcomBankModel(chirp_common.BankModel):
def remove_memory_from_mapping(self, memory, bank): if self._radio._get_bank(memory.number) != bank.index: - raise Exception("Memory %i not in bank %s. Cannot remove." % \ - (memory.number, bank)) + raise Exception("Memory %i not in bank %s. Cannot remove." % + (memory.number, bank))
self._radio._set_bank(memory.number, None)
@@ -521,7 +544,8 @@ class IcomBankModel(chirp_common.BankModel): return [] else: return [self.get_mappings()[index]] - + + class IcomIndexedBankModel(IcomBankModel, chirp_common.MappingModelIndexInterface): """Generic bank model for Icom radios with indexed banks""" @@ -545,13 +569,13 @@ class IcomIndexedBankModel(IcomBankModel, for i in range(*self._radio.get_features().memory_bounds): if self._radio._get_bank(i) == bank.index: indexes.append(self._radio._get_bank_index(i)) - + for i in range(0, 256): if i not in indexes: return i
raise errors.RadioError("Out of slots in this bank") - +
class IcomCloneModeRadio(chirp_common.CloneModeRadio): """Base class for Icom clone-mode radios""" @@ -619,6 +643,7 @@ class IcomCloneModeRadio(chirp_common.CloneModeRadio): def set_settings(self, settings): return honor_speed_switch_setting(self, settings)
+ class IcomLiveRadio(chirp_common.LiveRadio): """Base class for an Icom Live-mode radio""" VENDOR = "Icom" @@ -638,6 +663,7 @@ class IcomLiveRadio(chirp_common.LiveRadio): else: return None
+ def make_speed_switch_setting(radio): if not radio.__class__._can_hispeed: return {} @@ -648,6 +674,7 @@ def make_speed_switch_setting(radio): drvopts.append(rs) return top
+ def honor_speed_switch_setting(radio, settings): for element in settings: if element.get_name() == "drvopts": diff --git a/tools/cpep8.blacklist b/tools/cpep8.blacklist index f88f718..2e913b8 100644 --- a/tools/cpep8.blacklist +++ b/tools/cpep8.blacklist @@ -1,7 +1,6 @@ # cpep8.blacklist: The list of files that do not meet PEP8 standards. # DO NOT ADD NEW FILES!! Instead, fix the code to be compliant. # Over time, this list should shrink and (eventually) be eliminated. -./chirp/drivers/icf.py ./chirp/drivers/icq7.py ./chirp/drivers/ict70.py ./chirp/drivers/ict8.py