not1mm 25.6.13.1__py3-none-any.whl → 25.6.16__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/bandmap.py CHANGED
@@ -380,6 +380,7 @@ class BandMapWindow(QDockWidget):
380
380
 
381
381
  def setActive(self, mode: bool):
382
382
  self.active = bool(mode)
383
+ self.request_workedlist()
383
384
 
384
385
  def get_settings(self) -> dict:
385
386
  """Get the settings."""
not1mm/data/rotator.ui CHANGED
@@ -31,6 +31,9 @@
31
31
  <layout class="QHBoxLayout" name="horizontalLayout">
32
32
  <item>
33
33
  <widget class="QPushButton" name="stop_button">
34
+ <property name="focusPolicy">
35
+ <enum>Qt::FocusPolicy::NoFocus</enum>
36
+ </property>
34
37
  <property name="styleSheet">
35
38
  <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
36
39
  </property>
@@ -80,6 +83,9 @@
80
83
  </item>
81
84
  <item>
82
85
  <widget class="QPushButton" name="park_button">
86
+ <property name="focusPolicy">
87
+ <enum>Qt::FocusPolicy::NoFocus</enum>
88
+ </property>
83
89
  <property name="styleSheet">
84
90
  <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
85
91
  </property>
not1mm/dxcc_tracker.py CHANGED
@@ -65,7 +65,8 @@ class DXCCWindow(QDockWidget):
65
65
  # {'CountryPrefix': 'XE', '160m': 0, '80m': 0, '40m': 0, '20m': 1, '15m': 0, '10m': 0, 'Total': 1},
66
66
  # {'CountryPrefix': 'G', '160m': 0, '80m': 0, '40m': 0, '20m': 1, '15m': 0, '10m': 0, 'Total': 1}
67
67
  # ]
68
-
68
+ if not self.isVisible():
69
+ return
69
70
  result = self.database.fetch_dxcc_by_band_count()
70
71
  self.dxcc_table.setRowCount(0)
71
72
  for row_number, row_data in enumerate(result):
@@ -129,7 +130,8 @@ class DXCCWindow(QDockWidget):
129
130
 
130
131
  def msg_from_main(self, msg):
131
132
  """"""
132
- if self.active is True:
133
+
134
+ if self.active is True and self.isVisible():
133
135
  if msg.get("cmd", "") in ("UPDATELOG", "CONTACTCHANGED", "DELETED"):
134
136
  ...
135
137
  self.get_log()
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.6.13.1"
3
+ __version__ = "25.6.16"
@@ -194,7 +194,9 @@ def process_esm(self, new_focused_widget=None, with_enter=False):
194
194
  # buttons_to_send.append("LOGIT")
195
195
 
196
196
  elif self.current_widget in ["other_1", "other_2"]:
197
- buttons_to_send.append("LOGIT")
197
+ self.make_button_green(self.esm_dict["QRZ"])
198
+ buttons_to_send.append(self.esm_dict["QRZ"])
199
+ buttons_to_send.append("LOGIT")
198
200
 
199
201
  if with_enter is True and bool(len(buttons_to_send)):
200
202
  for button in buttons_to_send:
@@ -219,7 +221,9 @@ def process_esm(self, new_focused_widget=None, with_enter=False):
219
221
  # buttons_to_send.append("LOGIT")
220
222
 
221
223
  elif self.current_widget in ["other_1", "other_2"]:
222
- buttons_to_send.append("LOGIT")
224
+ self.make_button_green(self.esm_dict["QRZ"])
225
+ buttons_to_send.append(self.esm_dict["QRZ"])
226
+ buttons_to_send.append("LOGIT")
223
227
 
224
228
  if with_enter is True and bool(len(buttons_to_send)):
225
229
  for button in buttons_to_send:
not1mm/rtc_service.py CHANGED
@@ -26,13 +26,15 @@ logger = logging.getLogger(__name__)
26
26
 
27
27
 
28
28
  class RTCService(QObject):
29
- """The RTC Service class."""
29
+ """The Real Time Score Reporting Service class."""
30
30
 
