# HG changeset patch # User Marco Filippi iz3gme.marco@gmail.com # Date 1350041787 -7200 # Node ID 63bbc321282481d29d6358c7d4e1c201fdce6be9 # Parent 3ca36590a615c07365bf994fb6a4ea64b22e1365 Correct some errors introduced when sources have been separated also reduce pylint output relates to changes for feature #285
diff --git a/chirp/baofeng_uv3r.py b/chirp/baofeng_uv3r.py --- a/chirp/baofeng_uv3r.py +++ b/chirp/baofeng_uv3r.py @@ -13,12 +13,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
-import struct +"""Baofeng UV3r radio management module""" + import time import os -from chirp import util, chirp_common, bitwise, memmap, errors, directory -from chirp.settings import RadioSetting, RadioSettingGroup, \ - RadioSettingValueBoolean, RadioSettingValueList +from chirp import util, chirp_common, bitwise, errors, directory +from chirp.wouxun_common import do_download, do_upload
if os.getenv("CHIRP_DEBUG"): DEBUG = True diff --git a/chirp/puxing.py b/chirp/puxing.py --- a/chirp/puxing.py +++ b/chirp/puxing.py @@ -13,12 +13,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
-import struct +"""Puxing radios management module""" + import time import os -from chirp import util, chirp_common, bitwise, memmap, errors, directory -from chirp.settings import RadioSetting, RadioSettingGroup, \ - RadioSettingValueBoolean, RadioSettingValueList +from chirp import util, chirp_common, bitwise, errors, directory +from chirp.wouxun_common import wipe_memory, do_download, do_upload
if os.getenv("CHIRP_DEBUG"): DEBUG = True diff --git a/chirp/th_uv3r.py b/chirp/th_uv3r.py --- a/chirp/th_uv3r.py +++ b/chirp/th_uv3r.py @@ -13,12 +13,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
-import struct -import time +"""TYT uv3r radio management module""" + import os -from chirp import util, chirp_common, bitwise, memmap, errors, directory -from chirp.settings import RadioSetting, RadioSettingGroup, \ - RadioSettingValueBoolean, RadioSettingValueList +from chirp import chirp_common, bitwise, errors, directory +from chirp.wouxun_common import do_download, do_upload
if os.getenv("CHIRP_DEBUG"): DEBUG = True @@ -207,7 +206,7 @@
mult = _mem.is625 and 6250 or 5000 mem.freq = _mem.freq * mult - mem.offset = _mem.offset * 5000; + mem.offset = _mem.offset * 5000 mem.duplex = THUV3R_DUPLEX[_mem.duplex] mem.mode = _mem.iswide and "FM" or "NFM" self._decode_tone(mem, _mem) diff --git a/chirp/wouxun.py b/chirp/wouxun.py --- a/chirp/wouxun.py +++ b/chirp/wouxun.py @@ -13,22 +13,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
-import struct +"""Wouxun radios management module""" + import time import os from chirp import util, chirp_common, bitwise, memmap, errors, directory from chirp.settings import RadioSetting, RadioSettingGroup, \ RadioSettingValueBoolean, RadioSettingValueList, \ RadioSettingValueInteger +from chirp.wouxun_common import wipe_memory, do_download, do_upload
-if os.getenv("CHIRP_DEBUG"): - DEBUG = True -else: - DEBUG = False - -def wipe_memory(_mem, byte): - _mem.set_raw(byte * (_mem.size() / 8)) - FREQ_ENCODE_TABLE = [ 0x7, 0xa, 0x0, 0x9, 0xb, 0x2, 0xe, 0x1, 0x3, 0xf ]
# writing bad frequency ranges on the radio can brick it @@ -36,6 +30,7 @@ # it has been included for documentation purpouse only as I never call it # you have been warned, use at your own risk def encode_freq(freq): + """Convert frequency (4 decimal digits) to wouxun format (2 bytes)""" enc = 0 div = 1000 for i in range(0, 4): @@ -45,6 +40,7 @@ return enc
def decode_freq(data): + """Convert from wouxun format (2 bytes) to frequency (4 decimal digits)""" freq = 0 shift = 12 for i in range(0, 4): @@ -127,7 +123,8 @@ time.sleep(1) continue if resp[2:8] != self._model: - raise Exception("I can't talk to this model (%s)" % util.hexprint(resp)) + raise Exception("I can't talk to this model (%s)" % + util.hexprint(resp)) return if len(resp) == 0: raise Exception("Radio not responding") @@ -141,65 +138,12 @@ ack = self.pipe.read(1) if ack != "\x06": raise Exception("Radio refused transfer mode") - - def _do_download(self, start, end, blocksize): - """Initiate a download of @radio between @start and @end""" - image = "" - for i in range(start, end, blocksize): - cmd = struct.pack(">cHb", "R", i, blocksize) - if DEBUG: - print util.hexprint(cmd) - self.pipe.write(cmd) - length = len(cmd) + blocksize - resp = self.pipe.read(length) - if len(resp) != (len(cmd) + blocksize): - print util.hexprint(resp) - raise Exception("Failed to read full block (%i!=%i)" % \ - (len(resp), - len(cmd) + blocksize)) - - self.pipe.write("\x06") - self.pipe.read(1) - image += resp[4:] - - if self.status_fn: - status = chirp_common.Status() - status.cur = i - status.max = end - status.msg = "Cloning from radio" - self.status_fn(status) - - return memmap.MemoryMap(image) - - def _do_upload(self, start, end, blocksize): - """Initiate an upload of @radio between @start and @end""" - ptr = start - for i in range(start, end, blocksize): - cmd = struct.pack(">cHb", "W", i, blocksize) - chunk = self.get_mmap()[ptr:ptr+blocksize] - ptr += blocksize - self.pipe.write(cmd + chunk) - if DEBUG: - print util.hexprint(cmd + chunk) - - ack = self.pipe.read(1) - if not ack == "\x06": - raise Exception("Radio did not ack block %i" % ptr) - #radio.pipe.write(ack) - - if self.status_fn: - status = chirp_common.Status() - status.cur = i - status.max = end - status.msg = "Cloning to radio" - self.status_fn(status) - def _download(self): """Talk to an original wouxun and do a download""" try: self._identify() self._start_transfer() - return self._do_download(0x0000, 0x2000, 0x0040) + return do_download(self, 0x0000, 0x2000, 0x0040) except errors.RadioError: raise except Exception, e: @@ -210,7 +154,7 @@ try: self._identify() self._start_transfer() - return self._do_upload(0x0000, 0x2000, 0x0010) + return do_upload(self, 0x0000, 0x2000, 0x0010) except errors.RadioError: raise except Exception, e: @@ -271,47 +215,57 @@ top = RadioSettingGroup("top", "All Settings", freqranges)
rs = RadioSetting("menu_available", "Menu Available", - RadioSettingValueBoolean(self._memobj.settings.menu_available)) + RadioSettingValueBoolean( + self._memobj.settings.menu_available)) top.append(rs)
rs = RadioSetting("vhf_rx_start", "vhf rx start", RadioSettingValueInteger(136, 174, - decode_freq(self._memobj.freq_ranges.vhf_rx_start))) + decode_freq( + self._memobj.freq_ranges.vhf_rx_start))) freqranges.append(rs) rs = RadioSetting("vhf_rx_stop", "vhf rx stop", RadioSettingValueInteger(136, 174, - decode_freq(self._memobj.freq_ranges.vhf_rx_stop))) + decode_freq( + self._memobj.freq_ranges.vhf_rx_stop))) freqranges.append(rs) rs = RadioSetting("uhf_rx_start", "uhf rx start", RadioSettingValueInteger(216, 520, - decode_freq(self._memobj.freq_ranges.uhf_rx_start))) + decode_freq( + self._memobj.freq_ranges.uhf_rx_start))) freqranges.append(rs) rs = RadioSetting("uhf_rx_stop", "uhf rx stop", RadioSettingValueInteger(216, 520, - decode_freq(self._memobj.freq_ranges.uhf_rx_stop))) + decode_freq( + self._memobj.freq_ranges.uhf_rx_stop))) freqranges.append(rs) rs = RadioSetting("vhf_tx_start", "vhf tx start", RadioSettingValueInteger(136, 174, - decode_freq(self._memobj.freq_ranges.vhf_tx_start))) + decode_freq( + self._memobj.freq_ranges.vhf_tx_start))) freqranges.append(rs) rs = RadioSetting("vhf_tx_stop", "vhf tx stop", RadioSettingValueInteger(136, 174, - decode_freq(self._memobj.freq_ranges.vhf_tx_stop))) + decode_freq( + self._memobj.freq_ranges.vhf_tx_stop))) freqranges.append(rs) rs = RadioSetting("uhf_tx_start", "uhf tx start", RadioSettingValueInteger(216, 520, - decode_freq(self._memobj.freq_ranges.uhf_tx_start))) + decode_freq( + self._memobj.freq_ranges.uhf_tx_start))) freqranges.append(rs) rs = RadioSetting("uhf_tx_stop", "uhf tx stop", RadioSettingValueInteger(216, 520, - decode_freq(self._memobj.freq_ranges.uhf_tx_stop))) + decode_freq( + self._memobj.freq_ranges.uhf_tx_stop))) freqranges.append(rs)
# tell the decoded ranges to UI - self.valid_freq = [(decode_freq(self._memobj.freq_ranges.vhf_rx_start) * 1000000, - (decode_freq(self._memobj.freq_ranges.vhf_rx_stop) + 1) * 1000000), - (decode_freq(self._memobj.freq_ranges.uhf_rx_start) * 1000000, - (decode_freq(self._memobj.freq_ranges.uhf_rx_stop) + 1) * 1000000)] + self.valid_freq = [ + ( decode_freq(self._memobj.freq_ranges.vhf_rx_start) * 1000000, + (decode_freq(self._memobj.freq_ranges.vhf_rx_stop)+1) * 1000000), + ( decode_freq(self._memobj.freq_ranges.uhf_rx_start) * 1000000, + (decode_freq(self._memobj.freq_ranges.uhf_rx_stop)+1) * 1000000)]
return top
@@ -323,7 +277,9 @@ self.set_settings(element) continue try: - setattr(self._memobj.settings, element.get_name(), element.value) + setattr(self._memobj.settings, + element.get_name(), + element.value) except Exception, e: print element.get_name() raise @@ -372,7 +328,7 @@ if mem.tmode == "DTCS": mem.dtcs_polarity = "%s%s" % (tpol, rpol)
- if DEBUG: + if os.getenv("CHIRP_DEBUG"): print "Got TX %s (%i) RX %s (%i)" % (txmode, _mem.tx_tone, rxmode, _mem.rx_tone)
@@ -442,7 +398,8 @@
if tx_mode == "DTCS": _mem.tx_tone = mem.tmode != "DTCS" and \ - _set_dcs(mem.dtcs, mem.dtcs_polarity[0]) or _set_dcs(mem.rx_dtcs, mem.dtcs_polarity[0]) + _set_dcs(mem.dtcs, mem.dtcs_polarity[0]) or \ + _set_dcs(mem.rx_dtcs, mem.dtcs_polarity[0]) elif tx_mode: _mem.tx_tone = tx_mode == "Tone" and \ int(mem.rtone * 10) or int(mem.ctone * 10) @@ -456,7 +413,7 @@ else: _mem.rx_tone = 0xFFFF
- if DEBUG: + if os.getenv("CHIRP_DEBUG"): print "Set TX %s (%i) RX %s (%i)" % (tx_mode, _mem.tx_tone, rx_mode, _mem.rx_tone)
@@ -506,7 +463,8 @@ # New-style image (CHIRP 0.1.12) if len(filedata) == 8192 and \ filedata[0x60:0x64] != "2009" and \ - filedata[0x1f77:0x1f7d] == "\xff\xff\xff\xff\xff\xff": # that area is (seems to be) unused + filedata[0x1f77:0x1f7d] == "\xff\xff\xff\xff\xff\xff": + # that area is (seems to be) unused return True # Old-style image (CHIRP 0.1.11) if len(filedata) == 8200 and \ @@ -516,6 +474,7 @@
@directory.register class KGUV6DRadio(KGUVD1PRadio): + """Wouxun KG-UV6 (D and X variants)""" MODEL = "KG-UV6"
_querymodel = "HiWXUVD1\x02" @@ -592,17 +551,17 @@ options = ["Off", "Welcome", "V bat"] rs = RadioSetting("ponmsg", "PONMSG", RadioSettingValueList(options, - options[self._memobj.settings.ponmsg])) + options[self._memobj.settings.ponmsg])) top.append(rs) options = ["Off", "Chinese", "English"] rs = RadioSetting("voice", "Voice", RadioSettingValueList(options, - options[self._memobj.settings.voice])) + options[self._memobj.settings.voice])) top.append(rs) options = ["CH A", "CH B"] rs = RadioSetting("sos_ch", "SOS CH", RadioSettingValueList(options, - options[self._memobj.settings.sos_ch])) + options[self._memobj.settings.sos_ch])) top.append(rs)
return top diff --git a/chirp/wouxun_common.py b/chirp/wouxun_common.py new file mode 100644 --- /dev/null +++ b/chirp/wouxun_common.py @@ -0,0 +1,79 @@ +# +# Copyright 2012 Filippi Marco iz3gme.marco@gmail.com +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. + +"""vcommon function for wouxun (or similar) radios""" + +import struct +import os +from chirp import util, chirp_common, memmap + +def wipe_memory(_mem, byte): + """Cleanup a memory""" + _mem.set_raw(byte * (_mem.size() / 8)) + +def do_download(radio, start, end, blocksize): + """Initiate a download of @radio between @start and @end""" + image = "" + for i in range(start, end, blocksize): + cmd = struct.pack(">cHb", "R", i, blocksize) + if os.getenv("CHIRP_DEBUG"): + print util.hexprint(cmd) + radio.pipe.write(cmd) + length = len(cmd) + blocksize + resp = radio.pipe.read(length) + if len(resp) != (len(cmd) + blocksize): + print util.hexprint(resp) + raise Exception("Failed to read full block (%i!=%i)" % \ + (len(resp), + len(cmd) + blocksize)) + + radio.pipe.write("\x06") + radio.pipe.read(1) + image += resp[4:] + + if radio.status_fn: + status = chirp_common.Status() + status.cur = i + status.max = end + status.msg = "Cloning from radio" + radio.status_fn(status) + + return memmap.MemoryMap(image) + +def do_upload(radio, start, end, blocksize): + """Initiate an upload of @radio between @start and @end""" + ptr = start + for i in range(start, end, blocksize): + cmd = struct.pack(">cHb", "W", i, blocksize) + chunk = radio.get_mmap()[ptr:ptr+blocksize] + ptr += blocksize + radio.pipe.write(cmd + chunk) + if os.getenv("CHIRP_DEBUG"): + print util.hexprint(cmd + chunk) + + ack = radio.pipe.read(1) + if not ack == "\x06": + raise Exception("Radio did not ack block %i" % ptr) + #radio.pipe.write(ack) + + if radio.status_fn: + status = chirp_common.Status() + status.cur = i + status.max = end + status.msg = "Cloning to radio" + radio.status_fn(status) + +