not1mm 24.7.25__py3-none-any.whl → 24.7.28__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
not1mm/__main__.py CHANGED
@@ -1264,6 +1264,12 @@ class MainWindow(QtWidgets.QMainWindow):
1264
1264
  else:
1265
1265
  self.cw_speed.hide()
1266
1266
 
1267
+ if hasattr(self.contest, "ft8_handler"):
1268
+ self.contest.set_self(self)
1269
+ self.ft8.set_callback(self.contest.ft8_handler)
1270
+ else:
1271
+ self.ft8.set_callback(None)
1272
+
1267
1273
  self.clearinputs()
1268
1274
  cmd = {}
1269
1275
  cmd["cmd"] = "NEWDB"
@@ -1655,6 +1661,12 @@ class MainWindow(QtWidgets.QMainWindow):
1655
1661
  if self.cw.servertype == 1:
1656
1662
  self.cw.sendcw("\x1b4")
1657
1663
  return
1664
+ if self.rig_control:
1665
+ if self.rig_control.online:
1666
+ if self.pref.get("cwtype") == 3 and self.rig_control is not None:
1667
+ if self.rig_control.interface == "flrig":
1668
+ self.rig_control.cat.set_flrig_cw_send(False)
1669
+ self.rig_control.cat.set_flrig_cw_send(True)
1658
1670
  if event.key() == Qt.Key.Key_Up:
1659
1671
  cmd = {}
1660
1672
  cmd["cmd"] = "PREVSPOT"
@@ -2867,12 +2879,15 @@ class MainWindow(QtWidgets.QMainWindow):
2867
2879
  None