31
- rtc_callback = pyqtSignal(dict)
32
- delta = 2 # two minutes
33
- poll_time = datetime.datetime.now() + datetime.timedelta(minutes=delta)
34
- time_to_quit = False
35
- xml = ""
31
+ rtc_callback: pyqtSignal = pyqtSignal(dict)
32
+ delta: int = 2 # two minutes
33
+ poll_time: datetime.datetime = datetime.datetime.now() + datetime.timedelta(
34
+ minutes=delta
35
+ )
36
+ time_to_quit: bool = False
37
+ xml: str = ""
36
38
 
37
39
  def __init__(self):
38
40
  super().__init__()
not1mm/statistics.py CHANGED
@@ -5,7 +5,7 @@ import os
5
5
  # import sys
6
6
 
7
7
  from PyQt6 import uic, QtWidgets
8
- from PyQt6.QtWidgets import QDockWidget
8
+ from PyQt6.QtWidgets import QDockWidget, QTableWidgetItem
9
9
  from PyQt6.QtCore import pyqtSignal, Qt
10
10
 
11
11
  import not1mm.fsutils as fsutils
@@ -27,12 +27,12 @@ class StatsWindow(QDockWidget):
27
27
 
28
28
  def __init__(self):
29
29
  super().__init__()
30
- self.active = False
30
+ self.active: bool = False
31
31
  self.load_pref()
32
- self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
32
+ self.dbname: str = fsutils.USER_DATA_PATH / self.pref.get(
33
33
  "current_database", "ham.db"
34
34
  )
35
- self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
35
+ self.database: DataBase = DataBase(self.dbname, fsutils.APP_DATA_PATH)
36
36
  self.database.current_contest = self.pref.get("contest", 0)
37
37
  uic.loadUi(fsutils.APP_DATA_PATH / "statistics.ui", self)
38
38
 
@@ -40,10 +40,10 @@ class StatsWindow(QDockWidget):
40
40
  """"""
41
41
  if packet.get("cmd", "") == "NEWDB":
42
42
  self.load_pref()
43
- self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
43
+ self.dbname: str = fsutils.USER_DATA_PATH / self.pref.get(
44
44
  "current_database", "ham.db"
45
45
  )
46
- self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
46
+ self.database: DataBase = DataBase(self.dbname, fsutils.APP_DATA_PATH)
47
47
  self.database.current_contest = self.pref.get("contest", 0)
48
48
  self.get_run_and_total_qs()
49
49
 
@@ -55,7 +55,7 @@ class StatsWindow(QDockWidget):
55
55
  return
56
56
 
57
57
  def setActive(self, mode: bool) -> None:
58
- self.active = bool(mode)
58
+ self.active: bool = bool(mode)
59
59
 
60
60
  def load_pref(self) -> None:
