Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package chirp for openSUSE:Factory checked 
in at 2026-05-04 12:53:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chirp (Old)
 and      /work/SRC/openSUSE:Factory/.chirp.new.30200 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chirp"

Mon May  4 12:53:40 2026 rev:68 rq:1350477 version:20260501

Changes:
--------
--- /work/SRC/openSUSE:Factory/chirp/chirp.changes      2026-04-25 
21:43:17.516296074 +0200
+++ /work/SRC/openSUSE:Factory/.chirp.new.30200/chirp.changes   2026-05-04 
12:56:47.661572522 +0200
@@ -1,0 +2,8 @@
+Sat May  2 18:12:29 UTC 2026 - Andreas Stieger <[email protected]>
+
+- Update to version 20260501:
+  * tdh8: Fix VFO A/B BCL setting not reading properly
+  * tdh8: Add offset dir in VFO settings and fix VFO TX freq
+  * h777v4: Fix detected models
+
+-------------------------------------------------------------------

Old:
----
  chirp-20260425.obscpio

New:
----
  chirp-20260501.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ chirp.spec ++++++
--- /var/tmp/diff_new_pack.anLi5C/_old  2026-05-04 12:56:48.301598864 +0200
+++ /var/tmp/diff_new_pack.anLi5C/_new  2026-05-04 12:56:48.305599029 +0200
@@ -20,7 +20,7 @@
 
 %define pythons python3
 Name:           chirp
-Version:        20260425
+Version:        20260501
 Release:        0
 Summary:        Tool for programming amateur radio sets
 License:        GPL-3.0-only

++++++ _service ++++++
--- /var/tmp/diff_new_pack.anLi5C/_old  2026-05-04 12:56:48.345600675 +0200
+++ /var/tmp/diff_new_pack.anLi5C/_new  2026-05-04 12:56:48.357601169 +0200
@@ -4,8 +4,8 @@
     <param name="scm">git</param>
     <param name="changesgenerate">enable</param>
     <param name="filename">chirp</param>
-    <param name="versionformat">20260425</param>
-    <param name="revision">e7347e6a66ef8f9edb50e3e534510c2d3ae6b329</param>
+    <param name="versionformat">20260501</param>
+    <param name="revision">68546632f7dd949a8861c3cc3358de9747a70ef2</param>
   </service>
   <service mode="manual" name="set_version"/>
   <service name="tar" mode="buildtime"/>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.anLi5C/_old  2026-05-04 12:56:48.385602321 +0200
+++ /var/tmp/diff_new_pack.anLi5C/_new  2026-05-04 12:56:48.389602486 +0200
@@ -1,7 +1,7 @@
 <servicedata>
   <service name="tar_scm">
     <param name="url">https://github.com/kk7ds/chirp.git</param>
-    <param 
name="changesrevision">e7347e6a66ef8f9edb50e3e534510c2d3ae6b329</param>
+    <param 
name="changesrevision">68546632f7dd949a8861c3cc3358de9747a70ef2</param>
   </service>
 </servicedata>
 (No newline at EOF)

++++++ chirp-20260425.obscpio -> chirp-20260501.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20260425/chirp/chirp_common.py 
new/chirp-20260501/chirp/chirp_common.py
--- old/chirp-20260425/chirp/chirp_common.py    2026-04-19 00:23:25.000000000 
+0200
+++ new/chirp-20260501/chirp/chirp_common.py    2026-05-01 01:10:55.000000000 
+0200
@@ -1508,6 +1508,10 @@
         return extra + list(detected)
 
     @classmethod
+    def is_detected(cls):
+        return getattr(cls, '_DETECTED_BY', None) is not None
+
+    @classmethod
     def detect_model(cls, detected_cls):
         detected_attr = class_detected_models_attribute(cls)
         if getattr(cls, detected_attr, None) is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20260425/chirp/drivers/retevis_h777v4.py 
new/chirp-20260501/chirp/drivers/retevis_h777v4.py
--- old/chirp-20260425/chirp/drivers/retevis_h777v4.py  2026-04-19 
00:23:25.000000000 +0200
+++ new/chirp-20260501/chirp/drivers/retevis_h777v4.py  2026-05-01 
01:10:55.000000000 +0200
@@ -185,7 +185,11 @@
 def do_download(radio):
     LOG.debug("download")
 
