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 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): 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 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):