61
61
  """
@@ -107,79 +107,85 @@ class StatsWindow(QDockWidget):
107
107
  for band in result:
108
108
  query = f"select count(*) as qs, count(DISTINCT(Call)) as calls, sum(Points) as points from DXLOG where ContestNR = {self.database.current_contest} and Band = '{band['band']}';"
109
109
  result = self.database.exec_sql(query)
110
- item = QtWidgets.QTableWidgetItem(
110
+ item: QTableWidgetItem = QTableWidgetItem(
111
111
  str(band.get("band", "")).replace("None", "")
112
112
  )
113
113
  item.setTextAlignment(0x0002)
114
114
  self.tableWidget.setItem(row, 0, item)
115
- item = QtWidgets.QTableWidgetItem(
115
+ item: QTableWidgetItem = QTableWidgetItem(
116
116
  str(result.get("qs", "0")).replace("None", "0")
117
117
  )
118
118
  item.setTextAlignment(0x0002)
119
119
  self.tableWidget.setItem(row, 1, item)
120
- item = QtWidgets.QTableWidgetItem(
120
+ item: QTableWidgetItem = QTableWidgetItem(
121
121
  str(result.get("calls", "0")).replace("None", "0")
122
122
  )
123
123
  item.setTextAlignment(0x0002)
124
124
  self.tableWidget.setItem(row, 2, item)
125
- item = QtWidgets.QTableWidgetItem(
125
+ item: QTableWidgetItem = QTableWidgetItem(
126
126
  str(result.get("points", "0")).replace("None", "0")
127
127
  )
128
128
  item.setTextAlignment(0x0002)
129
129
  self.tableWidget.setItem(row, 6, item)
130
- query = f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE WHEN Mode IN ('LSB','USB','SSB','FM','AM') THEN 'PH' WHEN Mode IN ('CW','CW-R') THEN 'CW' WHEN Mode IN ('FT8','FT4','RTTY','PSK31','FSK441','MSK144','JT65','JT9','Q65') THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest} and Band = '{band['band']}') as sortedmode;"
131
- result = self.database.exec_sql(query)
132
- item = QtWidgets.QTableWidgetItem(
130
+ query: str = (
131
+ f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE WHEN Mode IN ('LSB','USB','SSB','FM','AM') THEN 'PH' WHEN Mode IN ('CW','CW-R') THEN 'CW' WHEN Mode IN ('FT8','FT4','RTTY','PSK31','FSK441','MSK144','JT65','JT9','Q65') THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest} and Band = '{band['band']}') as sortedmode;"
132
+ )
133
+ result: dict = self.database.exec_sql(query)
134
+ item: QTableWidgetItem = QTableWidgetItem(
133
135
  str(result.get("CW", "0")).replace("None", "0")
134
136
  )
135
137
  item.setTextAlignment(0x0002)
136
138
  self.tableWidget.setItem(row, 3, item)
137
- item = QtWidgets.QTableWidgetItem(
139
+ item: QTableWidgetItem = QTableWidgetItem(
138
140
  str(result.get("PH", "0")).replace("None", "0")
139
141
  )
140
142
  item.setTextAlignment(0x0002)
141
143
  self.tableWidget.setItem(row, 4, item)
142
- item = QtWidgets.QTableWidgetItem(
144
+ item: QTableWidgetItem = QTableWidgetItem(
143
145
  str(result.get("DI", "0")).replace("None", "0")
144
146
  )
145
147
  item.setTextAlignment(0x0002)
146
148
  self.tableWidget.setItem(row, 5, item)
147
149
 
148
150
  row += 1
149
- query = f"select count(*) as qs, count(DISTINCT(Call)) as calls, sum(Points) as points from DXLOG where ContestNR = {self.database.current_contest};"
150
- result = self.database.exec_sql(query)
151
- item = QtWidgets.QTableWidgetItem("TOTAL")
151
+ query: str = (
152
+ f"select count(*) as qs, count(DISTINCT(Call)) as calls, sum(Points) as points from DXLOG where ContestNR = {self.database.current_contest};"
153
+ )
154
+ result: dict = self.database.exec_sql(query)
155
+ item: QTableWidgetItem = QTableWidgetItem("TOTAL")
152
156
  item.setTextAlignment(0x0002)
153
157
  self.tableWidget.setItem(row, 0, item)
154
- item = QtWidgets.QTableWidgetItem(
158
+ item: QTableWidgetItem = QTableWidgetItem(
155
159
  str(result.get("qs", "0")).replace("None", "0")
156
160
  )
157
161
  item.setTextAlignment(0x0002)
158
162
  self.tableWidget.setItem(row, 1, item)
159
- item = QtWidgets.QTableWidgetItem(
163
+ item: QTableWidgetItem = QTableWidgetItem(
160
164
  str(result.get("calls", "0")).replace("None", "0")
161
165
  )
162
166
  item.setTextAlignment(0x0002)
163
167
  self.tableWidget.setItem(row, 2, item)
164
- item = QtWidgets.QTableWidgetItem(
168
+ item: QTableWidgetItem = QTableWidgetItem(
165
169
  str(result.get("points", "0")).replace("None", "0")
166
170
  )
167
171
  item.setTextAlignment(0x0002)
168
172
  self.tableWidget.setItem(row, 6, item)
169
173
 
170
- query = f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE WHEN Mode IN ('LSB','USB','SSB','FM','AM') THEN 'PH' WHEN Mode IN ('CW','CW-R') THEN 'CW' WHEN Mode In ('FT8','FT4','RTTY','PSK31','FSK441','MSK144','JT65','JT9','Q65') THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest}) as sortedmode;"
171
- result = self.database.exec_sql(query)
172
- item = QtWidgets.QTableWidgetItem(
174
+ query: str = (
175
+ f"select sum(sortedmode.mode == 'CW') as CW, sum(sortedmode.mode == 'PH') as PH, sum(sortedmode.mode == 'DI') as DI from (select CASE WHEN Mode IN ('LSB','USB','SSB','FM','AM') THEN 'PH' WHEN Mode IN ('CW','CW-R') THEN 'CW' WHEN Mode In ('FT8','FT4','RTTY','PSK31','FSK441','MSK144','JT65','JT9','Q65') THEN 'DI' ELSE 'OTHER' END mode from DXLOG where ContestNR = {self.database.current_contest}) as sortedmode;"
176
+ )
177
+ result: dict = self.database.exec_sql(query)
178
+ item: QTableWidgetItem = QTableWidgetItem(
173
179
  str(result.get("CW", "0")).replace("None", "0")
174
180
  )
175
181
  item.setTextAlignment(0x0002)
176
182
  self.tableWidget.setItem(row, 3, item)
177
- item = QtWidgets.QTableWidgetItem(
183
+ item: QTableWidgetItem = QTableWidgetItem(
178
184
  str(result.get("PH", "0")).replace("None", "0")
179
185
  )
180
186
  item.setTextAlignment(0x0002)
181
187
  self.tableWidget.setItem(row, 4, item)
182
- item = QtWidgets.QTableWidgetItem(
188
+ item: QTableWidgetItem = QTableWidgetItem(
183
189
  str(result.get("DI", "0")).replace("None", "0")
184
190
  )
185
191
  item.setTextAlignment(0x0002)
not1mm/vfo.py CHANGED
@@ -19,40 +19,40 @@ from json import loads
19
19
  import sys
20
20
 
21
21
  import serial
22
- from PyQt6 import QtCore, QtWidgets, uic
22
+ from PyQt6 import QtWidgets, uic
23
23
  from PyQt6.QtCore import QTimer
24
24
  from PyQt6.QtWidgets import QDockWidget
25
+ from PyQt6.QtGui import QPalette
25
26
 
26
27
  import not1mm.fsutils as fsutils
27
28
  from not1mm.lib.cat_interface import CAT
28
29
 
29
- logger = logging.getLogger(__name__)
30
+ logger: logging.Logger = logging.getLogger(__name__)
30
31
 
31
32
 
32
33
  class VfoWindow(QDockWidget):
33
34
  """The VFO window."""
34
35
 
35
- pref = {}
36
- old_vfo = ""
37
- old_pico = ""
38
- message_shown = False
39
- multicast_interface = None
40
- current_palette = None
41
- device_reconnect = False
42
- stale = datetime.datetime.now()
36
+ pref: dict = {}
37
+ old_vfo: str = ""
38
+ old_pico: str = ""
39
+ message_shown: bool = False
40
+ current_palette: QPalette | None = None
41
+ device_reconnect: bool = False
42
+ stale: datetime.datetime = datetime.datetime.now()
43
43
 
44
44
  def __init__(self):
45
45
  super().__init__()
46
46
  uic.loadUi(fsutils.APP_DATA_PATH / "vfo.ui", self)
47
47
  self.setWindowTitle("VFO Window")
48
- self.rig_control = None
49
- self.timer = QTimer()
48
+ self.rig_control: CAT | None = None
49
+ self.timer: QTimer = QTimer()
50
50
  self.timer.timeout.connect(self.getwaiting)
51
51
  self.load_pref()
52
52
  self.lcdNumber.display(0)
53
- self.pico = None
53
+ self.pico: serial.Serial | None = None
54
54
  self.setup_serial()
55
- self.poll_rig_timer = QtCore.QTimer()
55
+ self.poll_rig_timer: QTimer = QTimer()
56
56
  self.poll_rig_timer.timeout.connect(self.poll_radio)
57
57
  self.poll_rig_timer.start(500)
58
58
  self.visibilityChanged.connect(self.window_state_changed)
@@ -67,7 +67,7 @@ class VfoWindow(QDockWidget):
67
67
  with open(
68
68
  fsutils.CONFIG_FILE, "rt", encoding="utf-8"
69
69
  ) as file_descriptor:
70
- self.pref = loads(file_descriptor.read())
70
+ self.pref: dict = loads(file_descriptor.read())
71
71
  logger.info("%s", self.pref)
72
72
 
73
73
  except IOError as exception:
@@ -78,7 +78,7 @@ class VfoWindow(QDockWidget):
78
78
  "Using flrig: %s",
79
79
  f"{self.pref.get('CAT_ip')} {self.pref.get('CAT_port')}",
80
80
  )
81
- self.rig_control = CAT(
81
+ self.rig_control: CAT | None = CAT(
82
82
  "flrig",
83
83
  self.pref.get("CAT_ip", "127.0.0.1"),
84
84
  int(self.pref.get("CAT_port", 12345)),
@@ -89,7 +89,7 @@ class VfoWindow(QDockWidget):
89
89
  "Using rigctld: %s",
90
90
  f"{self.pref.get('CAT_ip')} {self.pref.get('CAT_port')}",
91
91
  )
92
- self.rig_control = CAT(
92
+ self.rig_control: CAT | None = CAT(
93
93
  "rigctld",
94
94
  self.pref.get("CAT_ip", "127.0.0.1"),
95
95
  int(self.pref.get("CAT_port", 4532)),
@@ -105,8 +105,8 @@ class VfoWindow(QDockWidget):
105
105
  Return the device ID if it is, or None if not found.
106
106
  """
