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 +1 -0
- not1mm/data/rotator.ui +6 -0
- not1mm/dxcc_tracker.py +4 -2
- not1mm/lib/version.py +1 -1
- not1mm/plugins/general_logging.py +6 -2
- not1mm/rtc_service.py +8 -6
- not1mm/statistics.py +33 -27
- not1mm/vfo.py +52 -51
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/METADATA +3 -1
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/RECORD +14 -14
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/WHEEL +0 -0
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/entry_points.txt +0 -0
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/licenses/LICENSE +0 -0
- {not1mm-25.6.13.1.dist-info → not1mm-25.6.16.dist-info}/top_level.txt +0 -0
not1mm/bandmap.py
CHANGED
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
|
-
|
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
@@ -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
|
-
|
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
|
-
|
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
|
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(
|
34
|
-
|
35
|
-
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
131
|
-
|
132
|
-
|
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 =
|
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 =
|
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 =
|
150
|
-
|
151
|
-
|
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 =
|
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 =
|
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 =
|
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 =
|
171
|
-
|
172
|
-
|
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 =
|
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 =
|
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
|
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
|
-
|
40
|
-
|
41
|
-
|
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 =
|
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
|
-
|
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(
|
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
|
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.
|
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=
|
3
|
+
not1mm/bandmap.py,sha256=PpoZIuJ8dTj9erW0xYqbyneZrSQ-CEqbpek5jTlc6PQ,31173
|
4
4
|
not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
|
5
|
-
not1mm/dxcc_tracker.py,sha256=
|
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=
|
13
|
-
not1mm/statistics.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
194
|
-
not1mm-25.6.
|
195
|
-
not1mm-25.6.
|
196
|
-
not1mm-25.6.
|
197
|
-
not1mm-25.6.
|
198
|
-
not1mm-25.6.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|