-    h777._h777_enter_single_programming_mode(radio)
+    if not radio.is_detected() and not radio.detected_models():
+        # If we are a detect-ee or detect-or, don't re-initialize programming
+        # mode. But if we're one of the other subclasses of this work that
+        # would not have run through detection, we need to do so.
+        h777._h777_enter_single_programming_mode(radio)
 
     data = b""
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20260425/chirp/drivers/tdh8.py 
new/chirp-20260501/chirp/drivers/tdh8.py
--- old/chirp-20260425/chirp/drivers/tdh8.py    2026-04-19 00:23:25.000000000 
+0200
+++ new/chirp-20260501/chirp/drivers/tdh8.py    2026-05-01 01:10:55.000000000 
+0200
@@ -106,8 +106,10 @@
 } settings;
 
 //#seekto 0x0CB8;
-lbcd offseta[4];
-lbcd offsetb[4];
+struct{
+    lbcd a[4];
+    lbcd b[4];
+}vfo_offset;
 
 #seekto 0x0CD8;
 struct{
@@ -148,7 +150,7 @@
      lowpower:2,
      wide:1,
      unused8:1,
-     offset:2;
+     dira:2;
   u8 unused10;
 } vfoa;
 
@@ -171,7 +173,7 @@
      lowpowerb:2,
      wideb:1,
      unused8:1,
-     offsetb:2;
+     dirb:2;
   u8 unused10;
 } vfob;
 
@@ -365,8 +367,10 @@
 } settings;
 
 //#seekto 0x0CB8;
-lbcd offseta[4];
-lbcd offsetb[4];
+struct{
+  lbcd a[4];
+  lbcd b[4];
+}vfo_offset;
 
 #seekto 0x0CD8;
 struct{
@@ -472,7 +476,7 @@
      lowpower:2,
      wide:1,
      unused8:1,
-     offset:2;
+     dira:2;
   u8 unused10;
 } vfoa;
 
@@ -495,7 +499,7 @@
      lowpowerb:2,
      wideb:1,
      unused8:1,
-     offsetb:2;
+     dirb:2;
   u8 unused10;
 } vfob;
 
@@ -589,8 +593,10 @@
 } settings;
 
 //#seekto 0x0CB8;
-lbcd offseta[4];
-lbcd offsetb[4];
+struct {
+lbcd a[4];
+lbcd b[4];
+}vfo_offset;
 
 #seekto 0x0CD8;
 struct{
@@ -638,7 +644,7 @@
      lowpower:2,
      wide:1,
      unused8:1,
-     offset:2;
+     dira:2;
   u8 unused9;
 } vfoa;
 
@@ -661,7 +667,7 @@
      lowpowerb:2,
      wideb:1,
      unused8:1,
-     offsetb:2;
+     dirb:2;
   u8 unused9;
 } vfob;
 
@@ -704,7 +710,9 @@
              "bcl",
              "lowpower",
              "wide",
-             "offset"]
+             "a",
+             "dira",
+             ]
 
 VFOB_NAME = ["rxfreqb",
              "txfreq",
@@ -715,7 +723,9 @@
              "bclb",
              "lowpowerb",
              "wideb",
-             "offsetb"]
+             "b",
+             "dirb",
+             ]
 
 TOT_LIST = ["Off", "30S", "60S", "90S", "120S", "150S", "180S", "210S"]
 ALARM_LIST = ["On site", "Alarm"]
@@ -751,14 +761,9 @@
 BCLOCK_VALUES = ["Off", "On"]
 FREQHOP_VALUES = ["Off", "On"]
 
-# AB CHANNEL
-A_OFFSET = ["Off", "-", "+"]
-A_BAND = ["Wide", "Narrow"]
-A_WORKMODE = ["VFO", "VFO+CH", "CH Mode"]
-
-B_OFFSET = ["Off", "-", "+"]
-B_BAND = ["Wide", "Narrow"]
-B_WORKMODE = ["VFO", "VFO+CH", "CH Mode"]
+# AB VFO CHANNEL
+OFFSET_DIR = ["Off", "-", "+"]
+VFO_WORKMODE = ["VFO", "VFO+CH", "CH Mode"]
 
 # FM
 FM_WORKMODE = ["VFO", "CH"]
@@ -1757,27 +1762,70 @@
             # If the offset is 12.345
             # Then the data obtained is [0x45, 0x23, 0x01, 0x00]
             offsets = {}