107
107
 
108
- devices = self.get_devices()
109
- data = None
108
+ devices: list[str] | None = self.get_devices()
109
+ data: bytes | None = None
110
110
  if devices is None:
111
111
  return None
112
112
  if sys.platform == "darwin":
@@ -134,7 +134,7 @@ class VfoWindow(QDockWidget):
134
134
  if "vfoknob" in data.decode().strip():
135
135
  return "/dev/serial/by-id/" + device
136
136
 
137
- def get_devices(self):
137
+ def get_devices(self) -> list[str] | None:
138
138
  try:
139
139
  if sys.platform != "darwin":
140
140
  return os.listdir("/dev/serial/by-id")
@@ -143,7 +143,7 @@ class VfoWindow(QDockWidget):
143
143
  return None
144
144
  return None
145
145
 
146
- def window_state_changed(self):
146
+ def window_state_changed(self) -> None:
147
147
  """Setup vfo knob if window is toggled on"""
148
148
 
149
149
  if self.isVisible():
@@ -158,23 +158,23 @@ class VfoWindow(QDockWidget):
158
158
  if not self.isVisible():
159
159
  return
160
160
 
161
- device = self.discover_device()
162
- if device:
161
+ device: str | None = self.discover_device()
162
+ if device is not None:
163
163
  try:
