Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package chirp for openSUSE:Factory checked in at 2025-07-21 19:59:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/chirp (Old) and /work/SRC/openSUSE:Factory/.chirp.new.8875 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "chirp" Mon Jul 21 19:59:18 2025 rev:31 rq:1294428 version:20250718 Changes: -------- --- /work/SRC/openSUSE:Factory/chirp/chirp.changes 2025-07-07 14:44:35.315488597 +0200 +++ /work/SRC/openSUSE:Factory/.chirp.new.8875/chirp.changes 2025-07-21 19:59:43.369643858 +0200 @@ -1,0 +2,12 @@ +Fri Jul 18 17:18:31 UTC 2025 - Andreas Stieger <andreas.stie...@gmx.de> + +- Update to version 20250718: + * Revise UV-5R8W alias + * Add Baofeng UV-5R8W alias + * Fix stuck clone dialogs after failure + * id51: Disable callsign list settings + * icf: Filter D-STAR callsigns to valid chars + * icf: Gracefully handle invalid bank index mappings + * Improve setting load failure error messages + +------------------------------------------------------------------- Old: ---- chirp-20250620.obscpio chirp-20250704.obscpio New: ---- chirp-20250718.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ chirp.spec ++++++ --- /var/tmp/diff_new_pack.Mnuz5w/_old 2025-07-21 19:59:44.453688971 +0200 +++ /var/tmp/diff_new_pack.Mnuz5w/_new 2025-07-21 19:59:44.457689137 +0200 @@ -19,7 +19,7 @@ %define pythons python3 Name: chirp -Version: 20250704 +Version: 20250718 Release: 0 Summary: Tool for programming amateur radio sets License: GPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.Mnuz5w/_old 2025-07-21 19:59:44.485690302 +0200 +++ /var/tmp/diff_new_pack.Mnuz5w/_new 2025-07-21 19:59:44.489690469 +0200 @@ -4,8 +4,8 @@ <param name="scm">git</param> <param name="changesgenerate">enable</param> <param name="filename">chirp</param> - <param name="versionformat">20250704</param> - <param name="revision">1f2beb0c7cfa53340a7f38c03d4c8f99bf052643</param> + <param name="versionformat">20250718</param> + <param name="revision">c28ea5e8a7d8036ccc76ec38a050fd30b84c65e4</param> </service> <service mode="manual" name="set_version"/> <service name="tar" mode="buildtime"/> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Mnuz5w/_old 2025-07-21 19:59:44.509691301 +0200 +++ /var/tmp/diff_new_pack.Mnuz5w/_new 2025-07-21 19:59:44.509691301 +0200 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/kk7ds/chirp.git</param> - <param name="changesrevision">1f2beb0c7cfa53340a7f38c03d4c8f99bf052643</param> + <param name="changesrevision">c28ea5e8a7d8036ccc76ec38a050fd30b84c65e4</param> </service> </servicedata> (No newline at EOF) ++++++ chirp-20250620.obscpio -> chirp-20250718.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/icf.py new/chirp-20250718/chirp/drivers/icf.py --- old/chirp-20250620/chirp/drivers/icf.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/icf.py 2025-07-17 23:58:04.000000000 +0200 @@ -766,7 +766,12 @@ if index is None: return [] else: - return [self.get_mappings()[index]] + try: + return [self.get_mappings()[index]] + except IndexError: + LOG.error('Invalid bank index %i for memory %i' % ( + index, memory.number)) + return [] class IcomIndexedBankModel(IcomBankModel, @@ -944,7 +949,9 @@ nice_name = listname.split('_', 1)[0].upper() group = RadioSettingGroup('%s_list' % listname, '%s List' % nice_name) + charset = chirp_common.CHARSET_UPPER_NUMERIC + '-' for i, cs in enumerate(current): + cs = ''.join(filter(lambda c: c in charset, cs)) group.append(RadioSetting('%03i' % i, '%i' % i, RadioSettingValueString(0, 8, cs))) return group diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/id51.py new/chirp-20250718/chirp/drivers/id51.py --- old/chirp-20250620/chirp/drivers/id51.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/id51.py 2025-07-17 23:58:04.000000000 +0200 @@ -127,6 +127,9 @@ def get_features(self): rf = super(ID51Radio, self).get_features() rf.valid_bands = [(108000000, 174000000), (400000000, 479000000)] + # The ID-51 D-STAR support seems broken, so disable getting settings + # that will contain the base-class call list support. + rf.has_settings = False return rf def process_mmap(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/tk280.py new/chirp-20250718/chirp/drivers/tk280.py --- old/chirp-20250620/chirp/drivers/tk280.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/tk280.py 2025-07-17 23:58:04.000000000 +0200 @@ -55,6 +55,25 @@ # # + +def choose_step(step_map, freq, default=5.0): + """Choose the proper step index for a given frequency. + + @step_map should be a dict of step (in kHz) to index, in order of + preference. + @freq should be a frequency in Hz. + Returns the step index from step_map to use. + """ + try: + step = chirp_common.required_step(freq, step_map.keys()) + except errors.InvalidDataError: + step = default + LOG.warning('Frequency %s requires step not in availble map, ' + 'using %s kHz by default', + chirp_common.format_freq(freq), step) + return step_map[step] + + CONVENTIONAL_DEFS = """ struct conv_settings { // x00-x01, Edit>>Model Information>>Radio Format, @@ -1658,18 +1677,8 @@ 5.0: 0x1, 2.5: 0x0, } - try: - _mem.rx_step = step_lookup[chirp_common.required_step( - int(_mem.rxfreq) * 10, allowed=step_lookup.keys())] - except errors.InvalidDataError: - LOG.warning('Unknown step for rx freq, defaulting to 5kHz') - _mem.rx_step = 0x1 - try: - _mem.tx_step = step_lookup[chirp_common.required_step( - int(_mem.txfreq) * 10, allowed=step_lookup.keys())] - except errors.InvalidDataError: - LOG.warning('Unknown step for tx freq, defaulting to 5kHz') - _mem.tx_step = 0x1 + _mem.rx_step = choose_step(step_lookup, int(_mem.rxfreq) * 10) + _mem.tx_step = choose_step(step_lookup, int(_mem.txfreq) * 10) ((txmode, txtone, txpol), (rxmode, rxtone, rxpol)) = \ chirp_common.split_tone_encode(mem) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/tk3140.py new/chirp-20250718/chirp/drivers/tk3140.py --- old/chirp-20250620/chirp/drivers/tk3140.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/tk3140.py 2025-07-17 23:58:04.000000000 +0200 @@ -20,6 +20,7 @@ from chirp import chirp_common from chirp import bitwise from chirp import directory +from chirp.drivers import tk280 from chirp.drivers import tk8160 from chirp.drivers import tk8180 from chirp import errors @@ -290,8 +291,10 @@ char name[10]; lbcd rx_freq[4]; lbcd tx_freq[4]; - u8 rxsomething; - u8 txsomething; + u8 rxsomething:4, + rxstep:4; + u8 txsomething:4, + txstep:4; ul16 rxtone; ul16 txtone; u8 unknown2[5]; @@ -547,8 +550,8 @@ _mem.memory = mem.number _mem.zone = self._zone self.sort_index() - _mem.rxsomething = 0x35 - _mem.txsomething = 0x35 + _mem.rxsomething = 0x3 + _mem.txsomething = 0x3 _mem.rx_freq = mem.freq // 10 if mem.duplex == '': @@ -564,6 +567,17 @@ else: raise errors.RadioError('Unsupported duplex mode %r' % mem.duplex) + step_lookup = { + 6.25: 0x02, + 12.5: 0x05, + 5.0: 0x01, + 2.5: 0x00, + 10.0: 0x04, + 7.5: 0x06, # maybe? + } + _mem.rxstep = tk280.choose_step(step_lookup, int(_mem.rx_freq) * 10) + _mem.txstep = tk280.choose_step(step_lookup, int(_mem.tx_freq) * 10) + txtone, rxtone = chirp_common.split_tone_encode(mem) _mem.rxtone = tk8180.KenwoodTKx180Radio._encode_tone(*rxtone) _mem.txtone = tk8180.KenwoodTKx180Radio._encode_tone(*txtone) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/tk760g.py new/chirp-20250718/chirp/drivers/tk760g.py --- old/chirp-20250620/chirp/drivers/tk760g.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/tk760g.py 2025-07-17 23:58:04.000000000 +0200 @@ -21,7 +21,7 @@ from chirp.settings import RadioSettingGroup, RadioSetting, \ RadioSettingValueBoolean, RadioSettingValueList, \ RadioSettingValueString, RadioSettingValueInteger, \ - RadioSettings + RadioSettings, RadioSettingValueMap LOG = logging.getLogger(__name__) @@ -327,6 +327,7 @@ 0x5d: "AUX", 0xa1: "Channel Up/Down" # Knob for portables only } +KEY_MAP = [(v, k) for k, v in KEYS.items()] def _raw_recv(radio, amount): @@ -1134,7 +1135,8 @@ # Basic tot = RadioSetting("settings.tot", "Time Out Timer (TOT)", - RadioSettingValueList(TOT, '%i' % sett.tot)) + RadioSettingValueList( + TOT, current_index=TOT.index('%i' % sett.tot))) basic.append(tot) totalert = RadioSetting("settings.tot_alert", "TOT pre alert", @@ -1199,6 +1201,12 @@ RadioSettingValueString(0, 8, ponm, False)) basic.append(pom) + offhook = RadioSetting('settings.off_hook_decode', 'Off-hook decode', + RadioSettingValueBoolean( + not sett.off_hook_decode)) + offhook.set_doc('Squelch mode active when mic is off-hook') + basic.append(offhook) + # dealer valid_chars = ",-/:[]" + chirp_common.CHARSET_ALPHANUMERIC mstr = "".join([c for c in self._VARIANT if c in valid_chars]) @@ -1250,28 +1258,28 @@ # The Mobile only parameters are wrapped here if self.TYPE[0] == "M": vu = RadioSetting("keys.kVOL_UP", "VOL UP", - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kVOL_UP)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kVOL_UP))) fkeys.append(vu) vd = RadioSetting("keys.kVOL_DOWN", "VOL DOWN", - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kVOL_DOWN)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kVOL_DOWN))) fkeys.append(vd) chu = RadioSetting("keys.kCH_UP", "CH UP", - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kCH_UP)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kCH_UP))) fkeys.append(chu) chd = RadioSetting("keys.kCH_DOWN", "CH DOWN", - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kCH_DOWN)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kCH_DOWN))) fkeys.append(chd) foot = RadioSetting("keys.kFOOT", "Foot switch", - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kFOOT)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kFOOT))) fkeys.append(foot) # this is the common buttons for all @@ -1283,8 +1291,8 @@ scn_name = "Open Circle" scn = RadioSetting("keys.kSCN", scn_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kSCN)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kSCN))) fkeys.append(scn) a_name = "A" @@ -1292,8 +1300,8 @@ a_name = "Closed circle" a = RadioSetting("keys.kA", a_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kA)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kA))) fkeys.append(a) da_name = "D/A" @@ -1301,8 +1309,8 @@ da_name = "< key" da = RadioSetting("keys.kDA", da_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kDA)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kDA))) fkeys.append(da) gu_name = "Triangle up" @@ -1310,8 +1318,8 @@ gu_name = "Side 1" gu = RadioSetting("keys.kGROUP_UP", gu_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kGROUP_UP)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kGROUP_UP))) fkeys.append(gu) # Side keys on portables @@ -1320,8 +1328,8 @@ gd_name = "> key" gd = RadioSetting("keys.kGROUP_DOWN", gd_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kGROUP_DOWN)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kGROUP_DOWN))) fkeys.append(gd) mon_name = "MON" @@ -1329,8 +1337,8 @@ mon_name = "Side 2" mon = RadioSetting("keys.kMON", mon_name, - RadioSettingValueList(KEYS.values(), - KEYS[int(keys.kMON)])) + RadioSettingValueMap(KEY_MAP, + int(keys.kMON))) fkeys.append(mon) return top @@ -1383,11 +1391,11 @@ # Bool types + inverted if setting in ["c2t", "poweron_tone", "control_tone", "warn_tone", "battery_save", "self_prog", - "clone", "panel_test"]: + "clone", "panel_test", "off_hook_decode"]: value = bool(value) # this cases are inverted - if setting == "c2t": + if setting in ["c2t", "off_hook_decode"]: value = not value # case battery save is special diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/drivers/tk8180.py new/chirp-20250718/chirp/drivers/tk8180.py --- old/chirp-20250620/chirp/drivers/tk8180.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/drivers/tk8180.py 2025-07-17 23:58:04.000000000 +0200 @@ -998,20 +998,8 @@ 5: 0x2, 2.5: 0x1, } - try: - tx_step = chirp_common.required_step(int(_mem.tx_freq) * 10, - allowed=step_lookup.keys()) - except errors.InvalidDataError: - tx_step = 5 - try: - rx_step = chirp_common.required_step(int(_mem.rx_freq) * 10, - allowed=step_lookup.keys()) - except errors.InvalidDataError: - rx_step = 5 - - # Default to 5kHz if we don't know any better - _mem.rx_step = step_lookup.get(rx_step, 0x2) - _mem.tx_step = step_lookup.get(tx_step, 0x2) + _mem.rx_step = tk280.choose_step(step_lookup, int(_mem.rx_freq) * 10) + _mem.tx_step = tk280.choose_step(step_lookup, int(_mem.tx_freq) * 10) skipbyte = self._memobj.skipflags[(mem.number - 1) // 8] if mem.skip == 'S': diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/settings.py new/chirp-20250718/chirp/settings.py --- old/chirp-20250620/chirp/settings.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/settings.py 2025-07-17 23:58:04.000000000 +0200 @@ -310,12 +310,13 @@ def set_value(self, value): if len(value) < self._minlength or len(value) > self._maxlength: - raise InvalidValueError("Value must be between %i and %i chars" % - (self._minlength, self._maxlength)) + raise InvalidValueError( + "Value %r must be between %i and %i chars" % ( + value, self._minlength, self._maxlength)) for char in value: if char not in self._charset: - raise InvalidValueError("Value contains invalid " + - "character `%s'" % char) + raise InvalidValueError(("Value %r contains invalid " + "character `%s'") % (value, char)) if self._autopad: value = value.ljust(self._maxlength) RadioSettingValue.set_value(self, value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/share/model_alias_map.yaml new/chirp-20250718/chirp/share/model_alias_map.yaml --- old/chirp-20250620/chirp/share/model_alias_map.yaml 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/share/model_alias_map.yaml 2025-07-17 23:58:04.000000000 +0200 @@ -122,7 +122,7 @@ - alt: UV-5R model: UV-5R++ - alt: BF-F8HP - model: UV-5R7W + model: UV-5R7W, UV-5R8W - alt: UV-5R model: UV-5RA, UV-5RA+, UV-5RAX, UV-5RAX+ - alt: Radioddity UV-5RX3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/wxui/bugreport.py new/chirp-20250718/chirp/wxui/bugreport.py --- old/chirp-20250620/chirp/wxui/bugreport.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/wxui/bugreport.py 2025-07-17 23:58:04.000000000 +0200 @@ -137,6 +137,7 @@ self.session = requests.Session() self.session.headers = { 'User-Agent': 'CHIRP/%s' % CHIRP_VERSION, + 'Referer': 'https://chirpmyradio.com/projects/chirp/issues/new', } def get_page(self, name, cls): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/chirp-20250620/chirp/wxui/clone.py new/chirp-20250718/chirp/wxui/clone.py --- old/chirp-20250620/chirp/wxui/clone.py 2025-06-20 06:15:44.000000000 +0200 +++ new/chirp-20250718/chirp/wxui/clone.py 2025-07-17 23:58:04.000000000 +0200 @@ -542,10 +542,19 @@ self._model.Disable() self._recent.Disable() + def enable_model_select(self): + self._vendor.Enable() + self._model.Enable() + self._recent.Enable() + def disable_running(self): self._port.Disable() self.FindWindowById(wx.ID_OK).Disable() + def enable_running(self): + self._port.Enable() + self.FindWindowById(wx.ID_OK).Enable() + def _persist_choices(self): raise NotImplementedError() @@ -682,12 +691,14 @@ common.error_proof.show_error( error, parent=self, title=_('Error communicating with radio')) + if isinstance(self, ChirpDownloadDialog): + self.enable_model_select() + self.enable_running() wx.CallAfter(safe_fail) def cancel_action(self): if isinstance(self, ChirpDownloadDialog): - self._vendor.Enable() - self._model.Enable() + self.enable_model_select() self._port.Enable() s = chirp_common.Status() s.cur = 0 ++++++ chirp.obsinfo ++++++ --- /var/tmp/diff_new_pack.Mnuz5w/_old 2025-07-21 19:59:45.229721265 +0200 +++ /var/tmp/diff_new_pack.Mnuz5w/_new 2025-07-21 19:59:45.233721432 +0200 @@ -1,5 +1,5 @@ name: chirp -version: 20250704 -mtime: 1751580696 -commit: 1f2beb0c7cfa53340a7f38c03d4c8f99bf052643 +version: 20250718 +mtime: 1752789484 +commit: c28ea5e8a7d8036ccc76ec38a050fd30b84c65e4