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
 

Reply via email to