164
- self.pico = serial.Serial(device, 115200)
164
+ self.pico: serial.Serial = serial.Serial(device, 115200)
165
165
  self.pico.timeout = 100
166
166
  self.lcdNumber.setStyleSheet("QLCDNumber { color: white; }")
167
- self.device_reconnect = True
167
+ self.device_reconnect: bool = True
168
168
  except OSError:
169
169
  if self.message_shown is False and supress_msg is False:
170
- self.message_shown = True
170
+ self.message_shown: bool = True
171
171
  self.show_message_box(
172
172
  "Unable to locate or open the VFO knob serial device."
173
173
  )
174
174
  self.lcdNumber.setStyleSheet("QLCDNumber { color: red; }")
175
175
  else:
176
176
  if self.message_shown is False and supress_msg is False:
177
- self.message_shown = True
177
+ self.message_shown: bool = True
178
178
  self.show_message_box(
179
179
  "Unable to locate or open the VFO knob serial device."
180
180
  )
@@ -187,11 +187,13 @@ class VfoWindow(QDockWidget):
187
187
  """
188
188
  if msg_dict.get("cmd", "") == "TUNE":
189
189
  # b'{"cmd": "TUNE", "freq": 7.0235, "spot": "MM0DGI"}'
190
- vfo = msg_dict.get("freq")
191
- vfo = float(vfo) * 1000000
192
- changefreq = f"F {int(vfo)}\r"
193
190
  try:
194
- if self.pico:
191
+ vfo: float = float(msg_dict.get("freq")) * 1000000
192
+ except ValueError:
193
+ return
194
+ changefreq: str = f"F {int(vfo)}\r"
195
+ try:
196
+ if self.pico is not None:
195
197
  self.pico.write(changefreq.encode())
196
198
  except OSError:
197
199
  logger.critical("Unable to write to serial device.")
@@ -199,11 +201,11 @@ class VfoWindow(QDockWidget):
199
201
  logger.critical("Unable to write to serial device.")
200
202
  return
201
203
 
202
- def showNumber(self, the_number) -> None:
204
+ def showNumber(self, the_number: int | str) -> None:
203
205
  """Display vfo value with dots"""
204
- dvfo = str(the_number)
206
+ dvfo: str = str(the_number)
205
207
  if len(dvfo) > 6:
206
- dnum = f"{dvfo[:len(dvfo)-6]}.{dvfo[-6:-3]}.{dvfo[-3:]}"
208
+ dnum: str = f"{dvfo[:len(dvfo)-6]}.{dvfo[-6:-3]}.{dvfo[-3:]}"
207
209
  self.lcdNumber.display(dnum)
208
210
 
209
211
  def poll_radio(self) -> None:
@@ -215,25 +217,24 @@ class VfoWindow(QDockWidget):
215
217
  return
216
218
  if datetime.datetime.now() < self.stale:
217
219
  return
218
- if self.rig_control:
220
+ if self.rig_control is not None:
219
221
  if self.rig_control.online is False:
220
222
  self.rig_control.reinit()
221
223
  if self.rig_control.online:
222
- vfo = self.rig_control.get_vfo()
223
224
  try:
224
- vfo = int(vfo)
225
+ vfo: int = int(self.rig_control.get_vfo())
225
226
  except ValueError:
226
227
  return
227
228
  if vfo < 1700000 or vfo > 60000000:
228
229
  return
229
230
  if vfo != self.old_vfo or self.device_reconnect is True:
230
- self.old_vfo = vfo
231
+ self.old_vfo: int = vfo
231
232
  logger.debug(f"{vfo}")
232
233
  self.showNumber(vfo)
233
- cmd = f"F {vfo}\r"
234
+ cmd: str = f"F {vfo}\r"
234
235
  self.device_reconnect = False
235
236
  try:
236
- if self.pico:
237
+ if self.pico is not None:
237
238
  self.pico.write(cmd.encode())
238
239
  except OSError:
239
240
  logger.critical("Unable to write to serial device.")
@@ -246,28 +247,28 @@ class VfoWindow(QDockWidget):
246
247
  Set the radio's VFO to match if it has changed.
247
248
  """
