[chirp_devel] [PATCH 1 of 1] [KG-UV6D/X] Initial support
Marco Filippi IZ3GME
Sat May 26 07:18:25 PDT 2012
# HG changeset patch
# User Marco Filippi <iz3gme.marco at gmail.com>
# Date 1338041503 -7200
# Node ID 683fcbd9ed1f7dc879364618eb49eaa9fd8df61a
# Parent 3f840fd7177985446b33fe14d1e002c9d8de2dd6
[KG-UV6D/X] Initial support
implements feature #53
diff --git a/chirp/wouxun.py b/chirp/wouxun.py
--- a/chirp/wouxun.py
+++ b/chirp/wouxun.py
@@ -25,6 +25,11 @@
DEBUG = False
WOUXUN_MEM_FORMAT = """
+struct settings {
+ u8 unknown_flag1:7,
+ menu_available:1;
+};
+
#seekto 0x0010;
struct {
lbcd rx_freq[4];
@@ -40,37 +45,46 @@
iswide:1,
_2_unknown_2:4;
u8 unknown[2];
-} memory[128];
+} memory[199];
#seekto 0x0E5C;
-u8 unknown_flag1:7,
- menu_available:1;
+struct settings v1settings;
+
+#seekto 0x0F5C;
+struct settings v6settings;
#seekto 0x1008;
struct {
u8 unknown[8];
u8 name[6];
u8 pad[2];
-} names[128];
+} names[199];
"""
-def wouxun_identify(radio):
+def _wouxun_identify(radio, string):
"""Do the original wouxun identification dance"""
for _i in range(0, 5):
- radio.pipe.write("HiWOUXUN\x02")
+ radio.pipe.write(string)
resp = radio.pipe.read(9)
if len(resp) != 9:
+ print "Got:\n%s" % util.hexprint(r)
print "Retrying identification..."
time.sleep(1)
continue
if resp[2:8] != radio._model:
- raise Exception("I can't talk to this model")
+ raise Exception("I can't talk to this model (%s)" % util.hexprint(resp))
return
if len(resp) == 0:
raise Exception("Radio not responding")
else:
raise Exception("Unable to identify radio")
+def wouxun_identify(radio):
+ return _wouxun_identify(radio, "HiWOUXUN\x02")
+
+def wouxun6_identify(radio):
+ return _wouxun_identify(radio, "HiWXUVD1\x02")
+
def wouxun_start_transfer(radio):
"""Tell the radio to go into transfer mode"""
radio.pipe.write("\x02\x06")
@@ -153,6 +167,28 @@
except Exception, e:
raise errors.RadioError("Failed to communicate with radio: %s" % e)
+def wouxun6_download(radio):
+ """Talk to an original wouxun and do a download"""
+ try:
+ wouxun6_identify(radio)
+ wouxun_start_transfer(radio)
+ return do_download(radio, 0x0000, 0x2000, 0x0040)
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ raise errors.RadioError("Failed to communicate with radio: %s" % e)
+
+def wouxun6_upload(radio):
+ """Talk to an original wouxun and do an upload"""
+ try:
+ wouxun6_identify(radio)
+ wouxun_start_transfer(radio)
+ return do_upload(radio, 0x0000, 0x2000, 0x0010)
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ raise errors.RadioError("Failed to communicate with radio: %s" % e)
+
CHARSET = list("0123456789") + [chr(x + ord("A")) for x in range(0, 26)] + \
list("?+ ")
@@ -212,7 +248,7 @@
group = RadioSettingGroup("top", "All Settings")
rs = RadioSetting("menu_available", "Menu Available",
- RadioSettingValueBoolean(self._memobj.menu_available))
+ RadioSettingValueBoolean(self._memobj.v1settings.menu_available))
group.append(rs)
return group
@@ -223,7 +259,7 @@
self.set_settings(element)
continue
try:
- setattr(self._memobj, element.get_name(), element.value)
+ setattr(self._memobj.v1settings, element.get_name(), element.value)
except Exception, e:
print element.get_name()
raise
@@ -397,7 +433,11 @@
@classmethod
def match_model(cls, filedata, filename):
# New-style image (CHIRP 0.1.12)
- if len(filedata) == 8192 and filedata[0x60:0x64] != "2009":
+ if len(filedata) == 8192 and \
+ filedata[0x60:0x64] != "2009" and \
+ filedata[0xf00:0xf05] != "KGUV6":
+ # TODO Must find an == test to avoid
+ # collision with future supported radios
return True
# Old-style image (CHIRP 0.1.11)
if len(filedata) == 8200 and \
@@ -405,6 +445,67 @@
return True
return False
+ at directory.register
+class KGUV6DRadio(KGUVD1PRadio):
+ MODEL = "KG-UV6D"
+
+ def get_features(self):
+ rf = KGUVD1PRadio.get_features(self)
+ rf.valid_bands = [(136000000, 175000000), (350000000, 471000000)]
+ rf.memory_bounds = (1, 199)
+ return rf
+
+ def get_settings(self):
+ group = RadioSettingGroup("top", "All Settings")
+
+ rs = RadioSetting("menu_available", "Menu Available",
+ RadioSettingValueBoolean(self._memobj.v6settings.menu_available))
+ group.append(rs)
+
+ return group
+
+ def set_settings(self, settings):
+ for element in settings:
+ if not isinstance(element, RadioSetting):
+ self.set_settings(element)
+ continue
+ try:
+ setattr(self._memobj.v6settings, element.get_name(), element.value)
+ except Exception, e:
+ print element.get_name()
+ raise
+
+ def sync_in(self):
+ self._mmap = wouxun6_download(self)
+ self.process_mmap()
+
+ def sync_out(self):
+ wouxun6_upload(self)
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ if len(filedata) == 8192 and \
+ filedata[0xf00:0xf06] == "KGUV6D":
+ return True
+ return False
+
+ at directory.register
+class KGUV6XRadio(KGUV6DRadio):
+ MODEL = "KG-UV6X"
+
+ def get_features(self):
+ rf = KGUV6DRadio.get_features(self)
+ rf.valid_bands = [(136000000, 175000000), (370000000, 513000000)]
+ return rf
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ if len(filedata) == 8192 and \
+ filedata[0xf00:0xf06] == "KGUV6X":
+ return True
+ return False
+
+
def _puxing_prep(radio):
radio.pipe.write("\x02PROGRA")
ack = radio.pipe.read(1)
diff --git a/tests/images/Wouxun_KG-UV6D.img b/tests/images/Wouxun_KG-UV6D.img
new file mode 100644
index 0000000000000000000000000000000000000000..b1a779514010bab1e083c307f9fb264345c8135f
GIT binary patch
literal 8192
zc%1FoJ4?e*6bJBgo7Up1i^UFgDoD33qC*#jv^c0#2W=-iyG5d26Wit+NFRu_LO_~Y
zK}!%sozzLcKo>Wi+=OV0Zt<oy(CVOzL*e{RAo=Iy0ohKjX?6pMdjXcbrg_f6wv`DF
z;Nx3a05B0k2qA<JLI|NAG&j4vG8KtO=lR$|`?!0=1t%dKi~wQ95Y7o45SJBL2OMB+
ztyU*?HM`e+Z#AuXI^LeAKkRv$@OJ)9v6wCGx0JF)N~xyldbxbaly!||X-oGM&O*;m
z{?Undmg{e<jJlCDlFek3QiX0_-iYH`)g#J^tV*&f`=#KH&))yfS49XRgb+dqA%uF%
zN%g3fNhz{GCAv;m!$10z%53bG_b8t>s7T!dLMp9XiBd*jr^AW^pbt8h%?S`Iw|_YN
z;r)e!((sTgpI6nKr7-A#+UaqnqJ7!u&s|?U`o<<-XOg?OcWW=xtQvtvAj&EcO2i_z
M#mIvc6u&?J6O<3^)c^nh
diff --git a/tests/images/Wouxun_KG-UV6X.img b/tests/images/Wouxun_KG-UV6X.img
new file mode 100644
index 0000000000000000000000000000000000000000..48bff422a837670b4630548e263ab208272a8afe
GIT binary patch
literal 8192
zc%1FnO-lkn7zgm#H{VJ_7rO`*LI;UDC<GdGF)^q}f;0%abrTY$hMm&wBSaBefgr63
zMlJ<Wu!oL)4il<V)XAgGib`vTx)#rGd1mLoGdpvhX|;?{EaBEm?>A}1T>gk&-3$N#
z00000008_&3(?j1^xFJpGP#Au+K^$KMP`OW9AfCh(uU*pAkZ$$Gqgd-j1a@@BLg~-
z{%d+fY-}ar)=OUty&BKcdj5&UBJe{T<7mSem&=NxsOovCRI8O}mUdLf(e>0z-7_3$
z(j4%MGh(n2tb3-OybX+HynXkO8CNO}nGjNxNRfCXSGuadcX7Jfzu)Mf&F%h at NBS}V
z000000002+A6-^1u5vb+q_9L}yb<~~jxnLfZgPyn*$<q-W?O16E8l0NT#9}U$(;*<
z-uzBZL>9x#OTXCvggVXV?RJxe=XpUmFbNzxVC~&B;H+xR7j7q?#o71h+<M%n`Lu~M
XP1C%GZ#P~|6P;ZVXF+nw{p)`MiE-Gr
More information about the chirp_devel
mailing list