2868
2880
  """
2869
2881
 
2870
- if mode in ("CW", "CW-U", "CW-L"):
2882
+ if mode in ("CW", "CW-U", "CW-L", "CWR"):
2871
2883
  self.setmode("CW")
2872
2884
  self.radio_state["mode"] = "CW"
2873
2885
  if self.rig_control:
2874
2886
  if self.rig_control.online:
2875
2887
  self.rig_control.set_mode("CW")
2888
+ if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2889
+ if self.rig_control.interface == "flrig":
2890
+ self.rig_control.cat.set_flrig_cw_send(True)
2876
2891
  band = getband(str(self.radio_state.get("vfoa", "0.0")))
2877
2892
  self.set_band_indicator(band)
2878
2893
  self.set_window_title()
@@ -3019,7 +3034,7 @@ class MainWindow(QtWidgets.QMainWindow):
3019
3034
 
3020
3035
  def setmode(self, mode: str) -> None:
3021
3036
  """Call when the mode changes."""
3022
- if mode in ("CW", "CW-U", "CW-L"):
3037
+ if mode in ("CW", "CW-U", "CW-L", "CWR"):
3023
3038
  if self.current_mode != "CW":
3024
3039
  self.current_mode = "CW"
3025
3040
  self.sent.setText("599")
@@ -3149,7 +3164,7 @@ class MainWindow(QtWidgets.QMainWindow):
3149
3164
  info_dirty = True
3150
3165
  self.radio_state["bw"] = bw
3151
3166
 
3152
- if mode in ("CW", "CW-U", "CW-L"):
3167
+ if mode in ("CW", "CW-U", "CW-L", "CWR"):
3153
3168
  self.setmode(mode)
3154
3169
  if mode == "LSB" or mode == "USB":
3155
3170
  self.setmode("SSB")
@@ -3379,7 +3394,6 @@ def run() -> None:
3379
3394
  f"Resolved OS file system paths: MODULE_PATH {fsutils.MODULE_PATH}, USER_DATA_PATH {fsutils.USER_DATA_PATH}, CONFIG_PATH {fsutils.CONFIG_PATH}"
3380
3395
  )
3381
3396
  install_icons()
3382
- # timer.start(250)
3383
3397
  sys.exit(app.exec())
3384
3398
 
3385
3399
 
@@ -3403,15 +3417,9 @@ app = QtWidgets.QApplication(sys.argv)
3403
3417
  families = load_fonts_from_dir(os.fspath(fsutils.APP_DATA_PATH))
3404
3418
  logger.info(f"font families {families}")
3405
3419
  window = MainWindow()
3406
- # height = window.pref.get("window_height", 300)
3407
- # width = window.pref.get("window_width", 700)
3408
- # x = window.pref.get("window_x", -1)
3409
- # y = window.pref.get("window_y", -1)
3410
- # window.setGeometry(x, y, width, height)
3411
3420
  window.callsign.setFocus()
3412
3421
  window.show()
3413
- # timer = QtCore.QTimer()
3414
- # timer.timeout.connect(window.poll_radio)
3422
+
3415
3423
 
3416
3424
  if __name__ == "__main__":
3417
3425
  run()
@@ -131,10 +131,9 @@ class CAT:
131
131
 
132
132
  def sendcwxmlrpc(self, texttosend):
133
133
  """..."""
134
- print(f"{texttosend=}")
134
+ logger.debug(f"{texttosend=}")
135
135
  try:
136
136
  self.online = True
137
- self.server.rig.cwio_send(1)
138
137
  self.server.rig.cwio_text(texttosend)
139
138
  return
140
139
  except (
@@ -145,10 +144,27 @@ class CAT:
145
144
  http.client.ResponseNotReady,
146
145
  ) as exception:
147
146
  self.online = False
148
- print("sendcwxmlrpc: %s", f"{exception}")
149
- # logger.debug("sendcwxmlrpc: %s", f"{exception}")
147
+ logger.debug("%s", f"{exception}")
150
148
  return False
151
149
 
150
+ def set_flrig_cw_send(self, send: bool):
151
+ """..."""
152
+ if self.interface == "rigctld":
153
+ return
154
+ try:
155
+ self.online = True
156
+ self.server.rig.cwio_send(int(send))
157
+ except (
158
+ ConnectionRefusedError,
159
+ xmlrpc.client.Fault,
160
+ http.client.BadStatusLine,
161
+ http.client.CannotSendRequest,
162
+ http.client.ResponseNotReady,
163
+ ValueError,
164
+ ) as exception:
165
+ self.online = False
166
+ logger.debug("%s", f"{exception}")
167
+
152
168
  def get_vfo(self) -> str:
153
169
  """Poll the radio for current vfo using the interface"""
154
170
  vfo = ""
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.7.25"
3
+ __version__ = "24.7.28"
@@ -13,6 +13,8 @@ from not1mm.lib.version import __version__
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
+ ALTEREGO = None
17
+
16
18
  EXCHANGE_HINT = "1D ORG"
17
19
 
18
20
  name = "ARRL Field Day"
@@ -319,3 +321,48 @@ def cabrillo(self):
319
321
 
320
322
  def recalculate_mults(self):
321
323
  """Recalculates multipliers after change in logged qso."""
324
+
325
+
326
+ def set_self(the_outie):
327
+ """..."""
328
+ globals()["ALTEREGO"] = the_outie
329
+
330
+
331
+ def ft8_handler(the_packet: dict):
332
+ """Process FT8 QSO packets
333
+
334
+ {
335
+ 'CALL': 'KE0OG',
336
+ 'GRIDSQUARE': 'DM10AT',
337
+ 'MODE': 'FT8',
338
+ 'RST_SENT': '',
339
+ 'RST_RCVD': '',
340
+ 'QSO_DATE': '20210329',
341
+ 'TIME_ON': '183213',
342
+ 'QSO_DATE_OFF': '20210329',
343
+ 'TIME_OFF': '183213',
344
+ 'BAND': '20M',
345
+ 'FREQ': '14.074754',
346
+ 'STATION_CALLSIGN': 'K6GTE',
347
+ 'MY_GRIDSQUARE': 'DM13AT',
348
+ 'CONTEST_ID': 'ARRL-FIELD-DAY',
349
+ 'SRX_STRING': '1D UT',
350
+ 'CLASS': '1D',
351
+ 'ARRL_SECT': 'UT'
352
+ }
353
+
354
+ """
355
+ print(f"{the_packet=}")
356
+
357
+ if ALTEREGO is not None:
358
+
359
+ ALTEREGO.callsign.setText(the_packet.get("CALL"))
360
+ ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
361
+ ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
362
+ ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
363
+ ALTEREGO.contact["Exchange1"] = the_packet.get("CLASS", "ERR")
364
+ ALTEREGO.contact["Sect"] = the_packet.get("ARRL_SECT", "ERR")
365
+ ALTEREGO.contact["Mode"] = "FT8"
366
+ ALTEREGO.other_1.setText(the_packet.get("CLASS", "ERR"))
367
+ ALTEREGO.other_2.setText(the_packet.get("ARRL_SECT", "ERR"))
368
+ print(f"\n{ALTEREGO.contact=}\n")
not1mm/vfo.py CHANGED
@@ -39,6 +39,7 @@ class VfoWindow(QDockWidget):
39
39
  message_shown = False
40
40
  multicast_interface = None
41
41
  current_palette = None
42
+ device_reconnect = False
42
43
 
43
44
  def __init__(self):
44
45
  super().__init__()
@@ -64,6 +65,7 @@ class VfoWindow(QDockWidget):
64
65
  self.poll_rig_timer = QtCore.QTimer()
65
66
  self.poll_rig_timer.timeout.connect(self.poll_radio)
66
67
  self.poll_rig_timer.start(500)
68
+ self.visibilityChanged.connect(self.window_state_changed)
67
69
 
68
70
  def setDarkMode(self, dark: bool) -> None:
69
71
  """Forces a darkmode palette."""
@@ -178,27 +180,37 @@ class VfoWindow(QDockWidget):
178
180
  if "vfoknob" in data.decode().strip():
179
181
  return device
180
182
 
181
- def setup_serial(self) -> None:
183
+ def window_state_changed(self):
184
+ """Setup vfo knob if window is toggled on"""
185
+
186
+ if self.isVisible():
187
+ self.setup_serial()
188
+
189
+ def setup_serial(self, supress_msg=False) -> None:
182
190
  """