248
249
  try:
249
- if self.pico:
250
+ if self.pico is not None:
250
251
  self.pico.write(b"f\r")
251
252
  while self.pico.in_waiting:
252
- result = self.pico.read(self.pico.in_waiting)
253
- result = result.decode().strip()
253
+ result: str = self.pico.read(self.pico.in_waiting).decode().strip()
254
+ # result = result.decode().strip()
254
255
 
255
256
  if self.old_pico != result:
256
- self.old_pico = result
257
- self.stale = datetime.datetime.now() + datetime.timedelta(
258
- seconds=1
257
+ self.old_pico: str = result
258
+ self.stale: datetime.datetime = (
259
+ datetime.datetime.now() + datetime.timedelta(seconds=1)
259
260
  )
260
- if self.rig_control:
261
+ if self.rig_control is not None:
261
262
  self.rig_control.set_vfo(result)
262
263
  self.showNumber(result)
263
264
  else:
264
265
  self.setup_serial(supress_msg=True)
265
266
  except OSError:
266
267
  logger.critical("Unable to write to serial device.")
267
- self.pico = None
268
+ self.pico: serial.Serial | None = None
268
269
  except AttributeError:
269
270
  logger.critical("Unable to write to serial device.")
270
- self.pico = None
271
+ self.pico: serial.Serial | None = None
271
272
  except KeyboardInterrupt:
272
273
  ...
273
274
 
@@ -275,8 +276,8 @@ class VfoWindow(QDockWidget):
275
276
  """
276
277
  Display an alert box with the supplied message.
277
278
  """
278
- message_box = QtWidgets.QMessageBox()
279
- if self.current_palette:
279
+ message_box: QtWidgets.QMessageBox = QtWidgets.QMessageBox()
280
+ if self.current_palette is not None:
280
281
  message_box.setPalette(self.current_palette)
281
282
  message_box.setIcon(QtWidgets.QMessageBox.Icon.Information)
282
283
  message_box.setText(message)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.6.13.1
3
+ Version: 25.6.16
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -246,6 +246,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
246
246
 
247
247
  ## Recent Changes
248
248
 
249
+ - [25-6-16] Merged PR from @awandahl SM0HPL, adding ESM buttons to General DX Logging plugin.
250
+ - [25-6-15] Corrected tab focus of rotator windows buttons.
249
251
  - [25-6-13] Polished up the Rotator window. Adding Stop and Park. Made the NSWE buttons smaller.
250
252
  - Add mouse press event handling to RotatorWindow for position setting.
251
253
  - [25-6-13] Polished up the Rotator window. Adding Stop and Park. Made the NSWE buttons smaller.
@@ -1,18 +1,18 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  not1mm/__main__.py,sha256=72QOcq9Hu20_897i3Vpk2ezuq8evjLDJhbEbZQVhAsw,174828
3
- not1mm/bandmap.py,sha256=0JmZ32UvkaPjXs2xTgowX1GLvZo5zHU_Zo9y_GL-On4,31139
3
+ not1mm/bandmap.py,sha256=PpoZIuJ8dTj9erW0xYqbyneZrSQ-CEqbpek5jTlc6PQ,31173
4
4
  not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
5
- not1mm/dxcc_tracker.py,sha256=LUTt538mBjOr590WMby-hmRz47XG8xUCkU2x0j4oB4w,4306
5
+ not1mm/dxcc_tracker.py,sha256=px1m6wcFv-ZDBDKyqSa0IcgAfE9GmQ5mptJHBbnWTcA,4379
6
6
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
7
7
  not1mm/logwindow.py,sha256=O2dMaT_BYWsXA_dxsEHN92JwN-qVGy9nmH0MCMaG9gY,42830
8
8
  not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
9
9
  not1mm/radio.py,sha256=4Lysf9BY3vdtYCHwKfzO5WN7IGyh4_lKSVuQ6F4Z08g,5536
10
10
  not1mm/ratewindow.py,sha256=iBjqdOetIEX0wSwdGM89Ibt4gVlFdE-K8HQPnkVPVOg,6965
11
11
  not1mm/rotator.py,sha256=jrAqO3IkeuZcOgsYFKvEv6DY2ccV85wg0o5sdJa_EUo,12760
12
- not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
13
- not1mm/statistics.py,sha256=eOmUvbbYdbbIYHmaEhtBGab1IxAf2RQYV1q9MItpqEM,7969
12
+ not1mm/rtc_service.py,sha256=S9mF4rnoJKfj0We9Lt2aIWMkHKhDBGUCEhWf2tN0pVI,2899
13
+ not1mm/statistics.py,sha256=tEbAASTwmSvkZnEoIwadSZ_7Ic8yGaGpBLx_rbLLrng,8254
14
14
  not1mm/test.py,sha256=WhL0DLlJTD15aON8Dkf2q_tlP_X1juxKZJh0jEC99tU,154
15
- not1mm/vfo.py,sha256=SsqinokSd8BqVp6l-_DGRKcNN9Uc9JiFYXDl9Ycep1o,10111
15
+ not1mm/vfo.py,sha256=VxPO9ljGvvUHO05byCEUM_NDKPKc9d_e3nlx9lX69vM,10639
16
16
  not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
17
17
  not1mm/data/JetBrainsMono-Thin.ttf,sha256=B1bo6M8dZfp1GXdnZEebOXPvsVr09BnV1ydNwnrhtwI,270112
18
18
  not1mm/data/MASTER.SCP,sha256=yLV5NPU5T2JRKbDukpUB2S_WXpxjyuSPmfV5gVBAoH8,363027
@@ -49,7 +49,7 @@ not1mm/data/radio_grey.png,sha256=9eOtMHDpQvRYY29D7_vPeacWbwotRXZTMm8EiHE9TW0,12
49
49
  not1mm/data/radio_red.png,sha256=QvkMk7thd_hCEIyK5xGAG4xVVXivl39nwOfD8USDI20,957
50
50
  not1mm/data/ratewindow.ui,sha256=c0gikcZQYWuGwWdFE1PGcRbeJ9nTUPIRkOozWo2FQw8,11541
51
51
  not1mm/data/reddot.png,sha256=M33jEMoU8W4rQ4_MVyzzKxDPDte1ypKBch5VnUMNLKE,565
52
- not1mm/data/rotator.ui,sha256=BuWDzo3R68bDT4cbhQxqjVWzu_QRueuFf4ov3AbGcqc,6606
52
+ not1mm/data/rotator.ui,sha256=u9All2dc4pbcUaZAcQhHN0vqjxOpsrphiGNKOH10nek,6816
53
53
  not1mm/data/rttymacros.txt,sha256=FQ2BnAChXF5w-tzmMnBOE8IgvviAEsd3cmmz4b8GOPk,467
54
54
  not1mm/data/settings.ui,sha256=0nAdg4hDv37x0RL5G0Cc1L8p-F95YtkOjIGqlCGu0Fs,40073
55
55
  not1mm/data/splash.png,sha256=85_BQotR1q24uCthrKm4SB_6ZOMwRjR-Jdp1XBHSTyg,5368
@@ -126,7 +126,7 @@ not1mm/lib/rot_interface.py,sha256=bOyxpV9pQHORUY5qfNZE2QAV1V71QEG2jooiI2p9AwE,3
126
126
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
127
127
  not1mm/lib/settings.py,sha256=5xnsagH48qGeCDhfxPWW9yaXtv8wT13yoIVvYt8h_Qs,16023
128
128
  not1mm/lib/super_check_partial.py,sha256=jX7DjHesEV4KNVQbddJui0wAsYHerikH7W0iPv7PXQw,3110
129
- not1mm/lib/version.py,sha256=4iMPCwhlJpDccy4P7xQiiY0DegdZm8jICpkoDKVNsGs,50
129
+ not1mm/lib/version.py,sha256=XJ5BjNfUs1KD9OnkcLtp7k0u9aF3RRuYm3384OYrxCY,48
130
130
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
131
131
  not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
132
132
  not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
@@ -163,7 +163,7 @@ not1mm/plugins/ea_majistad_ssb.py,sha256=kZoFknVkslHAEjvleV8shsJEwk12Q3aU6qcmBXz
163
163
  not1mm/plugins/ea_rtty.py,sha256=r6c85eyGHbx_ZLBIqKI96vIMqCGH0KCZq2pd-GQt_Dg,23259
164
164
  not1mm/plugins/es_field_day.py,sha256=neBPerH9TSnVhBFB0bCXVfjBBAYwlDZgcZjqFbmGvNE,19166
165
165
  not1mm/plugins/es_open.py,sha256=xFp7fdMMdEZyey99Qws5gd7S5HRiF_gAk7qz4AyWneE,18719
166
- not1mm/plugins/general_logging.py,sha256=eQuna-LnrWpf93LmHTTo6956GWoGocVfeYnzY5cyTmw,9600
166
+ not1mm/plugins/general_logging.py,sha256=htN7G4lPi5k9CN-evStAemXSyCbgsWp-dtMXwFHmskE,9852
167
167
  not1mm/plugins/helvetia.py,sha256=nvgFjCq-_5XF0cLiCVFFwAS8NtIIFPDptr8eLsoprGE,20082
168
168
  not1mm/plugins/iaru_fieldday_r1_cw.py,sha256=1AVyZFi3ri2zqaNJY181Wtyz74fai8QLoi7PoyXpfaY,17218
169
169
  not1mm/plugins/iaru_fieldday_r1_ssb.py,sha256=w0j4MY1LeGxOaQfRjxRS-Q4waTOOt-hbxA1spil7z_I,17222
@@ -190,9 +190,9 @@ not1mm/plugins/ukeidx.py,sha256=ZsIFXgOSwjuKNmN4W_C0TAgGqgnabJGNLMHwGkl3_bk,1910
190
190
  not1mm/plugins/vhf_sprint.py,sha256=a9QFTpv8XUbZ_GLjdVCh7svykFa-gXOWwKFZ6MD3uQM,19289
191
191
  not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
192
192
  not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
193
- not1mm-25.6.13.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
194
- not1mm-25.6.13.1.dist-info/METADATA,sha256=aq7L2UE4N-ipeuRVJ8eouicmYklQYZyX9pJXMRKd7xE,36720
195
- not1mm-25.6.13.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
196
- not1mm-25.6.13.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
197
- not1mm-25.6.13.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
198
- not1mm-25.6.13.1.dist-info/RECORD,,
193
+ not1mm-25.6.16.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
194
+ not1mm-25.6.16.dist-info/METADATA,sha256=4VBOLdBzE5DkYo5tRN2wmAycdQTMG3pUORRzpACvMJ4,36872
195
+ not1mm-25.6.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
196
+ not1mm-25.6.16.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
197
+ not1mm-25.6.16.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
198
+ not1mm-25.6.16.dist-info/RECORD,,