+            dirs = {}
+
+            def _calc_txfreq(rxfreq, offset, dir):
+                # calc tx freq
+                txfreq = 0
+                match dir:
+                    case 0:  # off
+                        txfreq = rxfreq
+                    case 1:  # minus
+                        txfreq = \
+                            (int(rxfreq) /
+                                100000 - int(offset) / 100000) * 100000
+                    case 2:  # plus
+                        txfreq = \
+                            (int(rxfreq) /
+                                100000 + int(offset) / 100000) * 100000
+                return int(txfreq)
+
+            def _apply_offset_dir(setting, i, obj1, obj2):
+                value = getattr(obj1, setting.get_name())
+                value.set_value(setting.value)
+                # calc tx freq and store
+                obj1.txfreq = _calc_txfreq(
+                    getattr(obj1, "rxfreq%s" % i),
+                    obj2,
+                    getattr(obj1, "dir%s" % i)
+                )
+
             for i in ('a', 'b'):
-                value = getattr(self._memobj, 'offset%s' % i)
+                value = getattr(self._memobj.vfo_offset, '%s' % i)
                 if value.get_raw() == b'\xff\xff\xff\xff':
                     offset = 0
                 else:
                     offset = int(value) / 100000
 
                 def _apply(setting):
-                    value = getattr(self._memobj, setting.get_name())
+                    value = getattr(self._memobj.vfo_offset,
+                                    setting.get_name())
                     if float(setting.value) == 0:
                         value.fill_raw(b'\xff')
                     else:
                         value.set_value(int(setting.value * 100000))
 
-                rs = RadioSetting("offset%s" % i,
+                rs = RadioSetting("%s" % i,
                                   "%s Offset Frequency" % i.upper(),
                                   RadioSettingValueFloat(
                                       0.00000, 59.99750, offset, 0.00001, 5))
                 rs.set_apply_callback(_apply)
                 offsets[i] = rs
+                _obj1 = self._memobj.vfoa if i == \
+                    'a' else self._memobj.vfob
+                _obj2 = self._memobj.vfo_offset.a if i == 'a' \
+                    else self._memobj.vfo_offset.b
+                _obj3 = self._memobj.vfoa.dira if i == 'a' \
+                    else self._memobj.vfob.dirb
+                rs = RadioSetting("dir%s" % i,
+                                  "%s Offset Direction" % i.upper(),
+                                  RadioSettingValueList(OFFSET_DIR,
+                                                        current_index=_obj3))
+                rs.set_apply_callback(_apply_offset_dir, i, _obj1, _obj2)
+                dirs[i] = rs
+
             abblock.append(offsets['a'])
+            abblock.append(dirs['a'])
 
             try:
                 self._tx_power[_vfoa.lowpower]
@@ -1792,11 +1840,11 @@
 
             rs = RadioSetting("wide", "A Band",
                               RadioSettingValueList(
-                                  A_BAND, current_index=_vfoa.wide))
+                                  BANDWIDTH_LIST, current_index=_vfoa.wide))
             abblock.append(rs)
 
             rs = RadioSetting("bcl", "A Busy Lock",
-                              RadioSettingValueBoolean(_settings.ablock))
+                              RadioSettingValueBoolean(_vfoa.bcl))
             abblock.append(rs)
 
             rs = RadioSetting("specialqta", "A Special QT/DQT",
@@ -1806,7 +1854,7 @@
             rs = RadioSetting(
                 "aworkmode", "A Work Mode",
                 RadioSettingValueList(
-                    A_WORKMODE, current_index=_settings.aworkmode))
+                    VFO_WORKMODE, current_index=_settings.aworkmode))
             abblock.append(rs)
 
             # B channel
@@ -1821,6 +1869,7 @@
             abblock.append(rs)
 
             abblock.append(offsets['b'])
+            abblock.append(dirs['b'])
 
             try:
                 self._tx_power[_vfob.lowpowerb]
@@ -1835,11 +1884,11 @@
 
             rs = RadioSetting("wideb", "B Band",
                               RadioSettingValueList(
-                                  B_BAND, current_index=_vfob.wideb))
+                                  BANDWIDTH_LIST, current_index=_vfob.wideb))
             abblock.append(rs)
 
             rs = RadioSetting("bclb", "B Busy Lock",
-                              RadioSettingValueBoolean(_settings.bblock))
+                              RadioSettingValueBoolean(_vfob.bclb))
             abblock.append(rs)
 
             rs = RadioSetting("specialqtb", "B Special QT/DQT",
@@ -1849,7 +1898,7 @@
             rs = RadioSetting(
                 "bworkmode", "B Work Mode",
                 RadioSettingValueList(
-                    B_WORKMODE, current_index=_settings.bworkmode))
+                    VFO_WORKMODE, current_index=_settings.bworkmode))
             abblock.append(rs)
 
         group.append(fmmode)
