From de2122e3059acd083beec9119d7ecc286fca6a2f Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Sat, 15 Jun 2024 17:33:10 -0700 Subject: [PATCH] ga510: Add support for "v2" variant This variant was released in 2024 and looks identical to the original, but is totally different inside and is based on the uv17. This uses the detection framework to basically hide the difference from the user. Fixes: #10600 --- chirp/drivers/ga510.py | 90 +++++++++++++++++++++++++- tests/Python3_Driver_Testing.md | 7 +- tests/images/Radioddity_GA-510_V2.img | Bin 0 -> 20673 bytes 3 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 tests/images/Radioddity_GA-510_V2.img diff --git a/chirp/drivers/ga510.py b/chirp/drivers/ga510.py index dba6609e9..13d426e8f 100644 --- a/chirp/drivers/ga510.py +++ b/chirp/drivers/ga510.py @@ -1,4 +1,4 @@ -# Copyright 2011 Dan Smith +# Copyright 2024 Dan Smith # Portions copyright 2023 Dave Liske # Portions copyright 2020 by Jiauxn Yang # @@ -21,6 +21,8 @@ from chirp import bitwise from chirp import chirp_common from chirp import directory +from chirp.drivers import baofeng_uv17 +from chirp.drivers import baofeng_uv17Pro from chirp import errors from chirp import memmap from chirp.settings import RadioSetting, RadioSettingGroup, RadioSettings @@ -60,7 +62,7 @@ def start_program(radio): def do_download(radio): - ident = start_program(radio) + # No start_program() here because it was done in detect_from_serial() s = chirp_common.Status() s.msg = 'Downloading' @@ -355,6 +357,24 @@ class RadioddityGA510Radio(chirp_common.CloneModeRadio): _gmrs = False + @classmethod + def detect_from_serial(cls, pipe): + for rcls in reversed(cls.detected_models()): + pipe.baudrate = rcls.BAUD_RATE + radio = rcls(pipe) + try: + if isinstance(radio, baofeng_uv17Pro.UV17Pro): + ident = baofeng_uv17Pro._do_ident(radio) + else: + ident = start_program(radio) + except errors.RadioError: + LOG.debug('No response from radio with %s', rcls) + pipe.read(256) + continue + if ident: + return rcls + raise errors.RadioError('No response from radio') + def sync_in(self): try: data = do_download(self) @@ -1074,3 +1094,69 @@ def _set_mem(self, num): def _set_nam(self, number): return self._memobj.names[number - 1] + + +@directory.register +@directory.detected_by(RadioddityGA510Radio) +class RadioddityGA510v2(baofeng_uv17.UV17): + """Baofeng UV-17""" + VENDOR = "Radioddity" + MODEL = "GA-510" + VARIANT = "V2" + + MODES = ["FM", "NFM"] + BLOCK_ORDER = [2, 4, 6, 16, 24] + MEM_TOTAL = 0x6000 + WRITE_MEM_TOTAL = 0x6000 + BLOCK_SIZE = 0x40 + BAUD_RATE = 57600 + + _magic = b"PSEARCH" + _magic_response_length = 8 + _magics = [(b"PASSSTA", 3), (b"SYSINFO", 1), + (b"\x56\x00\x00\x0A\x0D", 13), (b"\x06", 1), + (b"\x56\x00\x10\x0A\x0D", 13), (b"\x06", 1), + (b"\x56\x00\x20\x0A\x0D", 13), (b"\x06", 1), + (b"\x56\x00\x00\x00\x0A", 11), (b"\x06", 1), + (b"\xFF\xFF\xFF\xFF\x0C\x44\x4d\x52\x31\x37\x30\x32", 1), + (b"\02", 8), (b"\x06", 1)] + _magic_memsize = [] + _radio_memsize = 0x10000 + _magics2 = [] + _fingerprint = b"\x06DMR1702" + _scode_offset = 1 + + _tri_band = False + POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00), + chirp_common.PowerLevel("Medium", watts=5.00), + chirp_common.PowerLevel("High", watts=10.00)] + + LENGTH_NAME = 11 + SCODE_LIST = ["%s" % x for x in range(1, 16)] + SQUELCH_LIST = ["Off"] + list("123456789") + LIST_POWERON_DISPLAY_TYPE = ["Full", "Message", "Voltage"] + LIST_TIMEOUT = ["Off"] + ["%s sec" % x for x in range(15, 615, 15)] + LIST_VOICE = ["Chinese", "English"] + LIST_BACKLIGHT_TIMER = ["Always On"] + ["%s sec" % x for x in range(1, 11)] + LIST_MODE = ["Name", "Frequency"] + CHANNELS = 128 + + MEM_LAYOUT = """ + #seekto 0x1000; + struct settings settings; + + #seekto 0x2000; + struct pttid pttid[15]; + struct ani ani; + + #seekto 0x3040; + struct { + struct channel mem[128]; + } mem1; + + #seekto 0x400B; + struct channelname names1[128]; + """ + MEM_FORMAT = baofeng_uv17.UV17.MEM_DEFS + MEM_LAYOUT + + _has_workmode_support = False diff --git a/tests/Python3_Driver_Testing.md b/tests/Python3_Driver_Testing.md index b8d22291f..5a9a1d77b 100644 --- a/tests/Python3_Driver_Testing.md +++ b/tests/Python3_Driver_Testing.md @@ -272,6 +272,7 @@ | Radioddity_DB25-G | [@KC9HI](https://github.com/KC9HI) | 11-Nov-2022 | Yes | 0.17% | | Radioddity_GA-2S | [@KC9HI](https://github.com/KC9HI) | 4-Dec-2022 | Yes | 0.19% | | Radioddity_GA-510 | [@kk7ds](https://github.com/kk7ds) | 21-Oct-2022 | Yes | 0.42% | +| Radioddity_GA-510_V2 | | | Yes | | | Radioddity_GS-5B | [@lunapiercook](https://github.com/lunapiercook) | 5-Mar-2023 | Yes | | | Radioddity_R2 | [@KC9HI](https://github.com/KC9HI) | 17-Dec-2022 | Yes | 0.04% | | Radioddity_UV-5G | [@KC9HI](https://github.com/KC9HI) | 18-Nov-2022 | Yes | 0.47% | @@ -466,11 +467,11 @@ | Zastone_ZT-X6 | [Implied by Retevis_RT22](#user-content-Retevis_RT22) | 9-Dec-2022 | Yes | 0.11% | ## Stats -**Drivers:** 463 +**Drivers:** 464 -**Tested:** 87% (406/57) (93% of usage stats) +**Tested:** 87% (406/58) (93% of usage stats) -**Byte clean:** 91% (424/39) +**Byte clean:** 91% (425/39) ## Meaning of this testing diff --git a/tests/images/Radioddity_GA-510_V2.img b/tests/images/Radioddity_GA-510_V2.img new file mode 100644 index 0000000000000000000000000000000000000000..7695033d1b7291c3e860d3fdee96fd0a889fcafe GIT binary patch literal 20673 zcmeI3!B1LA9LEP)CpD?A7OB!rHbuaC=xz|p8WXpI2ozFN1Odybpx8c@(yiFWUeq>b z&l@khNiV(ix_jDVd+NEjUi%L;ZL+sbmi^AW2RwCeEt~G<`%AuW<~zTcACFH4bRdj- zy<@i6I~o3V_&xaKj@^qs}%C6C8m#uicJQ|*Yy zSVe?Z0D++3eM;C+EW!0#Iy^Lk+r9vx<1T|3h|WA>hih^*t5D>C8` z7sa>`v(Z>;aph_I9z0+BCcX(x&qjqA7ryGdJkTGx8V)UIug+c?&n^Ag-22i>ss{C% zs-88pwNMZaTUvEn{>?;K?7tt?SvB@ov)LRxqwR@HM9h90G}pQ7;%TrTp8r;F&$&2S z7r%dB7lX*13e;qf011!)36KB@kN^pg011!)3HmJF(T!eVR%)MJF~^Kn0bwg`j_G_W&6Wg6fCNZ@1W14cNPq-LfCNZ@ z1W2H31itu$mGybv(c^43t)qXdv48#D8e>ZWBtQZrKmsH{0wh2JBtQZrKmsK2uMv>@ z;=DL^J`ZGK`q9+~19GTW1Tt=$Z-0reJ8}rA$b#09Jd(->LUAp3pSw?b;bZVn)m3%L zN%&=WXxKgMmQnaBJT&2%@W>_j2k_9Sf7CC_@IS&U?FaVd5AZ*u4_!I9av%@jJqfMG zxe!9&hN=b`)+egPiZezE;RzJ$-iL(W&uSMs%5AJNj!|1EqY zrltJ{A$ERAYMFe5$Q-(~wD-b4aBFEl34dusOZzBz9fB{U{Stf;d?D@2r}(O26)oPT zqbCpS1iaq3A4~$=58MxYJ#_#5V7>kizahh4F$M{c011!)36Q{lhQRr|JGDyneo)=; zscxtcIs|= zqmoQKTHQ^3mx`rxH;dVOl~8uGypj!PgYn75<@wN}k=jNsR4RryD^n?~jT-q{VzXSF z*(@cug4LYPH?VH264Q0AE#-n(8#S)SqQ+V+v0E-CcGk>X(W