From de044c2511a88cb5c23b375f2605158062c9b423 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Fri, 23 Aug 2024 15:12:41 -0700 Subject: [PATCH 1/4] uvk5: Add OSFW-bd90ca3 as found in the wild This firmware is installed on radios being sold by vendors and it appears to be reasonably compatible with the OEM configuration as confirmed in the associated bug. A few deltas have been shaken out in the bug, and I'm sure there are more, but this seems serviceable enough. Fixes #11488 --- chirp/drivers/uvk5.py | 44 +++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/chirp/drivers/uvk5.py b/chirp/drivers/uvk5.py index ed4e9160..a22f8dd8 100644 --- a/chirp/drivers/uvk5.py +++ b/chirp/drivers/uvk5.py @@ -127,7 +127,7 @@ u8 scan_resume_mode; u8 auto_keypad_lock; u8 power_on_dispmode; -u8 password[4]; +u8 password[8]; #seekto 0xea0; u8 keypad_tone; @@ -257,9 +257,6 @@ # battery save BATSAVE_LIST = ["OFF", "1:1", "1:2", "1:3", "1:4"] -# Backlight auto mode -BACKLIGHT_LIST = ["Off", "1s", "2s", "3s", "4s", "5s"] - # Crossband receiving/transmitting CROSSBAND_LIST = ["Off", "Band A", "Band B"] DUALWATCH_LIST = CROSSBAND_LIST @@ -282,7 +279,6 @@ WELCOME_LIST = ["Full Screen", "Welcome Info", "Voltage"] KEYPADTONE_LIST = ["Off", "Chinese", "English"] -LANGUAGE_LIST = ["Chinese", "English"] ALARMMODE_LIST = ["SITE", "TONE"] REMENDOFTALK_LIST = ["Off", "ROGER", "MDC"] RTE_LIST = ["Off", "100ms", "200ms", "300ms", "400ms", @@ -638,6 +634,8 @@ class UVK5RadioBase(chirp_common.CloneModeRadio): _upload_calibration = False _pttid_list = ["off", "BOT", "EOT", "BOTH"] _steps = [1.0, 2.5, 5.0, 6.25, 10.0, 12.5, 25.0, 8.33] + _langs = ["Chinese", "English"] + _backlight = ["Off"] + ['%is' % (i + 1) for i in range(5)] @classmethod def k5_approve_firmware(cls, firmware): @@ -1047,7 +1045,7 @@ def set_settings(self, settings): # Backlight auto mode if element.get_name() == "backlight_auto_mode": _mem.backlight_auto_mode = \ - BACKLIGHT_LIST.index(str(element.value)) + self._backlight.index(str(element.value)) # Tail tone elimination if element.get_name() == "tail_note_elimination": @@ -1084,7 +1082,7 @@ def set_settings(self, settings): # Language if element.get_name() == "language": - _mem.language = LANGUAGE_LIST.index(str(element.value)) + _mem.language = self._langs.index(str(element.value)) # Alarm mode if element.get_name() == "alarm_mode": @@ -1681,12 +1679,12 @@ def get_settings(self): # Backlight auto mode tmpback = _mem.backlight_auto_mode - if tmpback >= len(BACKLIGHT_LIST): + if tmpback >= len(self._backlight): tmpback = 0 rs = RadioSetting("backlight_auto_mode", "Backlight auto mode", RadioSettingValueList( - BACKLIGHT_LIST, + self._backlight, current_index=tmpback)) basic.append(rs) @@ -1758,11 +1756,12 @@ def get_settings(self): # Language tmplanguage = _mem.language - if tmplanguage >= len(LANGUAGE_LIST): + if tmplanguage >= len(self._langs): tmplanguage = 0 rs = RadioSetting("language", "Language", RadioSettingValueList( - LANGUAGE_LIST, current_index=tmplanguage)) - basic.append(rs) + self._langs, current_index=tmplanguage)) + if self._langs: + basic.append(rs) # Alarm mode tmpalarmmode = _mem.alarm_mode @@ -2069,6 +2068,27 @@ class MaxTalkerTK6(UVK5Radio): MODEL = "TK-6" +@directory.register +@directory.detected_by(UVK5Radio) +class OSFWUVK5Radio(UVK5RadioBase): + VARIANT = 'OSFW' + _langs = [] + _backlight = ['Off'] + ['%is' % (i + 1) for i in range(60)] + + @classmethod + def k5_approve_firmware(cls, firmware): + return firmware in ("OSFW-bd90ca3",) + + def _find_band(self, hz): + return _find_band(True, hz) + + def set_settings(self, settings): + # Something about this firmware needs this cleared to avoid getting + # locked. + self._memobj.password.fill_raw(b'\xFF') + return super().set_settings(settings) + + @directory.register @directory.detected_by(UVK5Radio) class UVK5RestrictedRadio(UVK5RadioBase): From 1d0e0ccf010db0a857a78d43d150e1ba13d9e6f5 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Tue, 1 Oct 2024 15:35:39 -0700 Subject: [PATCH 2/4] Add TYT TH-7900 model to alias map Fixes #11579 --- chirp/share/model_alias_map.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chirp/share/model_alias_map.yaml b/chirp/share/model_alias_map.yaml index 3715e0e2..63a431ac 100644 --- a/chirp/share/model_alias_map.yaml +++ b/chirp/share/model_alias_map.yaml @@ -282,6 +282,8 @@ TXQ: TYT: - alt: Explorer QRZ-1 model: QRZ-1 +- alt: TH-7800 + model: TH-7900 Tacklife: - alt: Radioddity R2 model: MTR01 From 58356914a969f0610dcbc5121984d0d41c2e9837 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Wed, 2 Oct 2024 14:32:15 -0700 Subject: [PATCH 3/4] icw32: Add 12.5kHz tuning step Fixes #11420 --- chirp/drivers/icw32.py | 1 + 1 file changed, 1 insertion(+) diff --git a/chirp/drivers/icw32.py b/chirp/drivers/icw32.py index 0276a0c5..82689e03 100644 --- a/chirp/drivers/icw32.py +++ b/chirp/drivers/icw32.py @@ -100,6 +100,7 @@ def get_features(self): rf.valid_tmodes = ["", "Tone", "TSQL"] rf.valid_name_length = 8 rf.valid_special_chans = sorted(_get_special().keys()) + rf.valid_tuning_steps = [5.0, 10.0, 12.5, 15.0, 20.0, 25.0, 30.0, 50.0] rf.has_sub_devices = self.VARIANT == "" rf.has_ctone = True From 841c4ebda14e6629db51b6f761ba7061f63a62d7 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Wed, 2 Oct 2024 14:32:51 -0700 Subject: [PATCH 4/4] Update detected models label generation and test --- chirp/wxui/clone.py | 12 ++++++++++-- tests/unit/test_wxui_radiothread.py | 12 +++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/chirp/wxui/clone.py b/chirp/wxui/clone.py index 2b19425c..817f584f 100644 --- a/chirp/wxui/clone.py +++ b/chirp/wxui/clone.py @@ -45,6 +45,15 @@ def is_prolific_warning(string): return 'PL2303' in string and 'CONTACT YOUR SUPPLIER' in string +def get_model_label(rclass): + detected = ','.join( + detected_value(rclass, m) + for m in rclass.detected_models(include_self=False)) + if len(detected) > (32 - 5): + detected = 'others' + return detected + + def get_fakes(): return { 'Fake NOP': developer.FakeSerial(), @@ -532,8 +541,7 @@ def _select_vendor(self, vendor): for rclass in self._vendors[vendor]: display = model_value(rclass) actual_models.append(display) - detected = ','.join(detected_value(rclass, x) for x in - rclass.detected_models(include_self=False)) + detected = get_model_label(rclass) if detected: display += ' (+ %s)' % detected display_models.append(display) diff --git a/tests/unit/test_wxui_radiothread.py b/tests/unit/test_wxui_radiothread.py index 02770341..18d08b56 100644 --- a/tests/unit/test_wxui_radiothread.py +++ b/tests/unit/test_wxui_radiothread.py @@ -164,15 +164,9 @@ def test_detected_model_labels(self): # be visible in the model box. for rclass in [x for x in directory.DRV_TO_RADIO.values() if issubclass(x, chirp_common.DetectableInterface)]: - labels = [] - for child_rclass in rclass.detected_models(include_self=False): - label = clone.detected_value(rclass, child_rclass) - self.assertNotEqual('', label) - labels.append(label) - if labels: - label = '%s (+ %s)' % (rclass.MODEL, ','.join(labels)) - self.assertLessEqual(len(label), 32, - 'Label %r is too long' % label) + label = clone.get_model_label(rclass) + self.assertLessEqual(len(label), 32, + 'Label %r is too long' % label) class TestException(Exception):