@@ -2214,7 +2263,7 @@
                         _settings.brightness = 4 - int(element.value)
                     elif "sync" == name:
                         _settings.sync = not int(element.value)
-                    # Channel A
+                    # Channel A RX freq
                     elif "rxfreqa" == setting and element.value.get_mutable():
                         val = int(str(element.value).replace(
                             '.', '').ljust(8, '0'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chirp-20260425/chirp/drivers/tdm11.py 
new/chirp-20260501/chirp/drivers/tdm11.py
--- old/chirp-20260425/chirp/drivers/tdm11.py   2026-04-19 00:23:25.000000000 
+0200
+++ new/chirp-20260501/chirp/drivers/tdm11.py   2026-05-01 01:10:55.000000000 
+0200
@@ -507,8 +507,7 @@
 
     def _encode_tone(self, memval, mode, value, pol):
         if mode == '':
-            memval[0].set_raw(0xFF)
-            memval[1].set_raw(0xFF)
+            memval.fill_raw(b'\xff')
         elif mode == 'Tone':
             memval.set_value(int(value * 10))
         elif mode == 'DTCS':
@@ -697,6 +696,9 @@
         rf.has_name = False
         return rf
 
+    def get_raw_memory(self, number):
+        return repr(self._memobj.memory[number - 1])
+
     def get_memory(self, number):
         """Get the mem representation from the radio image"""
         _mem = self._memobj.memory[number - 1]
@@ -707,7 +709,7 @@
         # Memory number
         mem.number = number
 
-        if _mem.get_raw()[:1] == b'\xFF':
+        if _mem.get_raw()[:1] == b'\xff':
             mem.empty = True
             return mem
 
@@ -716,7 +718,7 @@
         if mem.freq == 0:
             mem.empty = True
         # tx freq can be blank
-        if _mem.txfreq.get_raw() == b'\xFF\xFF\xFF\xFF':
+        if _mem.txfreq.get_raw() == b'\xff\xff\xff\xff':
             # TX freq not set
             mem.offset = 0
             mem.duplex = 'off'
@@ -759,6 +761,7 @@
         rs = RadioSettingValueList(self._bcl_list,
                                    current_index=_mem.bcl)
         rset = RadioSetting('bcl', 'BCL', rs)
+        rset.set_doc('Busy Channel Lockout')
         mem.extra.append(rset)
 
         # Jump Freq
@@ -766,6 +769,7 @@
             self._jumpfreq_list,
             current_index=_mem.jumpfreq)
         rset = RadioSetting('jumpfreq', 'Jump Freq', rs)
+        rset.set_doc('Frequency Jumping/hopping')
         mem.extra.append(rset)
 
         # Compand
@@ -773,12 +777,14 @@
             self._compand_list,
             current_index=_mem.compand)
         rset = RadioSetting('compand', 'Compand', rs)
+        rset.set_doc('Audio Compander')
         mem.extra.append(rset)
 
         # Scramble
         rs = RadioSettingValueList(self._scramble_list,
                                    current_index=_mem.scramble)
         rset = RadioSetting('scramble', 'Scramble', rs)
+        rset.set_doc('Voice Scrambler')
         mem.extra.append(rset)
 
         return mem
@@ -787,15 +793,15 @@
         _mem = self._memobj.memory[mem.number - 1]
 
         if mem.empty:
-            _mem.set_raw('\xff' * 16)
+            _mem.fill_raw(b'\xff')
             return
 
-        _mem.set_raw('\x00' * 16)
+        _mem.fill_raw(b'\x00')
 
         _mem.rxfreq = mem.freq / 10
 
         if mem.duplex == 'off':
-            _mem.txfreq.fill_raw(b'\xFF')
+            _mem.txfreq.fill_raw(b'\xff')
         elif mem.duplex == 'split':
             _mem.txfreq = mem.offset / 10
         elif mem.duplex == '+':

++++++ chirp.obsinfo ++++++
--- /var/tmp/diff_new_pack.anLi5C/_old  2026-05-04 12:56:49.657654676 +0200
+++ /var/tmp/diff_new_pack.anLi5C/_new  2026-05-04 12:56:49.665655005 +0200
@@ -1,5 +1,5 @@
 name: chirp
-version: 20260425
-mtime: 1776551005
-commit: e7347e6a66ef8f9edb50e3e534510c2d3ae6b329
+version: 20260501
+mtime: 1777590655
+commit: 68546632f7dd949a8861c3cc3358de9747a70ef2
 

Reply via email to