183
191
  Setup the device returned by discover_device()
184
192
  Or display message saying we didn't find one.
185
193
  """
186
194
 
195
+ if not self.isVisible():
196
+ return
197
+
187
198
  device = self.discover_device()
188
199
  if device:
189
200
  try:
190
201
  self.pico = serial.Serial("/dev/serial/by-id/" + device, 115200)
191
202
  self.pico.timeout = 100
192
203
  self.lcdNumber.setStyleSheet("QLCDNumber { color: white; }")
204
+ self.device_reconnect = True
193
205
  except OSError:
194
- if self.message_shown is False:
206
+ if self.message_shown is False and supress_msg is False:
195
207
  self.message_shown = True
196
208
  self.show_message_box(
197
209
  "Unable to locate or open the VFO knob serial device."
198
210
  )
199
211
  self.lcdNumber.setStyleSheet("QLCDNumber { color: red; }")
200
212
  else:
201
- if self.message_shown is False:
213
+ if self.message_shown is False and supress_msg is False:
202
214
  self.message_shown = True
203
215
  self.show_message_box(
204
216
  "Unable to locate or open the VFO knob serial device."
@@ -269,13 +281,14 @@ class VfoWindow(QDockWidget):
269
281
  return
270
282
  if vfo < 1700000 or vfo > 60000000:
271
283
  return
272
- if vfo != self.old_vfo:
284
+ if vfo != self.old_vfo or self.device_reconnect is True:
273
285
  self.old_vfo = vfo
274
286
  logger.debug(f"{vfo}")
275
287
  self.showNumber(vfo)
276
288
  # self.lcdNumber.display(dnum)
277
289
  # app.processEvents()
278
290
  cmd = f"F {vfo}\r"
291
+ self.device_reconnect = False
279
292
  try:
280
293
  if self.pico:
281
294
  self.pico.write(cmd.encode())
@@ -302,10 +315,14 @@ class VfoWindow(QDockWidget):
302
315
  self.showNumber(result)
303
316
  # self.lcdNumber.display(result)
304
317
  # app.processEvents()
318
+ else:
319
+ self.setup_serial(supress_msg=True)
305
320
  except OSError:
306
321
  logger.critical("Unable to write to serial device.")
322
+ self.pico = None
307
323
  except AttributeError:
308
324
  logger.critical("Unable to write to serial device.")
325
+ self.pico = None
309
326
  # app.processEvents()
310
327
 
311
328
  def show_message_box(self, message: str) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.7.25
3
+ Version: 24.7.28
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/mbridak/not1mm
@@ -223,6 +223,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
223
223
 
224
224
  ## Recent Changes
225
225
 
226
+ - [24-7-28] Second try at flrig CW.
227
+ - [24-7-25-1] Have VFO dock widget handle disconnect/reconnect events of the USB VFO knob more gracefully.
226
228
  - [24-7-25] Updated application categories for the desktop file.
227
229
  - [24-7-25] Maybe let flrig send CW... Probably not.
228
230
  - [24-7-19] Use Qt's QSettings to store window and dockwidgets states.
@@ -1,12 +1,12 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=yVBck7JN7jIc49RvxkHhMI9QphC85pLufOH7Uul738o,120573
2
+ not1mm/__main__.py,sha256=3I8eJQEfM6RHZnJmXwK_VtdU1ZPcSNPlvtgziQuzGf4,121134
3
3
  not1mm/bandmap.py,sha256=Ml5DDoybk_I56q2WLYDKE4lfmh6pb9XxW0qpl5nDFYY,32161
4
4
  not1mm/checkwindow.py,sha256=zHxkCQ4BJ-pN80dSTQdiKq8RqY4oWzJveXZhQ2bu3PY,10436
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
6
6
  not1mm/logwindow.py,sha256=pwhiwolmGnW01LF4sjlu3ywLsgfxL6KuGuKuYKYmgeY,44403
7
7
  not1mm/playsoundtest.py,sha256=_kvvOfgs-u-H4kVSiSlnDtn9HWv0RiJQybkv24CEngc,464
8
8
  not1mm/radio.py,sha256=eiB04LPMPBeMrBRI021Z7VXth66EOYb0Ujh11T9877c,3362
9
- not1mm/vfo.py,sha256=FVuRjA8LCLkt8pZ3enBuCcxLJchb1ysvaMnX0txrZSs,12038
9
+ not1mm/vfo.py,sha256=ZJYJHMUrvAWX_c4xXDOuxkbE9sFuF8THoqJXaz0e_AU,12663
10
10
  not1mm/voice_keying.py,sha256=fkexCCwWcZsXxYVAk0QGcpGbLjbS10ToxWtdKihIVM4,3152
11
11
  not1mm/data/JetBrainsMono-Regular.ttf,sha256=UOHctAKY_PzCGh7zy-6f6egnCcSK0wzmF0csBqO9lDY,203952
12
12
  not1mm/data/MASTER.SCP,sha256=CEjRJNnjBZJlhCi3UFS1qCVMjDqQwhlfk0yZ_os6myI,366153
@@ -91,7 +91,7 @@ not1mm/data/phonetics/yourcall.wav,sha256=4kheHJmCiRDL2kjhlgXQ8_u_eEMgKxiNGu5UBk
91
91
  not1mm/data/phonetics/z.wav,sha256=arafCi7fwmBLdVDI-PRyaL4U-03PIQDhffwY5noJ_2c,51768
92
92
  not1mm/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  not1mm/lib/about.py,sha256=sWycfGcruN3SaEe4JmaJ61K6D8Itq0WxpUYT-lEcmYM,416
94
- not1mm/lib/cat_interface.py,sha256=-ri3woVU_Q7r7usf5y15lm_9CQVxTgBYn2CSXt48ihg,18390
94
+ not1mm/lib/cat_interface.py,sha256=2Tzez8wO9ZATjheWkHRWTMi2jkt40W6tT7BNBbjVzuI,18839
95
95
  not1mm/lib/cwinterface.py,sha256=Q8p3pScOHczZ8ptICfH1Yu6rCEwQJLgrNwYMN76B2i8,3389
96
96
  not1mm/lib/database.py,sha256=RQoj3JsTejMiiFIN42lY3N4jrj80htftdoFeRqVKnKs,42480
97
97
  not1mm/lib/edit_contact.py,sha256=Ki9bGPpqyQQBB1cU8VIBDCal3lbXeQ6qxhzklmhE2_w,353
@@ -109,7 +109,7 @@ not1mm/lib/plugin_common.py,sha256=AAKBPCXzTWZJb-h08uPNnHVG7bSCg7kwukc211gFivY,8
109
109
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
110
110
  not1mm/lib/settings.py,sha256=MWiKXbasaFbzeHTjfzTaTqbCBrIijudP_-0a5jNmUAA,9265
111
111
  not1mm/lib/super_check_partial.py,sha256=p5l3u2ZOCBtlWgbvskC50FpuoaIpR07tfC6zTdRWbh4,2334
112
- not1mm/lib/version.py,sha256=PYMrnVV28Le94nhMneSj2NtJufXaags26QC8S2zkTwA,48
112
+ not1mm/lib/version.py,sha256=b0kTxuIhWdsBX0VMhy3fn3YyF3XFCxs03DFSvGpgZjU,48
113
113
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
114
114
  not1mm/plugins/10_10_fall_cw.py,sha256=IttjX1yy4nDdACGsiYlPteFG8eVseX_WtoFio6bqHE8,10953
115
115
  not1mm/plugins/10_10_spring_cw.py,sha256=ThCptdM3dX4ywhoy2JRcOEyHSqcJolFaT7O_PYzM1Mg,10958
@@ -119,7 +119,7 @@ not1mm/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
119
  not1mm/plugins/arrl_10m.py,sha256=EyNRb3Sm0Qb-GVm0p05EnadlHisVh7y-sKTBP2ddMLo,13768
120
120
  not1mm/plugins/arrl_dx_cw.py,sha256=LVnYDNFEUiIpQ1TlhOCcRK7JNwH5XPO5WzUoApSUMTY,13802
121
121
  not1mm/plugins/arrl_dx_ssb.py,sha256=fUFzuNbCAfA5sQSYm8ISV3P9Z_2xnuKeOdO6E66zn1k,13805
122
- not1mm/plugins/arrl_field_day.py,sha256=OSro24LsSVW41yecKziWQMjflJbo62P8C53Q3M3-Lb0,10052
122
+ not1mm/plugins/arrl_field_day.py,sha256=bMBrww0-zBnkrLY3JsG1tXumeWGDWgLi1QZiPtriFqE,11387
123
123
  not1mm/plugins/arrl_rtty_ru.py,sha256=hKUS4isjdXo3EYxQrsqsDupPp2chW8fpoWj0T1pTgJ4,7994
124
124
  not1mm/plugins/arrl_ss_cw.py,sha256=4yN68xZMuJRaSUfdiY4hafC07A3lifl5q6DEUZ-oYPQ,13080
125
125
  not1mm/plugins/arrl_ss_phone.py,sha256=Yzc5sNjrY8TlnozbYF6k8hbEamyDuUAD_3-BNqHgXqY,13068
@@ -145,9 +145,9 @@ not1mm/plugins/naqp_ssb.py,sha256=VLWVrSzI0UP1AhSXYn61eZ7or1rz6a_pS_xCKfgS4Jw,11
145
145
  not1mm/plugins/phone_weekly_test.py,sha256=fLpMe03WB9_KgRl6vMgQQt_aktFdqfNt2Sw81CTRAUs,12325
146
146
  not1mm/plugins/stew_perry_topband.py,sha256=CKBQbYl4ETxhXJd2dma4fg_C5pag_s7Nf61SCztZtqE,10668
147
147
  not1mm/plugins/winter_field_day.py,sha256=4rcfRtobwjHO6BNL3WOTHzBmyyeuX79BNGBG8PfjrI8,10238
148
- not1mm-24.7.25.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
149
- not1mm-24.7.25.dist-info/METADATA,sha256=jhPGTuyuymZB6odifjgB2hq_PeLj9JhgQX8PSeyT7QE,29304
150
- not1mm-24.7.25.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
151
- not1mm-24.7.25.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
152
- not1mm-24.7.25.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
153
- not1mm-24.7.25.dist-info/RECORD,,
148
+ not1mm-24.7.28.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
149
+ not1mm-24.7.28.dist-info/METADATA,sha256=KLA7jJ_PK9Xk5W2b7U2UO451JFnOznjizaMPmMTdsDA,29447
150
+ not1mm-24.7.28.dist-info/WHEEL,sha256=Rp8gFpivVLXx-k3U95ozHnQw8yDcPxmhOpn_Gx8d5nc,91
151
+ not1mm-24.7.28.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
152
+ not1mm-24.7.28.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
153
+ not1mm-24.7.28.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5