not1mm 25.4.21__py3-none-any.whl → 25.4.25__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
@@ -3192,12 +3192,12 @@ class MainWindow(QtWidgets.QMainWindow):
3192
3192
  self.pref.get("CAT_ip", "127.0.0.1"),
3193
3193
  int(self.pref.get("CAT_port", 12345)),
3194
3194
  )
3195
- self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3196
- self.rig_control.moveToThread(self.radio_thread)
3197
- self.radio_thread.started.connect(self.rig_control.run)
3198
- self.radio_thread.finished.connect(self.rig_control.deleteLater)
3199
- self.rig_control.poll_callback.connect(self.poll_radio)
3200
- self.radio_thread.start()
3195
+ # self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3196
+ # self.rig_control.moveToThread(self.radio_thread)
3197
+ # self.radio_thread.started.connect(self.rig_control.run)
3198
+ # self.radio_thread.finished.connect(self.rig_control.deleteLater)
3199
+ # self.rig_control.poll_callback.connect(self.poll_radio)
3200
+ # self.radio_thread.start()
3201
3201
 
3202
3202
  elif self.pref.get("userigctld", False) is True:
3203
3203
  logger.debug(
@@ -3209,24 +3209,24 @@ class MainWindow(QtWidgets.QMainWindow):
3209
3209
  self.pref.get("CAT_ip", "127.0.0.1"),
3210
3210
  int(self.pref.get("CAT_port", 4532)),
3211
3211
  )
3212
- self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3213
- self.rig_control.moveToThread(self.radio_thread)
3214
- self.radio_thread.started.connect(self.rig_control.run)
3215
- self.radio_thread.finished.connect(self.rig_control.deleteLater)
3216
- self.rig_control.poll_callback.connect(self.poll_radio)
3217
- self.radio_thread.start()
3212
+ # self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3213
+ # self.rig_control.moveToThread(self.radio_thread)
3214
+ # self.radio_thread.started.connect(self.rig_control.run)
3215
+ # self.radio_thread.finished.connect(self.rig_control.deleteLater)
3216
+ # self.rig_control.poll_callback.connect(self.poll_radio)
3217
+ # self.radio_thread.start()
3218
3218
  else:
3219
3219
  self.rig_control = Radio(
3220
3220
  "fake",
3221
3221
  self.pref.get("CAT_ip", "127.0.0.1"),
3222
3222
  int(self.pref.get("CAT_port", 0000)),
3223
3223
  )
3224
- self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3225
- self.rig_control.moveToThread(self.radio_thread)
3226
- self.radio_thread.started.connect(self.rig_control.run)
3227
- self.radio_thread.finished.connect(self.rig_control.deleteLater)
3228
- self.rig_control.poll_callback.connect(self.poll_radio)
3229
- self.radio_thread.start()
3224
+ self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
3225
+ self.rig_control.moveToThread(self.radio_thread)
3226
+ self.radio_thread.started.connect(self.rig_control.run)
3227
+ self.radio_thread.finished.connect(self.rig_control.deleteLater)
3228
+ self.rig_control.poll_callback.connect(self.poll_radio)
3229
+ self.radio_thread.start()
3230
3230
 
3231
3231
  self.cw = None
3232
3232
  if (
@@ -3925,13 +3925,10 @@ class MainWindow(QtWidgets.QMainWindow):
3925
3925
  self.contact["Band"] = get_logged_band(str(vfo))
3926
3926
  self.set_band_indicator(band)
3927
3927
 
3928
- if self.rig_control:
3929
- if self.rig_control.online:
3930
- self.rig_control.get_modes()
3931
-
3932
3928
  if self.radio_state.get("mode") != mode:
3933
3929
  info_dirty = True
3934
- self.radio_state["mode"] = mode
3930
+ if "set_freq:" not in mode:
3931
+ self.radio_state["mode"] = mode
3935
3932
 
3936
3933
  if self.radio_state.get("bw") != bw:
3937
3934
  info_dirty = True
@@ -3959,26 +3956,26 @@ class MainWindow(QtWidgets.QMainWindow):
3959
3956
  ):
3960
3957
  self.setmode("RTTY")
3961
3958
 
3962
- cmd = {}
3963
- cmd["cmd"] = "RADIO_STATE"
3964
- cmd["band"] = band
3965
- cmd["vfoa"] = vfo
3966
- cmd["mode"] = mode
3967
- cmd["bw"] = bw
3968
3959
  if self.bandmap_window:
3960
+ cmd = {}
3961
+ cmd["cmd"] = "RADIO_STATE"
3962
+ cmd["band"] = band
3963
+ cmd["vfoa"] = vfo
3964
+ cmd["mode"] = mode
3965
+ cmd["bw"] = bw
3969
3966
  self.bandmap_window.msg_from_main(cmd)
3970
3967
  if info_dirty:
3971
3968
  try:
3972
3969
  logger.debug("VFO: %s MODE: %s BW: %s", vfo, mode, bw)
3973
3970
  self.set_window_title()
3974
- cmd = {}
3975
- cmd["cmd"] = "RADIO_STATE"
3976
- cmd["band"] = band
3977
- cmd["vfoa"] = vfo
3978
- cmd["mode"] = mode
3979
- cmd["bw"] = bw
3980
- if self.bandmap_window:
3981
- self.bandmap_window.msg_from_main(cmd)
3971
+ # cmd = {}
3972
+ # cmd["cmd"] = "RADIO_STATE"
3973
+ # cmd["band"] = band
3974
+ # cmd["vfoa"] = vfo
3975
+ # cmd["mode"] = mode
3976
+ # cmd["bw"] = bw
3977
+ # if self.bandmap_window:
3978
+ # self.bandmap_window.msg_from_main(cmd)
3982
3979
  if self.n1mm:
3983
3980
  self.n1mm.radio_info["Freq"] = vfo[:-1]
3984
3981
  self.n1mm.radio_info["TXFreq"] = vfo[:-1]
not1mm/bandmap.py CHANGED
@@ -385,7 +385,7 @@ class BandMapWindow(QDockWidget):
385
385
 
386
386
  def msg_from_main(self, packet):
387
387
  """"""
388
- if self.active is False:
388
+ if self.active is False or not self.isVisible():
389
389
  return
390
390
  if packet.get("cmd", "") == "RADIO_STATE":
391
391
  self.set_band(packet.get("band") + "m", False)
@@ -688,7 +688,7 @@ class BandMapWindow(QDockWidget):
688
688
  def update_stations(self):
689
689
  """doc"""
690
690
  self.update_timer.setInterval(UPDATE_INTERVAL)
691
- if self.active is False:
691
+ if self.active is False or not self.isVisible():
692
692
  return
693
693
  self.clear_all_callsign_from_scene()
694
694
  self.spot_aging()
@@ -271,6 +271,11 @@
271
271
  <property name="text">
272
272
  <string>ARRL VHF SEP</string>
273
273
  </property>
274
+ </item>
275
+ <item>
276
+ <property name="text">
277
+ <string>VHF SPRINT</string>
278
+ </property>
274
279
  </item>
275
280
  <item>
276
281
  <property name="text">
@@ -71,6 +71,7 @@ class CAT:
71
71
  self.host = host
72
72
  self.port = port
73
73
  self.online = False
74
+ self.rigctld_bw = "0"
74
75
  self.fake_radio = {
75
76
  "vfo": "14032000",
76
77
  "mode": "CW",
@@ -121,6 +122,7 @@ class CAT:
121
122
 
122
123
  def __initialize_rigctrld(self):
123
124
  try:
125
+ logger.debug("Connecting to rigctrld")
124
126
  self.rigctrlsocket = socket.socket()
125
127
  self.rigctrlsocket.settimeout(0.5)
126
128
  self.rigctrlsocket.connect((self.host, self.port))
@@ -154,7 +156,7 @@ class CAT:
154
156
  except (socket.error, UnicodeDecodeError):
155
157
  ...
156
158
  self.rigctrlsocket.settimeout(0.5)
157
- logger.debug("%s", dump)
159
+ # logger.debug("%s", dump)
158
160
  return dump
159
161
 
160
162
  def sendvoicememory(self, memoryspot=1):
@@ -167,7 +169,8 @@ class CAT:
167
169
  try:
168
170
  self.online = True
169
171
  self.rigctrlsocket.send(bytes(f"+\\send_voice_mem {memoryspot}\n", "utf-8"))
170
- _ = self.__get_serial_string()
172
+ info = self.__get_serial_string()
173
+ logger.debug("%s", info)
171
174
  return
172
175
  except socket.error as exception:
173
176
  self.online = False
@@ -189,7 +192,8 @@ class CAT:
189
192
  try:
190
193
  self.online = True
191
194
  self.rigctrlsocket.send(bytes(f"b{texttosend}\n", "utf-8"))
192
- _ = self.__get_serial_string()
195
+ info = self.__get_serial_string()
196
+ logger.debug("%s", info)
193
197
  return True
194
198
  except socket.error as exception:
195
199
  self.online = False
@@ -205,7 +209,8 @@ class CAT:
205
209
  try:
206
210
  self.online = True
207
211
  self.rigctrlsocket.send(bytes(f"L KEYSPD {speed}\n", "utf-8"))
208
- _ = self.__get_serial_string()
212
+ info = self.__get_serial_string()
213
+ logger.debug("%s", info)
209
214
  return
210
215
  except socket.error as exception:
211
216
  self.online = False
@@ -307,6 +312,7 @@ class CAT:
307
312
  self.online = True
308
313
  self.rigctrlsocket.send(b"|f\n")
309
314
  report = self.__get_serial_string().strip()
315
+ logger.debug("%s", report)
310
316
  if "get_freq:|" in report and "RPRT 0" in report:
311
317
  seg_rpt = report.split("|")
312
318
  return seg_rpt[1].split(" ")[1]
@@ -361,8 +367,10 @@ class CAT:
361
367
  self.rigctrlsocket.send(b"|m\n")
362
368
  # get_mode:|Mode: CW|Passband: 500|RPRT 0
363
369
  report = self.__get_serial_string().strip()
370
+ logger.debug("%s", report)
364
371
  if "get_mode:|" in report and "RPRT 0" in report:
365
372
  seg_rpt = report.split("|")
373
+ self.rigctld_bw = seg_rpt[2].split(" ")[1]
366
374
  return seg_rpt[1].split(" ")[1]
367
375
  except IndexError as exception:
368
376
  logger.debug("%s", f"{exception}")
@@ -404,25 +412,27 @@ class CAT:
404
412
 
405
413
  def __getbw_rigctld(self):
406
414
  """return bandwidth"""
407
- if self.rigctrlsocket:
408
- try:
409
- self.online = True
410
- self.rigctrlsocket.send(b"|m\n")
411
- # get_mode:|Mode: CW|Passband: 500|RPRT 0
412
- report = self.__get_serial_string().strip()
413
- if "get_mode:|" in report and "RPRT 0" in report:
414
- seg_rpt = report.split("|")
415
- return seg_rpt[2].split(" ")[1]
416
-
417
- except IndexError as exception:
418
- logger.debug("%s", f"{exception}")
419
- except socket.error as exception:
420
- self.online = False
421
- logger.debug("%s", f"{exception}")
422
- self.rigctrlsocket = None
423
- return ""
424
- self.__initialize_rigctrld()
425
- return ""
415
+ return self.rigctld_bw
416
+ # if self.rigctrlsocket:
417
+ # try:
418
+ # self.online = True
419
+ # self.rigctrlsocket.send(b"|m\n")
420
+ # # get_mode:|Mode: CW|Passband: 500|RPRT 0
421
+ # report = self.__get_serial_string().strip()
422
+ # logger.debug("%s", report)
423
+ # if "get_mode:|" in report and "RPRT 0" in report:
424
+ # seg_rpt = report.split("|")
425
+ # return seg_rpt[2].split(" ")[1]
426
+
427
+ # except IndexError as exception:
428
+ # logger.debug("%s", f"{exception}")
429
+ # except socket.error as exception:
430
+ # self.online = False
431
+ # logger.debug("%s", f"{exception}")
432
+ # self.rigctrlsocket = None
433
+ # return ""
434
+ # self.__initialize_rigctrld()
435
+ # return ""
426
436
 
427
437
  def get_power(self):
428
438
  """Get power level from rig"""
@@ -455,6 +465,7 @@ class CAT:
455
465
  self.rigctrlsocket.send(b"|l RFPOWER\n")
456
466
  # get_level: RFPOWER|0.000000|RPRT 0
457
467
  report = self.__get_serial_string().strip()
468
+ logger.debug("%s", report)
458
469
  if "get_level: RFPOWER|" in report and "RPRT 0" in report:
459
470
  seg_rpt = report.split("|")
460
471
  return int(float(seg_rpt[1]) * 100)
@@ -588,8 +599,9 @@ class CAT:
588
599
  if self.rigctrlsocket:
589
600
  try:
590
601
  self.online = True
591
- self.rigctrlsocket.send(bytes(f"F {freq}\n", "utf-8"))
592
- _ = self.__get_serial_string()
602
+ self.rigctrlsocket.send(bytes(f"|F {freq}\n", "utf-8"))
603
+ info = self.__get_serial_string()
604
+ logger.debug("%s", info)
593
605
  return True
594
606
  except socket.error as exception:
595
607
  self.online = False
@@ -634,11 +646,12 @@ class CAT:
634
646
  if self.rigctrlsocket:
635
647
  try:
636
648
  self.online = True
637
- logger.debug(f"\nM {mode} 0\n")
638
- self.rigctrlsocket.send(bytes(f"\nM {mode} 0\n", "utf-8"))
639
- if self.__get_serial_string() != "RPRT 0\n":
640
- self.rigctrlsocket.send(bytes(f"\nM {mode} 0\n", "utf-8"))
641
- _ = self.__get_serial_string()
649
+ # logger.debug(f"\nM {mode} 0\n")
650
+ self.rigctrlsocket.send(bytes(f"\n|M {mode} 0\n", "utf-8"))
651
+ # if self.__get_serial_string() != "RPRT 0\n":
652
+ # self.rigctrlsocket.send(bytes(f"\n|M {mode} 0\n", "utf-8"))
653
+ info = self.__get_serial_string()
654
+ logger.debug("%s", info)
642
655
  return True
643
656
  except socket.error as exception:
644
657
  self.online = False
@@ -676,11 +689,12 @@ class CAT:
676
689
 
677
690
  def __setpower_rigctld(self, power):
678
691
  if power.isnumeric() and int(power) >= 1 and int(power) <= 100:
679
- rig_cmd = bytes(f"L RFPOWER {str(float(power) / 100)}\n", "utf-8")
692
+ rig_cmd = bytes(f"|L RFPOWER {str(float(power) / 100)}\n", "utf-8")
680
693
  try:
681
694
  self.online = True
682
695
  self.rigctrlsocket.send(rig_cmd)
683
- _ = self.__get_serial_string()
696
+ info = self.__get_serial_string()
697
+ logger.debug("%s", info)
684
698
  except socket.error:
685
699
  self.online = False
686
700
  self.rigctrlsocket = None
@@ -706,12 +720,13 @@ class CAT:
706
720
  # Get 'PTT' status.
707
721
  # Returns PTT as a value in set_ptt above.
708
722
 
709
- rig_cmd = bytes("T 1\n", "utf-8")
723
+ rig_cmd = bytes("|T 1\n", "utf-8")
710
724
  logger.debug("%s", f"{rig_cmd}")
711
725
  try:
712
726
  self.online = True
713
727
  self.rigctrlsocket.send(rig_cmd)
714
- _ = self.__get_serial_string()
728
+ info = self.__get_serial_string()
729
+ logger.debug("%s", info)
715
730
  except socket.error:
716
731
  self.online = False
717
732
  self.rigctrlsocket = None
@@ -745,12 +760,13 @@ class CAT:
745
760
 
746
761
  def __ptt_off_rigctld(self):
747
762
  """Toggle PTT state off"""
748
- rig_cmd = bytes("T 0\n", "utf-8")
763
+ rig_cmd = bytes("|T 0\n", "utf-8")
749
764
  logger.debug("%s", f"{rig_cmd}")
750
765
  try:
751
766
  self.online = True
752
767
  self.rigctrlsocket.send(rig_cmd)
753
- _ = self.__get_serial_string()
768
+ into = self.__get_serial_string()
769
+ logger.debug("%s", into)
754
770
  except socket.error:
755
771
  self.online = False
756
772
  self.rigctrlsocket = None
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.4.21"
3
+ __version__ = "25.4.25"
@@ -82,13 +82,13 @@ def init_contest(self):
82
82
 
83
83
  def interface(self):
84
84
  """Setup user interface"""
85
- self.field1.show()
86
- self.field2.show()
85
+ self.field1.hide()
86
+ self.field2.hide()
87
87
  self.field3.show()
88
88
  self.field4.show()
89
89
  self.snt_label.setText("SNT")
90
90
  self.field1.setAccessibleName("RST Sent")
91
- self.other_label.setText("SentNR")
91
+ self.other_label.setText("Sent Grid")
92
92
  self.field3.setAccessibleName("Sent Grid")
93
93
  self.exch_label.setText("Grid")
94
94
  self.field4.setAccessibleName("Gridsquare")
@@ -101,9 +101,7 @@ def reset_label(self):
101
101
  def set_tab_next(self):
102
102
  """Set TAB Advances"""
103
103
  self.tab_next = {
104
- self.callsign: self.sent,
105
- self.sent: self.receive,
106
- self.receive: self.other_1,
104
+ self.callsign: self.other_1,
107
105
  self.other_1: self.other_2,
108
106
  self.other_2: self.callsign,
109
107
  }
@@ -113,10 +111,8 @@ def set_tab_prev(self):
113
111
  """Set TAB Advances"""
114
112
  self.tab_prev = {
115
113
  self.callsign: self.other_2,
116
- self.sent: self.callsign,
117
- self.receive: self.sent,
118
- self.other_1: self.receive,
119
114
  self.other_2: self.other_1,
115
+ self.other_1: self.callsign,
120
116
  }
121
117
 
122
118
 
@@ -50,13 +50,13 @@ def init_contest(self):
50
50
 
51
51
  def interface(self):
52
52
  """Setup user interface"""
53
- self.field1.show()
54
- self.field2.show()
53
+ self.field1.hide()
54
+ self.field2.hide()
55
55
  self.field3.show()
56
56
  self.field4.show()
57
57
  self.snt_label.setText("SNT")
58
58
  self.field1.setAccessibleName("RST Sent")
59
- self.other_label.setText("SentNR")
59
+ self.other_label.setText("Sent Grid")
60
60
  self.field3.setAccessibleName("Sent Grid")
61
61
  self.exch_label.setText("Grid")
62
62
  self.field4.setAccessibleName("Gridsquare")
@@ -69,9 +69,7 @@ def reset_label(self):
69
69
  def set_tab_next(self):
70
70
  """Set TAB Advances"""
71
71
  self.tab_next = {
72
- self.callsign: self.sent,
73
- self.sent: self.receive,
74
- self.receive: self.other_1,
72
+ self.callsign: self.other_1,
75
73
  self.other_1: self.other_2,
76
74
  self.other_2: self.callsign,
77
75
  }
@@ -81,10 +79,8 @@ def set_tab_prev(self):
81
79
  """Set TAB Advances"""
82
80
  self.tab_prev = {
83
81
  self.callsign: self.other_2,
84
- self.sent: self.callsign,
85
- self.receive: self.sent,
86
- self.other_1: self.receive,
87
82
  self.other_2: self.other_1,
83
+ self.other_1: self.callsign,
88
84
  }
89
85
 
90
86
 
@@ -50,13 +50,13 @@ def init_contest(self):
50
50
 
51
51
  def interface(self):
52
52
  """Setup user interface"""
53
- self.field1.show()
54
- self.field2.show()
53
+ self.field1.hide()
54
+ self.field2.hide()
55
55
  self.field3.show()
56
56
  self.field4.show()
57
57
  self.snt_label.setText("SNT")
58
58
  self.field1.setAccessibleName("RST Sent")
59
- self.other_label.setText("SentNR")
59
+ self.other_label.setText("Sent Grid")
60
60
  self.field3.setAccessibleName("Sent Grid")
61
61
  self.exch_label.setText("Grid")
62
62
  self.field4.setAccessibleName("Gridsquare")
@@ -69,9 +69,7 @@ def reset_label(self):
69
69
  def set_tab_next(self):
70
70
  """Set TAB Advances"""
71
71
  self.tab_next = {
72
- self.callsign: self.sent,
73
- self.sent: self.receive,
74
- self.receive: self.other_1,
72
+ self.callsign: self.other_1,
75
73
  self.other_1: self.other_2,
76
74
  self.other_2: self.callsign,
77
75
  }
@@ -81,10 +79,8 @@ def set_tab_prev(self):
81
79
  """Set TAB Advances"""
82
80
  self.tab_prev = {
83
81
  self.callsign: self.other_2,
84
- self.sent: self.callsign,
85
- self.receive: self.sent,
86
- self.other_1: self.receive,
87
82
  self.other_2: self.other_1,
83
+ self.other_1: self.callsign,
88
84
  }
89
85
 
90
86
 
not1mm/plugins/cwt.py CHANGED
@@ -11,10 +11,11 @@
11
11
  # Bands: 160, 80, 40, 20, 15, 10m
12
12
  # Classes: Single Op (QRP/Low/High)
13
13
  # Max power: HP: >100 watts
14
- # LP: 100 watts
15
- # QRP: 5 watts
16
- # Exchange: Member: Name + Member No./"CWA"
17
- # non-Member: Name + (state/province/country)
14
+ # LP: 100 watts
15
+ # QRP: 5 watts
16
+ # Exchange:
17
+ # Member: Name + Member No./"CWA"
18
+ # Non-Member: Name + (state/province/country)
18
19
  # Work stations: Once per band
19
20
  # QSO Points: 1 point per QSO
20
21
  # Multipliers: Each call once
@@ -72,16 +73,16 @@ def init_contest(self):
72
73
 
73
74
  def interface(self):
74
75
  """Setup user interface"""
75
- self.field1.show()
76
- self.field2.show()
76
+ self.field1.hide()
77
+ self.field2.hide()
77
78
  self.field3.show()
78
79
  self.field4.show()
79
80
  self.snt_label.setText("SNT")
80
81
  self.field1.setAccessibleName("RST Sent")
81
82
  self.other_label.setText("Name")
82
83
  self.field3.setAccessibleName("Name")
83
- self.exch_label.setText("ST/DX/#")
84
- self.field4.setAccessibleName("State D X or Number")
84
+ self.exch_label.setText("Number or State")
85
+ self.field4.setAccessibleName("Number or State")
85
86
 
86
87
 
87
88
  def reset_label(self):
@@ -91,9 +92,7 @@ def reset_label(self):
91
92
  def set_tab_next(self):
92
93
  """Set TAB Advances"""
93
94
  self.tab_next = {
94
- self.callsign: self.sent,
95
- self.sent: self.field2.findChild(QtWidgets.QLineEdit),
96
- self.receive: self.other_1,
95
+ self.callsign: self.other_1,
97
96
  self.other_1: self.other_2,
98
97
  self.other_2: self.callsign,
99
98
  }
@@ -103,9 +102,7 @@ def set_tab_prev(self):
103
102
  """Set TAB Advances"""
104
103
  self.tab_prev = {
105
104
  self.callsign: self.other_2,
106
- self.sent: self.callsign,
107
- self.receive: self.sent,
108
- self.other_1: self.receive,
105
+ self.other_1: self.callsign,
109
106
  self.other_2: self.other_1,
110
107
  }
111
108
 
@@ -0,0 +1,624 @@
1
+ """VHF SPRINT"""
2
+
3
+ # Single band VHF Sprint. Exchange is 4-digit grid square.
4
+ # 1 point per each valid QSO multiplied by number of grid squares worked.
5
+ # Cabrillo name: VHF-SPRINT
6
+
7
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member
8
+
9
+ import datetime
10
+ import logging
11
+
12
+ from pathlib import Path
13
+ from PyQt6 import QtWidgets
14
+
15
+ from not1mm.lib.ham_utility import get_logged_band
16
+ from not1mm.lib.plugin_common import gen_adif, get_points, online_score_xml
17
+ from not1mm.lib.version import __version__
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+ ALTEREGO = None
22
+ EXCHANGE_HINT = "4-character grid square"
23
+
24
+ name = "VHF SPRINT"
25
+ mode = "BOTH" # CW SSB BOTH RTTY
26
+ cabrillo_name = "VHF-SPRINT"
27
+
28
+ columns = [
29
+ "YYYY-MM-DD HH:MM:SS",
30
+ "Call",
31
+ "Freq",
32
+ "Mode",
33
+ "SentNr",
34
+ "RcvNr",
35
+ "PTS",
36
+ ]
37
+
38
+ advance_on_space = [True, True, True, True, True]
39
+
40
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
41
+ dupe_type = 3
42
+
43
+
44
+ def init_contest(self):
45
+ """setup plugin"""
46
+ set_tab_next(self)
47
+ set_tab_prev(self)
48
+ interface(self)
49
+ self.next_field = self.other_2
50
+
51
+
52
+ def interface(self):
53
+ """Setup user interface"""
54
+ self.field1.hide()
55
+ self.field2.hide()
56
+ self.field3.show()
57
+ self.field4.show()
58
+ self.snt_label.setText("SNT")
59
+ self.field1.setAccessibleName("RST Sent")
60
+ self.other_label.setText("Sent Grid")
61
+ self.field3.setAccessibleName("Sent Grid")
62
+ self.exch_label.setText("Grid")
63
+ self.field4.setAccessibleName("Gridsquare")
64
+
65
+
66
+ modifying
67
+
68
+
69
+ def reset_label(self):
70
+ """reset label after field cleared"""
71
+
72
+
73
+ def set_tab_next(self):
74
+ """Set TAB Advances"""
75
+ self.tab_next = {
76
+ self.callsign: self.other_1,
77
+ self.other_1: self.other_2,
78
+ self.other_2: self.callsign,
79
+ }
80
+
81
+
82
+ def set_tab_prev(self):
83
+ """Set TAB Advances"""
84
+ self.tab_prev = {
85
+ self.callsign: self.other_2,
86
+ self.other_2: self.other_1,
87
+ self.other_1: self.callsign,
88
+ }
89
+
90
+
91
+ def validate(self):
92
+ """doc"""
93
+ # exchange = self.other_2.text().upper().split()
94
+ # if len(exchange) == 3:
95
+ # if exchange[0].isalpha() and exchange[1].isdigit() and exchange[2].isalpha():
96
+ # return True
97
+ # return False
98
+ return True
99
+
100
+
101
+ def set_contact_vars(self):
102
+ """Contest Specific"""
103
+ self.contact["SNT"] = self.sent.text()
104
+ self.contact["RCV"] = self.receive.text()
105
+ self.contact["NR"] = self.other_2.text().upper()
106
+ self.contact["SentNr"] = self.other_1.text()
107
+
108
+
109
+ def predupe(self):
110
+ """called after callsign entered"""
111
+
112
+
113
+ def prefill(self):
114
+ """Fill sentnr"""
115
+ result = self.database.get_serial()
116
+ serial_nr = str(result.get("serial_nr", "1")).zfill(3)
117
+ if serial_nr == "None":
118
+ serial_nr = "001"
119
+
120
+ exchange = self.contest_settings.get("SentExchange", "").replace("#", serial_nr)
121
+ if len(self.other_1.text()) == 0:
122
+ self.other_1.setText(exchange)
123
+
124
+
125
+ def points(self):
126
+ """Calc point"""
127
+
128
+ # QSO Points: 1 point per QSO
129
+
130
+ if self.contact_is_dupe > 0:
131
+ return 0
132
+
133
+ _band = self.contact.get("Band", "")
134
+ if _band in ["50", "144"]:
135
+ return 1
136
+ if _band in ["222", "432"]:
137
+ return 1
138
+ if _band in ["902", "1296"]:
139
+ return 1
140
+ if _band in ["2300+"]:
141
+ return 1
142
+ return 0
143
+
144
+
145
+ def show_mults(self):
146
+ """Return display string for mults"""
147
+ # Multipliers: Grid squares once per band
148
+
149
+ dx = 0
150
+
151
+ sql = (
152
+ "select count(DISTINCT(NR || ':' || Band)) as mult_count "
153
+ f"from dxlog where ContestNR = {self.database.current_contest} and typeof(NR) = 'text';"
154
+ )
155
+ result = self.database.exec_sql(sql)
156
+
157
+ if result:
158
+ dx = result.get("mult_count", 0)
159
+
160
+ return dx
161
+
162
+
163
+ def show_qso(self):
164
+ """Return qso count"""
165
+ result = self.database.fetch_qso_count()
166
+ if result:
167
+ return int(result.get("qsos", 0))
168
+ return 0
169
+
170
+
171
+ def calc_score(self):
172
+ """Return calculated score"""
173
+ # Multipliers: Each US State + DC once per mode
174
+ _points = get_points(self)
175
+ _mults = show_mults(self)
176
+ _power_mult = 1
177
+ # if self.contest_settings.get("PowerCategory", "") == "QRP":
178
+ # _power_mult = 2
179
+ return _points * _power_mult * _mults
180
+
181
+
182
+ def adif(self):
183
+ """Call the generate ADIF function"""
184
+ gen_adif(self, cabrillo_name)
185
+
186
+
187
+ def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
188
+ """"""
189
+ print(
190
+ line_to_output.encode(file_encoding, errors="ignore").decode(),
191
+ end=ending,
192
+ file=file_descriptor,
193
+ )
194
+
195
+
196
+ def cabrillo(self, file_encoding):
197
+ """Generates Cabrillo file. Maybe."""
198
+ # https://www.cqwpx.com/cabrillo.htm
199
+ logger.debug("******Cabrillo*****")
200
+ logger.debug("Station: %s", f"{self.station}")
201
+ logger.debug("Contest: %s", f"{self.contest_settings}")
202
+ now = datetime.datetime.now()
203
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
204
+ filename = (
205
+ str(Path.home())
206
+ + "/"
207
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
208
+ )
209
+ logger.debug("%s", filename)
210
+ log = self.database.fetch_all_contacts_asc()
211
+ try:
212
+ with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
213
+ output_cabrillo_line(
214
+ "START-OF-LOG: 3.0",
215
+ "\r\n",
216
+ file_descriptor,
217
+ file_encoding,
218
+ )
219
+ output_cabrillo_line(
220
+ f"CREATED-BY: Not1MM v{__version__}",
221
+ "\r\n",
222
+ file_descriptor,
223
+ file_encoding,
224
+ )
225
+ output_cabrillo_line(
226
+ f"CONTEST: {cabrillo_name}",
227
+ "\r\n",
228
+ file_descriptor,
229
+ file_encoding,
230
+ )
231
+ if self.station.get("Club", ""):
232
+ output_cabrillo_line(
233
+ f"CLUB: {self.station.get('Club', '').upper()}",
234
+ "\r\n",
235
+ file_descriptor,
236
+ file_encoding,
237
+ )
238
+ output_cabrillo_line(
239
+ f"CALLSIGN: {self.station.get('Call','')}",
240
+ "\r\n",
241
+ file_descriptor,
242
+ file_encoding,
243
+ )
244
+ output_cabrillo_line(
245
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
246
+ "\r\n",
247
+ file_descriptor,
248
+ file_encoding,
249
+ )
250
+ output_cabrillo_line(
251
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
252
+ "\r\n",
253
+ file_descriptor,
254
+ file_encoding,
255
+ )
256
+ output_cabrillo_line(
257
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
258
+ "\r\n",
259
+ file_descriptor,
260
+ file_encoding,
261
+ )
262
+ output_cabrillo_line(
263
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
264
+ "\r\n",
265
+ file_descriptor,
266
+ file_encoding,
267
+ )
268
+ mode = self.contest_settings.get("ModeCategory", "")
269
+ if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
270
+ mode = "MIXED"
271
+ output_cabrillo_line(
272
+ f"CATEGORY-MODE: {mode}",
273
+ "\r\n",
274
+ file_descriptor,
275
+ file_encoding,
276
+ )
277
+ output_cabrillo_line(
278
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
279
+ "\r\n",
280
+ file_descriptor,
281
+ file_encoding,
282
+ )
283
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
284
+ output_cabrillo_line(
285
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
286
+ "\r\n",
287
+ file_descriptor,
288
+ file_encoding,
289
+ )
290
+ output_cabrillo_line(
291
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
292
+ "\r\n",
293
+ file_descriptor,
294
+ file_encoding,
295
+ )
296
+ output_cabrillo_line(
297
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
298
+ "\r\n",
299
+ file_descriptor,
300
+ file_encoding,
301
+ )
302
+
303
+ output_cabrillo_line(
304
+ f"CLAIMED-SCORE: {calc_score(self)}",
305
+ "\r\n",
306
+ file_descriptor,
307
+ file_encoding,
308
+ )
309
+ ops = f"@{self.station.get('Call','')}"
310
+ list_of_ops = self.database.get_ops()
311
+ for op in list_of_ops:
312
+ ops += f", {op.get('Operator', '')}"
313
+ output_cabrillo_line(
314
+ f"OPERATORS: {ops}",
315
+ "\r\n",
316
+ file_descriptor,
317
+ file_encoding,
318
+ )
319
+ output_cabrillo_line(
320
+ f"NAME: {self.station.get('Name', '')}",
321
+ "\r\n",
322
+ file_descriptor,
323
+ file_encoding,
324
+ )
325
+ output_cabrillo_line(
326
+ f"ADDRESS: {self.station.get('Street1', '')}",
327
+ "\r\n",
328
+ file_descriptor,
329
+ file_encoding,
330
+ )
331
+ output_cabrillo_line(
332
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
333
+ "\r\n",
334
+ file_descriptor,
335
+ file_encoding,
336
+ )
337
+ output_cabrillo_line(
338
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
339
+ "\r\n",
340
+ file_descriptor,
341
+ file_encoding,
342
+ )
343
+ output_cabrillo_line(
344
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
345
+ "\r\n",
346
+ file_descriptor,
347
+ file_encoding,
348
+ )
349
+ output_cabrillo_line(
350
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
351
+ "\r\n",
352
+ file_descriptor,
353
+ file_encoding,
354
+ )
355
+ output_cabrillo_line(
356
+ f"EMAIL: {self.station.get('Email', '')}",
357
+ "\r\n",
358
+ file_descriptor,
359
+ file_encoding,
360
+ )
361
+ for contact in log:
362
+ the_date_and_time = contact.get("TS", "")
363
+ themode = contact.get("Mode", "")
364
+ if themode in ("LSB", "USB", "AM"):
365
+ themode = "PH"
366
+ if themode in (
367
+ "FT8",
368
+ "FT4",
369
+ "RTTY",
370
+ "PSK31",
371
+ "FSK441",
372
+ "MSK144",
373
+ "JT65",
374
+ "JT9",
375
+ "Q65",
376
+ ):
377
+ themode = "DG"
378
+ freq = int(contact.get("Freq", "0")) / 1000
379
+
380
+ frequency = str(int(freq)).rjust(4)
381
+
382
+ loggeddate = the_date_and_time[:10]
383
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
384
+ output_cabrillo_line(
385
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
386
+ f"{contact.get('StationPrefix', '').ljust(13)} "
387
+ # f"{str(contact.get('SNT', '')).ljust(3)} "
388
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
389
+ f"{contact.get('Call', '').ljust(13)} "
390
+ # f"{str(contact.get('RCV', '')).ljust(3)} "
391
+ f"{str(contact.get('NR', '')).ljust(6)}",
392
+ "\r\n",
393
+ file_descriptor,
394
+ file_encoding,
395
+ )
396
+ output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
397
+ self.show_message_box(f"Cabrillo saved to: {filename}")
398
+ except IOError as exception:
399
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
400
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
401
+ return
402
+
403
+
404
+ def recalculate_mults(self):
405
+ """Recalculates multipliers after change in logged qso."""
406
+
407
+
408
+ def set_self(the_outie):
409
+ """..."""
410
+ globals()["ALTEREGO"] = the_outie
411
+
412
+
413
+ def ft8_handler(the_packet: dict):
414
+ """Process FT8 QSO packets
415
+ FT8
416
+ {
417
+ 'CALL': 'KE0OG',
418
+ 'GRIDSQUARE': 'DM10AT',
419
+ 'MODE': 'FT8',
420
+ 'RST_SENT': '',
421
+ 'RST_RCVD': '',
422
+ 'QSO_DATE': '20210329',
423
+ 'TIME_ON': '183213',
424
+ 'QSO_DATE_OFF': '20210329',
425
+ 'TIME_OFF': '183213',
426
+ 'BAND': '20M',
427
+ 'FREQ': '14.074754',
428
+ 'STATION_CALLSIGN': 'K6GTE',
429
+ 'MY_GRIDSQUARE': 'DM13AT',
430
+ 'CONTEST_ID': 'ARRL-FIELD-DAY',
431
+ 'SRX_STRING': '1D UT',
432
+ 'CLASS': '1D',
433
+ 'ARRL_SECT': 'UT'
434
+ }
435
+ FlDigi
436
+ {
437
+ 'FREQ': '7.029500',
438
+ 'CALL': 'DL2DSL',
439
+ 'MODE': 'RTTY',
440
+ 'NAME': 'BOB',
441
+ 'QSO_DATE': '20240904',
442
+ 'QSO_DATE_OFF': '20240904',
443
+ 'TIME_OFF': '212825',
444
+ 'TIME_ON': '212800',
445
+ 'RST_RCVD': '599',
446
+ 'RST_SENT': '599',
447
+ 'BAND': '40M',
448
+ 'COUNTRY': 'FED. REP. OF GERMANY',
449
+ 'CQZ': '14',
450
+ 'STX': '000',
451
+ 'STX_STRING': '1D ORG',
452
+ 'CLASS': '1D',
453
+ 'ARRL_SECT': 'DX',
454
+ 'TX_PWR': '0',
455
+ 'OPERATOR': 'K6GTE',
456
+ 'STATION_CALLSIGN': 'K6GTE',
457
+ 'MY_GRIDSQUARE': 'DM13AT',
458
+ 'MY_CITY': 'ANAHEIM, CA',
459
+ 'MY_STATE': 'CA'
460
+ }
461
+
462
+ """
463
+ logger.debug(f"{the_packet=}")
464
+ if ALTEREGO is not None:
465
+ ALTEREGO.callsign.setText(the_packet.get("CALL"))
466
+ ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
467
+ ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
468
+ ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
469
+ my_grid = the_packet.get("MY_GRIDSQUARE", "")
470
+ if my_grid:
471
+ if len(my_grid) > 4:
472
+ my_grid = my_grid[:4]
473
+ their_grid = the_packet.get("GRIDSQUARE", "")
474
+ if their_grid:
475
+ if len(their_grid) > 4:
476
+ their_grid = their_grid[:4]
477
+ ALTEREGO.contact["NR"] = their_grid
478
+ # ALTEREGO.contact["Sect"] = the_packet.get("ARRL_SECT", "ERR")
479
+ if the_packet.get("SUBMODE"):
480
+ ALTEREGO.contact["Mode"] = the_packet.get("SUBMODE", "ERR")
481
+ else:
482
+ ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
483
+ ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
484
+ ALTEREGO.contact["QSXFreq"] = round(
485
+ float(the_packet.get("FREQ", "0.0")) * 1000, 2
486
+ )
487
+ ALTEREGO.contact["Band"] = get_logged_band(
488
+ str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
489
+ )
490
+ logger.debug(f"{ALTEREGO.contact=}")
491
+ ALTEREGO.other_1.setText(my_grid)
492
+ ALTEREGO.other_2.setText(their_grid)
493
+ ALTEREGO.save_contact()
494
+
495
+
496
+ def process_esm(self, new_focused_widget=None, with_enter=False):
497
+ """ESM State Machine"""
498
+
499
+ # self.pref["run_state"]
500
+
501
+ # -----===== Assigned F-Keys =====-----
502
+ # self.esm_dict["CQ"]
503
+ # self.esm_dict["EXCH"]
504
+ # self.esm_dict["QRZ"]
505
+ # self.esm_dict["AGN"]
506
+ # self.esm_dict["HISCALL"]
507
+ # self.esm_dict["MYCALL"]
508
+ # self.esm_dict["QSOB4"]
509
+
510
+ # ----==== text fields ====----
511
+ # self.callsign
512
+ # self.sent
513
+ # self.receive
514
+ # self.other_1
515
+ # self.other_2
516
+
517
+ if new_focused_widget is not None:
518
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
519
+
520
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
521
+
522
+ for a_button in [
523
+ self.esm_dict["CQ"],
524
+ self.esm_dict["EXCH"],
525
+ self.esm_dict["QRZ"],
526
+ self.esm_dict["AGN"],
527
+ self.esm_dict["HISCALL"],
528
+ self.esm_dict["MYCALL"],
529
+ self.esm_dict["QSOB4"],
530
+ ]:
531
+ if a_button is not None:
532
+ self.restore_button_color(a_button)
533
+
534
+ buttons_to_send = []
535
+
536
+ if self.pref.get("run_state"):
537
+ if self.current_widget == "callsign":
538
+ if len(self.callsign.text()) < 3:
539
+ self.make_button_green(self.esm_dict["CQ"])
540
+ buttons_to_send.append(self.esm_dict["CQ"])
541
+ elif len(self.callsign.text()) > 2:
542
+ self.make_button_green(self.esm_dict["HISCALL"])
543
+ self.make_button_green(self.esm_dict["EXCH"])
544
+ buttons_to_send.append(self.esm_dict["HISCALL"])
545
+ buttons_to_send.append(self.esm_dict["EXCH"])
546
+
547
+ elif self.current_widget in ["other_2"]:
548
+ if self.other_2.text() == "":
549
+ self.make_button_green(self.esm_dict["AGN"])
550
+ buttons_to_send.append(self.esm_dict["AGN"])
551
+ else:
552
+ self.make_button_green(self.esm_dict["QRZ"])
553
+ buttons_to_send.append(self.esm_dict["QRZ"])
554
+ buttons_to_send.append("LOGIT")
555
+
556
+ if with_enter is True and bool(len(buttons_to_send)):
557
+ for button in buttons_to_send:
558
+ if button:
559
+ if button == "LOGIT":
560
+ self.save_contact()
561
+ continue
562
+ self.process_function_key(button)
563
+ else:
564
+ if self.current_widget == "callsign":
565
+ if len(self.callsign.text()) > 2:
566
+ self.make_button_green(self.esm_dict["MYCALL"])
567
+ buttons_to_send.append(self.esm_dict["MYCALL"])
568
+
569
+ elif self.current_widget in ["other_2"]:
570
+ if self.other_2.text() == "":
571
+ self.make_button_green(self.esm_dict["AGN"])
572
+ buttons_to_send.append(self.esm_dict["AGN"])
573
+ else:
574
+ self.make_button_green(self.esm_dict["EXCH"])
575
+ buttons_to_send.append(self.esm_dict["EXCH"])
576
+ buttons_to_send.append("LOGIT")
577
+
578
+ if with_enter is True and bool(len(buttons_to_send)):
579
+ for button in buttons_to_send:
580
+ if button:
581
+ if button == "LOGIT":
582
+ self.save_contact()
583
+ continue
584
+ self.process_function_key(button)
585
+
586
+
587
+ def populate_history_info_line(self):
588
+ result = self.database.fetch_call_history(self.callsign.text())
589
+ if result:
590
+ self.history_info.setText(
591
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
592
+ )
593
+ else:
594
+ self.history_info.setText("")
595
+
596
+
597
+ def check_call_history(self):
598
+ """"""
599
+ result = self.database.fetch_call_history(self.callsign.text())
600
+ if result:
601
+ self.history_info.setText(f"{result.get('UserText','')}")
602
+ if self.other_2.text() == "":
603
+ self.other_2.setText(f"{result.get('Loc1', '')}")
604
+
605
+
606
+ # !!Order!!,Call,Name,Loc1,UserText,
607
+ # gridsquare
608
+ def get_mults(self):
609
+ """"""
610
+
611
+ mults = {}
612
+ mults["gridsquare"] = show_mults(self)
613
+ return mults
614
+
615
+
616
+ def just_points(self):
617
+ """"""
618
+ result = self.database.fetch_points()
619
+ if result is not None:
620
+ score = result.get("Points", "0")
621
+ if score is None:
622
+ score = "0"
623
+ return int(score)
624
+ return 0
not1mm/radio.py CHANGED
@@ -15,7 +15,7 @@ import logging
15
15
  from PyQt6.QtCore import QObject, pyqtSignal, QThread, QEventLoop
16
16
  from not1mm.lib.cat_interface import CAT
17
17
 
18
- logger = logging.getLogger("cat_interface")
18
+ logger = logging.getLogger("radio")
19
19
 
20
20
 
21
21
  class Radio(QObject):
@@ -103,7 +103,7 @@ class Radio(QObject):
103
103
  except QEventLoop:
104
104
  ...
105
105
  # QThread.msleep(int(self.delta / 2))
106
- QThread.msleep(1)
106
+ QThread.msleep(100)
107
107
 
108
108
  def store_last_data_mode(self, the_mode: str = ""):
109
109
  """if the last mode is a data mode, save it."""
not1mm/ratewindow.py CHANGED
@@ -118,9 +118,8 @@ class RateWindow(QDockWidget):
118
118
 
119
119
  # WHERE datetime(timestamp) > datetime(current_timestamp, '-60 minutes')
120
120
 
121
- if not self.active:
121
+ if not self.active or not self.isVisible():
122
122
  return
123
-
124
123
  # Get Q's in the 60 Minutes
125
124
  query = f"select (julianday(MAX(ts)) - julianday(MIN(ts))) * 24 * 60 as timespan, count(*) as items from (select * from dxlog where ContestNR = {self.database.current_contest} and datetime(TS) > datetime(current_timestamp, '-60 minutes'));"
126
125
  result = self.database.exec_sql(query)
not1mm/vfo.py CHANGED
@@ -189,6 +189,8 @@ class VfoWindow(QDockWidget):
189
189
  Poll radio via CAT asking for VFO state.
190
190
  If it's with in the HAM bands set the vfo knob to match the radio.
191
191
  """
192
+ if not self.isVisible():
193
+ return
192
194
  if self.rig_control:
193
195
  if self.rig_control.online is False:
194
196
  self.rig_control.reinit()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.4.21
3
+ Version: 25.4.25
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -256,6 +256,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
256
256
 
257
257
  ## Recent Changes
258
258
 
259
+ - [25-4-25] Merged PR from @microphonon making changes to ARRL VHF and CWOps CWT.
260
+ - [25-4-22] Mostly code cleanup. Not running some code when not needed.
259
261
  - [25-4-21] Add a couple more debug messages. Add LSB/USB to input-able commands to the callsign field.
260
262
  - [25-4-19-1] Add FM and AM as input-able commands to the callsign field.
261
263
  - [25-4-19] Changed S&P QSY wipe from 50hz to 500hz.
@@ -1,16 +1,16 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=EMu-diX7QjcpOhzIvBex062gzEykWGNf2SnFO0dCnqI,156586
3
- not1mm/bandmap.py,sha256=-zu5slsuAm2GmeW8g3yvURzsuQxemwIQfw1HEq8xKHM,29920
2
+ not1mm/__main__.py,sha256=bf-uGk88mT8OVbDJFr6wu-5StUBYNWBAJS1E8l8avCE,156555
3
+ not1mm/bandmap.py,sha256=n8mrRzo_8b1muzICk8nSpvaiAV4NyNoUkZBa6Rjprns,29968
4
4
  not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
6
6
  not1mm/logwindow.py,sha256=e36t4ebyhLF6UR3y3HJWUwL1rzeqRFzdek7NAYINJNM,42565
7
7
  not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
8
- not1mm/radio.py,sha256=O_jkMJhsrr5IlktjRk7-H7I-r18NU54wjZ6BY5vf5cI,5542
9
- not1mm/ratewindow.py,sha256=PeFmmXYKA6ikR8AzWB6n5TS_1NoaHLocw4pSdySq_7A,6995
8
+ not1mm/radio.py,sha256=4Lysf9BY3vdtYCHwKfzO5WN7IGyh4_lKSVuQ6F4Z08g,5536
9
+ not1mm/ratewindow.py,sha256=vMM56sOWbglQXf16Rhhgx2V4uaiGzTkfmcOmhgNd1GQ,7018
10
10
  not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
11
11
  not1mm/statistics.py,sha256=YbXBCr8wtmXlF21ojgsh0jY_G-dnCApUFe87JZclZAI,7712
12
12
  not1mm/test.py,sha256=BNhsSvLnNG5hN4pywIWnj4pUBI-wQYY4Ejfbl97knmw,1198
13
- not1mm/vfo.py,sha256=3kdSfLHLHAGgSE8b8H9n-jFUg_5L7tvrZt_7YCkdsLo,8945
13
+ not1mm/vfo.py,sha256=LbGjJKb6ipDEbEEcaeIR2DiEpReolamSzuY25rU3iOo,8997
14
14
  not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
15
15
  not1mm/data/JetBrainsMono-ExtraLight.ttf,sha256=g5Hn7BPounWMGDj1a8zZcyKMz03HSqW__pUluRR7Evg,274144
16
16
  not1mm/data/MASTER.SCP,sha256=LuF8dTtdRKaqSyzJ1nl7zW2-gs5ehQiXiI41t5Zo9Bo,362769
@@ -34,7 +34,7 @@ not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N
34
34
  not1mm/data/logwindow.ui,sha256=f7vULj96tHIQuR1nJMyvPHHcmVgzkhv9D1isyojsnFU,1458
35
35
  not1mm/data/logwindowx.ui,sha256=CwpI-h7cI1yqyldH9quKftsdHL5lTyL9ABOcf80nfqc,1632
36
36
  not1mm/data/main.ui,sha256=-JDQXOaxj8_7Wda9KT2rEM4YUjBs31CiT1Rjc_DBobM,64907
37
- not1mm/data/new_contest.ui,sha256=glqsmFGF5gh-JB-zuEVxAWrOR7-Hok5ibvZYCMcDCWE,25223
37
+ not1mm/data/new_contest.ui,sha256=KrtNDS41-Cr1Kzt9IR9sVEyjsLXlj4R1I2GHRKjP9oo,25331
38
38
  not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
39
39
  not1mm/data/opon.ui,sha256=QDicqAk2lORG2UWsHa6jHlsGn6uzrrI2R4HSAocpPes,2258
40
40
  not1mm/data/pickcontest.ui,sha256=4hPBszCglObThx_eIWtmK9CEcbr7WBjbB1rKZdI-o3I,1707
@@ -100,7 +100,7 @@ not1mm/data/phonetics/yourcall.wav,sha256=4kheHJmCiRDL2kjhlgXQ8_u_eEMgKxiNGu5UBk
100
100
  not1mm/data/phonetics/z.wav,sha256=arafCi7fwmBLdVDI-PRyaL4U-03PIQDhffwY5noJ_2c,51768
101
101
  not1mm/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
102
  not1mm/lib/about.py,sha256=sWycfGcruN3SaEe4JmaJ61K6D8Itq0WxpUYT-lEcmYM,416
103
- not1mm/lib/cat_interface.py,sha256=Ux30MnG2NOSqg3q9aiavKlB_lPc8va-6-f-1L-YfuY4,25898
103
+ not1mm/lib/cat_interface.py,sha256=zMSGSVl7B_hX2XIpTpdyepedyfFTm0rFVWRpSZvadoc,26637
104
104
  not1mm/lib/cwinterface.py,sha256=rKUnqljHQC_Iljq4TCmAgSPe49lWbKcfxg58cE8YX5Y,5177
105
105
  not1mm/lib/database.py,sha256=fykyaQaTa_Pwde51f09Odbexy1mlUqObv0fjZ7hf3E0,51693
106
106
  not1mm/lib/edit_contact.py,sha256=Ki9bGPpqyQQBB1cU8VIBDCal3lbXeQ6qxhzklmhE2_w,353
@@ -118,7 +118,7 @@ not1mm/lib/plugin_common.py,sha256=D1OBjyLmX7zuSPqgTCmHwXzAKA12J_zTQItvyIem-4Y,1
118
118
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
119
119
  not1mm/lib/settings.py,sha256=cC83Nw4pGLWyHybIflDR1ylX9P7Hq2P5b5yFZtx-llY,15410
120
120
  not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
121
- not1mm/lib/version.py,sha256=KiLQMZfIHVWzYFLcC4ymiqtDVrlT-_Q1fwzilkjmW_c,48
121
+ not1mm/lib/version.py,sha256=a8J0jgqJTJWnoNOX19Zci1oHdY2sZo75ehPTDVk8p4o,48
122
122
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
123
123
  not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
124
124
  not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
@@ -134,9 +134,9 @@ not1mm/plugins/arrl_field_day.py,sha256=CzUAzcOus4MwJ0Ha08OvQwCfjcfRRNIEx1WCL9xB
134
134
  not1mm/plugins/arrl_rtty_ru.py,sha256=bxOvrcb6R_Qf3H2MnkfpQkAfJbCyGjKwbZXt1PHCuAM,20957
135
135
  not1mm/plugins/arrl_ss_cw.py,sha256=WnRiVLqiC_sX4QqDyyMOy3f07IJCPgxkFf9PstKkhK4,17522
136
136
  not1mm/plugins/arrl_ss_phone.py,sha256=PzybC--tSB7_oNLbbN9xYkMnftH-z6qgcGZUp3-JGLU,16858
137
- not1mm/plugins/arrl_vhf_jan.py,sha256=yGwzcwRwyHM6FF8d61WayjxvIEmJmOGqeziYUP9s3do,20330
138
- not1mm/plugins/arrl_vhf_jun.py,sha256=zieBad2LkyjmrtoB8NgDL5993zXBvuFu0Y-U1-Fy13k,19422
139
- not1mm/plugins/arrl_vhf_sep.py,sha256=4rFf8DXRKQqtyXQtG6ZpqZS1v3bBVJONG_e4EUmcm_U,19455
137
+ not1mm/plugins/arrl_vhf_jan.py,sha256=paYrF_o1EotBRmXn_x9_hEM16SWx7sLDzoSoXcYXcCY,20201
138
+ not1mm/plugins/arrl_vhf_jun.py,sha256=WwQ-UGFekIZj26bIbq3sLacTYMmUzBYySHhPz2APm2M,19293
139
+ not1mm/plugins/arrl_vhf_sep.py,sha256=kq5Rncru74G9B76VwfXMeTaF9AL8hq-1vw9ZMYmJmvM,19326
140
140
  not1mm/plugins/canada_day.py,sha256=89aGXm4S9PjKL9FYm3z7BMFRz--MugQQilwQnzLJvv0,15770
141
141
  not1mm/plugins/cq_160_cw.py,sha256=bmHtxVcIWsqmgqpMCMso7DCBERtAr9fIKIjgymSKtms,18711
142
142
  not1mm/plugins/cq_160_ssb.py,sha256=9KKDmmapETEebm1azfEzUWk1NyW3TBnYtBlFIPZYHBs,18754
@@ -146,7 +146,7 @@ not1mm/plugins/cq_wpx_ssb.py,sha256=mtUD0tQnraDHoCHIeuWpOD64my3Kni9mXVH5IF2QPL0,
146
146
  not1mm/plugins/cq_ww_cw.py,sha256=EtcfWGZCb49WXBNoVzB7WCy5JmLc1KLglmA0O1PFN2w,18040
147
147
  not1mm/plugins/cq_ww_rtty.py,sha256=2u3k4ofPh3S4B-BVlQtis-X4rwdx221WRf3hjHWPEyg,22549
148
148
  not1mm/plugins/cq_ww_ssb.py,sha256=txeBfJ8rZCrAG2BWY-UmTH81ufRYbkeJJ6NpnV1eKKg,18055
149
- not1mm/plugins/cwt.py,sha256=_bYlv6AMhfNVI7pChkSfEZ9amaIYhxu71qdmwgPTrKw,17594
149
+ not1mm/plugins/cwt.py,sha256=ozNGV_ziOjxJoFuqBjJC8_r9CWqJhunQJD5g9YrJBEM,17446
150
150
  not1mm/plugins/darc_vhf.py,sha256=cyckJ-0c_z7uONEWwxbvxi_olxPP0NJm3ryQRCkT5tE,27419
151
151
  not1mm/plugins/darc_xmas.py,sha256=p5UNYLdtylsC_sSlxT8NvXXL1oSW0KyUhIN-rJonHgI,18971
152
152
  not1mm/plugins/ea_majistad_cw.py,sha256=tl9y92Oz4NTch4H-SrBnZND2tHGqWQvtgl3emXfU8og,23352
@@ -177,11 +177,12 @@ not1mm/plugins/sac_ssb.py,sha256=_hzcU-ZN9S8Z1HrLXIdUL-h60cVrTM3s9CGfksI35Uo,213
177
177
  not1mm/plugins/spdx.py,sha256=O_PhTaWdjaV29hj2G8tUK3m6GNx8f40hO1JAF-olLMg,15909
178
178
  not1mm/plugins/stew_perry_topband.py,sha256=3U-Dr28haBTqTaZWLiC1qHQBmLsLENDL-ihyddPpJbg,15403
179
179
  not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,19105
180
+ not1mm/plugins/vhf_sprint.py,sha256=fi5oc7ko_iW4avIoVC76zc6GDEGCYn26GsAGAWaHqI4,19301
180
181
  not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
181
182
  not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
182
- not1mm-25.4.21.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
183
- not1mm-25.4.21.dist-info/METADATA,sha256=zRMkaTzAu7MmDi2g--4yGVfr1ADdhga0OPxjWxafgvA,40524
184
- not1mm-25.4.21.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
185
- not1mm-25.4.21.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
186
- not1mm-25.4.21.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
187
- not1mm-25.4.21.dist-info/RECORD,,
183
+ not1mm-25.4.25.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
184
+ not1mm-25.4.25.dist-info/METADATA,sha256=pwHeBlRKJSaJBgmDezHjXGwc32OH_fYxT2Waiv3vVrA,40678
185
+ not1mm-25.4.25.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
186
+ not1mm-25.4.25.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
187
+ not1mm-25.4.25.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
188
+ not1mm-25.4.25.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5