not1mm 24.4.2__py3-none-any.whl → 24.4.4__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 +29 -26
- not1mm/bandmap.py +10 -4
- not1mm/checkwindow.py +9 -5
- not1mm/data/vfo.ui +12 -0
- not1mm/lib/lookup.py +6 -0
- not1mm/lib/new_contest.py +11 -0
- not1mm/lib/version.py +1 -1
- not1mm/logwindow.py +9 -3
- not1mm/plugins/10_10_fall_cw.py +2 -0
- not1mm/plugins/10_10_spring_cw.py +2 -0
- not1mm/plugins/10_10_summer_phone.py +2 -0
- not1mm/plugins/10_10_winter_phone.py +2 -0
- not1mm/plugins/arrl_10m.py +2 -0
- not1mm/plugins/arrl_dx_cw.py +2 -0
- not1mm/plugins/arrl_dx_ssb.py +2 -0
- not1mm/plugins/arrl_field_day.py +2 -0
- not1mm/plugins/arrl_rtty_ru.py +2 -0
- not1mm/plugins/arrl_ss_cw.py +2 -5
- not1mm/plugins/arrl_ss_phone.py +2 -5
- not1mm/plugins/arrl_vhf_jan.py +2 -0
- not1mm/plugins/arrl_vhf_jun.py +2 -0
- not1mm/plugins/arrl_vhf_sep.py +2 -0
- not1mm/plugins/canada_day.py +2 -0
- not1mm/plugins/cq_160_cw.py +2 -0
- not1mm/plugins/cq_160_ssb.py +2 -0
- not1mm/plugins/cq_wpx_cw.py +2 -0
- not1mm/plugins/cq_wpx_ssb.py +2 -0
- not1mm/plugins/cq_ww_cw.py +2 -0
- not1mm/plugins/cq_ww_ssb.py +2 -0
- not1mm/plugins/cwt.py +3 -0
- not1mm/plugins/general_logging.py +1 -1
- not1mm/plugins/iaru_hf.py +2 -0
- not1mm/plugins/jidx_cw.py +2 -0
- not1mm/plugins/jidx_ph.py +2 -0
- not1mm/plugins/naqp_cw.py +2 -0
- not1mm/plugins/naqp_ssb.py +2 -0
- not1mm/plugins/phone_weekly_test.py +2 -0
- not1mm/plugins/stew_perry_topband.py +1 -0
- not1mm/plugins/winter_field_day.py +2 -0
- not1mm/vfo.py +15 -7
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/METADATA +7 -6
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/RECORD +46 -46
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/LICENSE +0 -0
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/WHEEL +0 -0
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/entry_points.txt +0 -0
- {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -18,7 +18,6 @@ import platform
|
|
18
18
|
import re
|
19
19
|
import socket
|
20
20
|
|
21
|
-
# import subprocess
|
22
21
|
import sys
|
23
22
|
import threading
|
24
23
|
import uuid
|
@@ -34,7 +33,7 @@ import soundfile as sf
|
|
34
33
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic
|
35
34
|
from PyQt6.QtCore import QDir, Qt
|
36
35
|
from PyQt6.QtGui import QFontDatabase, QColorConstants
|
37
|
-
from PyQt6.QtWidgets import QFileDialog
|
36
|
+
from PyQt6.QtWidgets import QFileDialog
|
38
37
|
|
39
38
|
from not1mm.lib.about import About
|
40
39
|
from not1mm.lib.cat_interface import CAT
|
@@ -1390,32 +1389,34 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1390
1389
|
|
1391
1390
|
def launch_log_window(self) -> None:
|
1392
1391
|
"""Launch the log window"""
|
1393
|
-
if
|
1394
|
-
self.log_window
|
1395
|
-
|
1392
|
+
if self.log_window:
|
1393
|
+
self.log_window.close()
|
1394
|
+
self.log_window = LogWindow()
|
1395
|
+
self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.log_window)
|
1396
1396
|
self.log_window.show()
|
1397
1397
|
|
1398
1398
|
def launch_bandmap_window(self) -> None:
|
1399
1399
|
"""Launch the bandmap window"""
|
1400
|
-
if
|
1401
|
-
self.bandmap_window
|
1402
|
-
|
1403
|
-
|
1404
|
-
)
|
1400
|
+
if self.bandmap_window:
|
1401
|
+
self.bandmap_window.close()
|
1402
|
+
self.bandmap_window = BandMapWindow()
|
1403
|
+
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.bandmap_window)
|
1405
1404
|
self.bandmap_window.show()
|
1406
1405
|
|
1407
1406
|
def launch_check_window(self) -> None:
|
1408
1407
|
"""Launch the check window"""
|
1409
|
-
if
|
1410
|
-
self.check_window
|
1411
|
-
|
1408
|
+
if self.check_window:
|
1409
|
+
self.check_window.close()
|
1410
|
+
self.check_window = CheckWindow()
|
1411
|
+
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.check_window)
|
1412
1412
|
self.check_window.show()
|
1413
1413
|
|
1414
1414
|
def launch_vfo(self) -> None:
|
1415
1415
|
"""Launch the VFO window"""
|
1416
|
-
if
|
1417
|
-
self.vfo_window
|
1418
|
-
|
1416
|
+
if self.vfo_window:
|
1417
|
+
self.vfo_window.close()
|
1418
|
+
self.vfo_window = VfoWindow()
|
1419
|
+
self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.vfo_window)
|
1419
1420
|
self.vfo_window.show()
|
1420
1421
|
|
1421
1422
|
def clear_band_indicators(self) -> None:
|
@@ -2949,12 +2950,14 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2949
2950
|
debug_response = f"{response}"
|
2950
2951
|
logger.debug("The Response: %s\n", debug_response)
|
2951
2952
|
if response:
|
2952
|
-
theirgrid = response.get("grid")
|
2953
|
+
theirgrid = response.get("grid", "")
|
2953
2954
|
self.contact["GridSquare"] = theirgrid
|
2954
|
-
_theircountry = response.get("country")
|
2955
|
+
_theircountry = response.get("country", "")
|
2955
2956
|
if self.station.get("GridSquare", ""):
|
2956
2957
|
heading = bearing(self.station.get("GridSquare", ""), theirgrid)
|
2957
|
-
kilometers = distance(
|
2958
|
+
kilometers = distance(
|
2959
|
+
self.station.get("GridSquare", ""), theirgrid
|
2960
|
+
)
|
2958
2961
|
self.heading_distance.setText(
|
2959
2962
|
f"{theirgrid} Hdg {heading}° LP {reciprocol(heading)}° / "
|
2960
2963
|
f"distance {int(kilometers*0.621371)}mi {kilometers}km"
|
@@ -3178,9 +3181,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3178
3181
|
)
|
3179
3182
|
try:
|
3180
3183
|
fsutils.openFileWithOS(fsutils.USER_DATA_PATH / macro_file)
|
3181
|
-
except:
|
3182
|
-
logger.
|
3183
|
-
f"Could not open file {fsutils.USER_DATA_PATH / macro_file}"
|
3184
|
+
except FileNotFoundError | PermissionError | OSError as err:
|
3185
|
+
logger.critical(
|
3186
|
+
f"Could not open file {fsutils.USER_DATA_PATH / macro_file} {err}"
|
3184
3187
|
)
|
3185
3188
|
|
3186
3189
|
def read_cw_macros(self) -> None:
|
@@ -3311,18 +3314,18 @@ def install_icons() -> None:
|
|
3311
3314
|
if sys.platform == "linux":
|
3312
3315
|
os.system(
|
3313
3316
|
"xdg-icon-resource install --size 32 --context apps --mode user "
|
3314
|
-
f"{fsutils.
|
3317
|
+
f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-32.png k6gte-not1mm"
|
3315
3318
|
)
|
3316
3319
|
os.system(
|
3317
3320
|
"xdg-icon-resource install --size 64 --context apps --mode user "
|
3318
|
-
f"{fsutils.
|
3321
|
+
f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-64.png k6gte-not1mm"
|
3319
3322
|
)
|
3320
3323
|
os.system(
|
3321
3324
|
"xdg-icon-resource install --size 128 --context apps --mode user "
|
3322
|
-
f"{fsutils.
|
3325
|
+
f"{fsutils.APP_DATA_PATH}/k6gte.not1mm-128.png k6gte-not1mm"
|
3323
3326
|
)
|
3324
3327
|
os.system(
|
3325
|
-
f"xdg-desktop-menu install {fsutils.
|
3328
|
+
f"xdg-desktop-menu install {fsutils.APP_DATA_PATH}/k6gte-not1mm.desktop"
|
3326
3329
|
)
|
3327
3330
|
|
3328
3331
|
|
not1mm/bandmap.py
CHANGED
@@ -17,8 +17,8 @@ from decimal import Decimal
|
|
17
17
|
from json import loads
|
18
18
|
|
19
19
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
|
20
|
-
from PyQt6.QtCore import Qt
|
21
20
|
from PyQt6.QtGui import QColorConstants
|
21
|
+
from PyQt6.QtWidgets import QDockWidget
|
22
22
|
|
23
23
|
import not1mm.fsutils as fsutils
|
24
24
|
from not1mm.lib.multicast import Multicast
|
@@ -302,7 +302,7 @@ class Database:
|
|
302
302
|
)
|
303
303
|
|
304
304
|
|
305
|
-
class BandMapWindow(
|
305
|
+
class BandMapWindow(QDockWidget):
|
306
306
|
"""The BandMapWindow class."""
|
307
307
|
|
308
308
|
zoom = 5
|
@@ -321,11 +321,17 @@ class BandMapWindow(QtWidgets.QDockWidget):
|
|
321
321
|
multicast_interface = None
|
322
322
|
text_color = QtGui.QColor(45, 45, 45)
|
323
323
|
|
324
|
-
def __init__(self
|
325
|
-
super().__init__(
|
324
|
+
def __init__(self):
|
325
|
+
super().__init__()
|
326
326
|
self._udpwatch = None
|
327
327
|
|
328
328
|
uic.loadUi(fsutils.APP_DATA_PATH / "bandmap.ui", self)
|
329
|
+
self.setFeatures(
|
330
|
+
QDockWidget.DockWidgetFeature.DockWidgetMovable
|
331
|
+
| QDockWidget.DockWidgetFeature.DockWidgetFloatable
|
332
|
+
| QDockWidget.DockWidgetFeature.DockWidgetClosable
|
333
|
+
)
|
334
|
+
self.setAllowedAreas(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas)
|
329
335
|
self.settings = self.get_settings()
|
330
336
|
self.agetime = self.clear_spot_olderSpinBox.value()
|
331
337
|
self.clear_spot_olderSpinBox.valueChanged.connect(self.spot_aging_changed)
|
not1mm/checkwindow.py
CHANGED
@@ -12,8 +12,7 @@ import queue
|
|
12
12
|
from json import loads
|
13
13
|
import Levenshtein
|
14
14
|
|
15
|
-
from PyQt6 import QtGui, uic
|
16
|
-
from PyQt6.QtCore import Qt
|
15
|
+
from PyQt6 import QtGui, uic, QtCore
|
17
16
|
from PyQt6.QtWidgets import QLabel, QVBoxLayout, QWidget, QDockWidget
|
18
17
|
from PyQt6.QtGui import QMouseEvent, QColorConstants
|
19
18
|
|
@@ -41,8 +40,8 @@ class CheckWindow(QDockWidget):
|
|
41
40
|
|
42
41
|
masterScrollWidget: QWidget = None
|
43
42
|
|
44
|
-
def __init__(self
|
45
|
-
super().__init__(
|
43
|
+
def __init__(self):
|
44
|
+
super().__init__()
|
46
45
|
self.load_pref()
|
47
46
|
self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
|
48
47
|
"current_database", "ham.db"
|
@@ -51,7 +50,12 @@ class CheckWindow(QDockWidget):
|
|
51
50
|
self.database.current_contest = self.pref.get("contest", 0)
|
52
51
|
|
53
52
|
uic.loadUi(fsutils.APP_DATA_PATH / "checkwindow.ui", self)
|
54
|
-
|
53
|
+
self.setFeatures(
|
54
|
+
QDockWidget.DockWidgetFeature.DockWidgetMovable
|
55
|
+
| QDockWidget.DockWidgetFeature.DockWidgetFloatable
|
56
|
+
| QDockWidget.DockWidgetFeature.DockWidgetClosable
|
57
|
+
)
|
58
|
+
self.setAllowedAreas(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas)
|
55
59
|
self.mscp = SCP(fsutils.APP_DATA_PATH)
|
56
60
|
self._udpwatch = None
|
57
61
|
self.udp_fifo = queue.Queue()
|
not1mm/data/vfo.ui
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
<ui version="4.0">
|
3
3
|
<class>DockWidget</class>
|
4
4
|
<widget class="QDockWidget" name="DockWidget">
|
5
|
+
<property name="windowModality">
|
6
|
+
<enum>Qt::ApplicationModal</enum>
|
7
|
+
</property>
|
5
8
|
<property name="geometry">
|
6
9
|
<rect>
|
7
10
|
<x>0</x>
|
@@ -10,6 +13,14 @@
|
|
10
13
|
<height>132</height>
|
11
14
|
</rect>
|
12
15
|
</property>
|
16
|
+
<property name="font">
|
17
|
+
<font>
|
18
|
+
<family>JetBrains Mono</family>
|
19
|
+
</font>
|
20
|
+
</property>
|
21
|
+
<property name="features">
|
22
|
+
<set>QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
|
23
|
+
</property>
|
13
24
|
<property name="windowTitle">
|
14
25
|
<string>DockWidget</string>
|
15
26
|
</property>
|
@@ -28,6 +39,7 @@
|
|
28
39
|
<widget class="QLCDNumber" name="lcdNumber">
|
29
40
|
<property name="font">
|
30
41
|
<font>
|
42
|
+
<family>JetBrains Mono</family>
|
31
43
|
<pointsize>25</pointsize>
|
32
44
|
</font>
|
33
45
|
</property>
|
not1mm/lib/lookup.py
CHANGED
@@ -8,6 +8,7 @@ HamQTH
|
|
8
8
|
import logging
|
9
9
|
import xmltodict
|
10
10
|
import requests
|
11
|
+
from functools import lru_cache
|
11
12
|
|
12
13
|
logger = logging.getLogger("lookup")
|
13
14
|
|
@@ -21,6 +22,7 @@ class HamDBlookup:
|
|
21
22
|
self.url = "https://api.hamdb.org/"
|
22
23
|
self.error = False
|
23
24
|
|
25
|
+
@lru_cache(maxsize=1000)
|
24
26
|
def lookup(self, call: str) -> tuple:
|
25
27
|
"""
|
26
28
|
Lookup a call on QRZ
|
@@ -172,6 +174,7 @@ class QRZlookup:
|
|
172
174
|
self.session = False
|
173
175
|
self.error = f"{exception}"
|
174
176
|
|
177
|
+
@lru_cache(maxsize=1000)
|
175
178
|
def lookup(self, call: str) -> tuple:
|
176
179
|
"""
|
177
180
|
Lookup a call on QRZ
|
@@ -202,6 +205,7 @@ class QRZlookup:
|
|
202
205
|
root = baseroot.get("QRZDatabase")
|
203
206
|
return root.get("Callsign")
|
204
207
|
|
208
|
+
@lru_cache(maxsize=1000)
|
205
209
|
def parse_lookup(self, query_result):
|
206
210
|
"""
|
207
211
|
Returns gridsquare and name for a callsign looked up by qrz or hamdb.
|
@@ -328,6 +332,7 @@ class HamQTH:
|
|
328
332
|
self.error = session.get("error")
|
329
333
|
logger.info("session: %s", self.session)
|
330
334
|
|
335
|
+
@lru_cache(maxsize=1000)
|
331
336
|
def lookup(self, call: str) -> tuple:
|
332
337
|
"""
|
333
338
|
Lookup a call on HamQTH
|
@@ -364,6 +369,7 @@ class HamQTH:
|
|
364
369
|
the_result = self.parse_lookup(root)
|
365
370
|
return the_result
|
366
371
|
|
372
|
+
@lru_cache(maxsize=1000)
|
367
373
|
def parse_lookup(self, root) -> dict:
|
368
374
|
"""
|
369
375
|
Returns gridsquare and name for a callsign
|
not1mm/lib/new_contest.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
"""New Contest Dialog"""
|
2
2
|
|
3
|
+
import importlib
|
3
4
|
from PyQt6 import QtWidgets, uic
|
4
5
|
|
5
6
|
|
@@ -10,6 +11,16 @@ class NewContest(QtWidgets.QDialog):
|
|
10
11
|
super().__init__(None)
|
11
12
|
uic.loadUi(app_data_path / "new_contest.ui", self)
|
12
13
|
self.buttonBox.clicked.connect(self.store)
|
14
|
+
self.contest.currentTextChanged.connect(self.add_exchange_hint)
|
13
15
|
|
14
16
|
def store(self):
|
15
17
|
"""dialog magic"""
|
18
|
+
|
19
|
+
def add_exchange_hint(self):
|
20
|
+
"""add hint"""
|
21
|
+
contest_name = self.contest.currentText().lower().replace(" ", "_")
|
22
|
+
temp = importlib.import_module(f"not1mm.plugins.{contest_name}")
|
23
|
+
if hasattr(temp, "EXCHANGE_HINT"):
|
24
|
+
self.exchange.setPlaceholderText(temp.EXCHANGE_HINT)
|
25
|
+
else:
|
26
|
+
self.exchange.setPlaceholderText("")
|
not1mm/lib/version.py
CHANGED
not1mm/logwindow.py
CHANGED
@@ -15,7 +15,7 @@ from json import loads
|
|
15
15
|
|
16
16
|
import math
|
17
17
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic
|
18
|
-
from PyQt6.QtCore import
|
18
|
+
from PyQt6.QtCore import QItemSelectionModel
|
19
19
|
from PyQt6.QtWidgets import QDockWidget
|
20
20
|
|
21
21
|
import not1mm.fsutils as fsutils
|
@@ -87,8 +87,8 @@ class LogWindow(QDockWidget):
|
|
87
87
|
21: "UUID",
|
88
88
|
}
|
89
89
|
|
90
|
-
def __init__(self
|
91
|
-
super().__init__(
|
90
|
+
def __init__(self):
|
91
|
+
super().__init__()
|
92
92
|
self.table_loading = True
|
93
93
|
self._udpwatch = None
|
94
94
|
self.udp_fifo = queue.Queue()
|
@@ -103,6 +103,12 @@ class LogWindow(QDockWidget):
|
|
103
103
|
self.database.current_contest = self.pref.get("contest", 0)
|
104
104
|
self.contact = self.database.empty_contact
|
105
105
|
uic.loadUi(fsutils.APP_DATA_PATH / "logwindow.ui", self)
|
106
|
+
self.setFeatures(
|
107
|
+
QDockWidget.DockWidgetFeature.DockWidgetMovable
|
108
|
+
| QDockWidget.DockWidgetFeature.DockWidgetFloatable
|
109
|
+
| QDockWidget.DockWidgetFeature.DockWidgetClosable
|
110
|
+
)
|
111
|
+
self.setAllowedAreas(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas)
|
106
112
|
self.setWindowTitle(
|
107
113
|
f"QSO History - {self.pref.get('current_database', 'ham.db')}"
|
108
114
|
)
|
not1mm/plugins/10_10_fall_cw.py
CHANGED
not1mm/plugins/arrl_10m.py
CHANGED
not1mm/plugins/arrl_dx_cw.py
CHANGED
not1mm/plugins/arrl_dx_ssb.py
CHANGED
not1mm/plugins/arrl_field_day.py
CHANGED
not1mm/plugins/arrl_rtty_ru.py
CHANGED
not1mm/plugins/arrl_ss_cw.py
CHANGED
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
|
|
14
14
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
17
|
+
EXCHANGE_HINT = "Prec Call Check Section"
|
18
|
+
|
17
19
|
name = "ARRL Sweepstakes CW"
|
18
20
|
cabrillo_name = "ARRL-SS-CW"
|
19
21
|
mode = "CW" # CW SSB BOTH RTTY
|
@@ -381,23 +383,19 @@ def parse_exchange(self):
|
|
381
383
|
for tokens in exchange.split():
|
382
384
|
text = ""
|
383
385
|
numb = ""
|
384
|
-
print(f"'{tokens}'")
|
385
386
|
if tokens.isdigit():
|
386
|
-
print(f"{tokens} is digits")
|
387
387
|
if sn == "":
|
388
388
|
sn = tokens
|
389
389
|
else:
|
390
390
|
ck = tokens
|
391
391
|
continue
|
392
392
|
elif tokens.isalpha():
|
393
|
-
print(f"{tokens} is alpha")
|
394
393
|
if len(tokens) == 1:
|
395
394
|
prec = tokens
|
396
395
|
else:
|
397
396
|
sec = tokens
|
398
397
|
continue
|
399
398
|
elif tokens.isalnum():
|
400
|
-
print("isalnum")
|
401
399
|
if tokens[:1].isalpha():
|
402
400
|
print(f"{tokens} is callsign")
|
403
401
|
call = tokens
|
@@ -406,7 +404,6 @@ def parse_exchange(self):
|
|
406
404
|
if c.isalpha():
|
407
405
|
text = tokens[i:]
|
408
406
|
numb = tokens[:i]
|
409
|
-
print(f"{tokens[:i]} {tokens[i:]}")
|
410
407
|
break
|
411
408
|
if len(text) == 1:
|
412
409
|
prec = text
|
not1mm/plugins/arrl_ss_phone.py
CHANGED
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
|
|
14
14
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
16
|
|
17
|
+
EXCHANGE_HINT = "Prec Call Check Section"
|
18
|
+
|
17
19
|
name = "ARRL Sweepstakes Phone"
|
18
20
|
cabrillo_name = "ARRL-SS-SSB"
|
19
21
|
mode = "SSB" # CW SSB BOTH RTTY
|
@@ -383,30 +385,25 @@ def parse_exchange(self):
|
|
383
385
|
numb = ""
|
384
386
|
print(f"'{tokens}'")
|
385
387
|
if tokens.isdigit():
|
386
|
-
print(f"{tokens} is digits")
|
387
388
|
if sn == "":
|
388
389
|
sn = tokens
|
389
390
|
else:
|
390
391
|
ck = tokens
|
391
392
|
continue
|
392
393
|
elif tokens.isalpha():
|
393
|
-
print(f"{tokens} is alpha")
|
394
394
|
if len(tokens) == 1:
|
395
395
|
prec = tokens
|
396
396
|
else:
|
397
397
|
sec = tokens
|
398
398
|
continue
|
399
399
|
elif tokens.isalnum():
|
400
|
-
print("isalnum")
|
401
400
|
if tokens[:1].isalpha():
|
402
|
-
print(f"{tokens} is callsign")
|
403
401
|
call = tokens
|
404
402
|
continue
|
405
403
|
for i, c in enumerate(tokens):
|
406
404
|
if c.isalpha():
|
407
405
|
text = tokens[i:]
|
408
406
|
numb = tokens[:i]
|
409
|
-
print(f"{tokens[:i]} {tokens[i:]}")
|
410
407
|
break
|
411
408
|
if len(text) == 1:
|
412
409
|
prec = text
|
not1mm/plugins/arrl_vhf_jan.py
CHANGED
not1mm/plugins/arrl_vhf_jun.py
CHANGED
not1mm/plugins/arrl_vhf_sep.py
CHANGED
not1mm/plugins/canada_day.py
CHANGED
not1mm/plugins/cq_160_cw.py
CHANGED
not1mm/plugins/cq_160_ssb.py
CHANGED
not1mm/plugins/cq_wpx_cw.py
CHANGED
not1mm/plugins/cq_wpx_ssb.py
CHANGED
not1mm/plugins/cq_ww_cw.py
CHANGED
not1mm/plugins/cq_ww_ssb.py
CHANGED
not1mm/plugins/cwt.py
CHANGED
@@ -13,6 +13,9 @@ from not1mm.lib.plugin_common import gen_adif, get_points
|
|
13
13
|
from not1mm.lib.version import __version__
|
14
14
|
|
15
15
|
logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
EXCHANGE_HINT = "Name + Member No./'CWA'"
|
18
|
+
|
16
19
|
name = "CWT"
|
17
20
|
mode = "CW" # CW SSB BOTH RTTY
|
18
21
|
# columns = [0, 1, 2, 3, 4, 5, 6, 11, 15]
|
@@ -10,7 +10,7 @@ from not1mm.lib.plugin_common import gen_adif, get_points
|
|
10
10
|
from not1mm.lib.version import __version__
|
11
11
|
|
12
12
|
logger = logging.getLogger(__name__)
|
13
|
-
|
13
|
+
EXCHANGE_HINT = ""
|
14
14
|
name = "General Logging"
|
15
15
|
cabrillo_name = "General-Logging"
|
16
16
|
mode = "BOTH" # CW SSB BOTH RTTY
|
not1mm/plugins/iaru_hf.py
CHANGED
not1mm/plugins/jidx_cw.py
CHANGED
not1mm/plugins/jidx_ph.py
CHANGED
not1mm/plugins/naqp_cw.py
CHANGED
not1mm/plugins/naqp_ssb.py
CHANGED
not1mm/vfo.py
CHANGED
@@ -15,8 +15,8 @@ from json import loads, JSONDecodeError
|
|
15
15
|
|
16
16
|
import serial
|
17
17
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic
|
18
|
-
from PyQt6.QtCore import
|
19
|
-
from PyQt6.QtWidgets import
|
18
|
+
from PyQt6.QtCore import QTimer
|
19
|
+
from PyQt6.QtWidgets import QDockWidget
|
20
20
|
from PyQt6.QtGui import QColorConstants
|
21
21
|
|
22
22
|
import not1mm.fsutils as fsutils
|
@@ -36,14 +36,22 @@ class VfoWindow(QDockWidget):
|
|
36
36
|
multicast_interface = None
|
37
37
|
current_palette = None
|
38
38
|
|
39
|
-
def __init__(self
|
40
|
-
super().__init__(
|
39
|
+
def __init__(self):
|
40
|
+
super().__init__()
|
41
41
|
uic.loadUi(fsutils.APP_DATA_PATH / "vfo.ui", self)
|
42
|
+
|
43
|
+
self.setFeatures(
|
44
|
+
QDockWidget.DockWidgetFeature.DockWidgetMovable
|
45
|
+
| QDockWidget.DockWidgetFeature.DockWidgetFloatable
|
46
|
+
| QDockWidget.DockWidgetFeature.DockWidgetClosable
|
47
|
+
)
|
48
|
+
self.setAllowedAreas(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas)
|
49
|
+
self.setWindowTitle("VFO Window")
|
50
|
+
|
42
51
|
self.rig_control = None
|
43
52
|
self.timer = QTimer()
|
44
53
|
self.timer.timeout.connect(self.getwaiting)
|
45
54
|
self.load_pref()
|
46
|
-
self.setWindowTitle("VFO Window")
|
47
55
|
self.lcdNumber.display(0)
|
48
56
|
self.pico = None
|
49
57
|
self._udpwatch = None
|
@@ -56,7 +64,6 @@ class VfoWindow(QDockWidget):
|
|
56
64
|
self.multicast_interface.ready_read_connect(self.watch_udp)
|
57
65
|
|
58
66
|
self.setup_serial()
|
59
|
-
# app.processEvents()
|
60
67
|
self.poll_rig_timer = QtCore.QTimer()
|
61
68
|
self.poll_rig_timer.timeout.connect(self.poll_radio)
|
62
69
|
self.poll_rig_timer.start(500)
|
@@ -321,7 +328,8 @@ class VfoWindow(QDockWidget):
|
|
321
328
|
Display an alert box with the supplied message.
|
322
329
|
"""
|
323
330
|
message_box = QtWidgets.QMessageBox()
|
324
|
-
|
331
|
+
if self.current_palette:
|
332
|
+
message_box.setPalette(self.current_palette)
|
325
333
|
message_box.setIcon(QtWidgets.QMessageBox.Icon.Information)
|
326
334
|
message_box.setText(message)
|
327
335
|
message_box.setWindowTitle("Information")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 24.4.
|
3
|
+
Version: 24.4.4
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
6
|
Project-URL: Homepage, https://github.com/mbridak/not1mm
|
@@ -32,17 +32,17 @@ Requires-Dist: Levenshtein
|
|
32
32
|
|
33
33
|
# Not1MM
|
34
34
|
|
35
|
-
|
35
|
+

|
36
|
+
|
37
|
+
The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
|
36
38
|
|
37
39
|
[](https://pypi.org/project/not1mm/)
|
38
40
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
39
41
|
[](https://www.python.org/downloads/)
|
40
|
-
[](https://pypi.org/project/PyQt6/)
|
41
43
|
[](https://xkcd.com/1695/)
|
42
44
|
[](https://pypi.org/project/not1mm/)
|
43
45
|
|
44
|
-

|
45
|
-
|
46
46
|
- [Not1MM](#not1mm)
|
47
47
|
- [What and why is Not1MM](#what-and-why-is-not1mm)
|
48
48
|
- [Current state](#current-state)
|
@@ -177,6 +177,7 @@ I wish to thank those who've contributed to the project.
|
|
177
177
|
|
178
178
|
## Recent Changes
|
179
179
|
|
180
|
+
- [24-4-4] Added per-contest echange hint when adding new contest.
|
180
181
|
- [24-4-2] Migrated to PyQt6. I'm sure there are broken things.
|
181
182
|
- [24-4-1-2] Added color text indicators to the Check Partial window. Poached the code from @kyleboyle. Thanks! Fixed the Log, VFO and Check Partial windows to be actual docking widgets. Refocus call field after double clicking on item in the check partial window.
|
182
183
|
- [24-4-1] Removed some un-needed loops and widgets from the check window. Fixed docking to the left side.
|
@@ -207,7 +208,7 @@ noted the minimum steps needed to install not1mm.
|
|
207
208
|
```bash
|
208
209
|
sudo apt update
|
209
210
|
sudo apt upgrade
|
210
|
-
sudo apt install -y libportaudio2 python3-pip python3-
|
211
|
+
sudo apt install -y libportaudio2 python3-pip python3-pyqt6 python3-numpy
|
211
212
|
pip install -U not1mm
|
212
213
|
```
|
213
214
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
3
|
-
not1mm/bandmap.py,sha256
|
4
|
-
not1mm/checkwindow.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=ofO8dhlMfS9G3ih_UEpxCCOWU1vmqMfH6CDCUqLbzOE,119858
|
3
|
+
not1mm/bandmap.py,sha256=-wHbUmj-zqefyFO_ydLECwTtWcs37tSkA7Xm2zOVcLA,34318
|
4
|
+
not1mm/checkwindow.py,sha256=ncIOZmuhM_eLR1gb-St8FqEefbUkD9p9VltFDJVxLeY,10465
|
5
5
|
not1mm/fsutils.py,sha256=Li8Tq9K7c_q7onOHOQ7u1dOOFfhIIz5Aj2LKuQtGOO4,1652
|
6
|
-
not1mm/logwindow.py,sha256=
|
7
|
-
not1mm/vfo.py,sha256=
|
6
|
+
not1mm/logwindow.py,sha256=H6FbKowq5ekEhALRPiRugZk_Rv1mwtMF5VT_OBZ63Oo,44900
|
7
|
+
not1mm/vfo.py,sha256=HIr73gob-JLaJqn0TpTYxWApwKR1YpmA43M8QyTnYik,12467
|
8
8
|
not1mm/data/JetBrainsMono-Regular.ttf,sha256=UOHctAKY_PzCGh7zy-6f6egnCcSK0wzmF0csBqO9lDY,203952
|
9
9
|
not1mm/data/MASTER.SCP,sha256=1vQRvEZ865brfmmajp-Lj-hgWejVGI992q8o971bUV8,366478
|
10
10
|
not1mm/data/about.ui,sha256=7TqvtXFFm0Rmcu0bmLupwpO1CsK8MekfZ09_xn6kZrQ,2067
|
@@ -37,7 +37,7 @@ not1mm/data/radio_red.png,sha256=QvkMk7thd_hCEIyK5xGAG4xVVXivl39nwOfD8USDI20,957
|
|
37
37
|
not1mm/data/reddot.png,sha256=M33jEMoU8W4rQ4_MVyzzKxDPDte1ypKBch5VnUMNLKE,565
|
38
38
|
not1mm/data/settings.ui,sha256=7r4aZwxKUHQGm8NLQGLINurGMvT_5VMU9p2dznW25bA,40028
|
39
39
|
not1mm/data/ssbmacros.txt,sha256=0Qccj4y0nlK-w5da9a9ti-jILkURtwztoDuL_D0pEJM,470
|
40
|
-
not1mm/data/vfo.ui,sha256=
|
40
|
+
not1mm/data/vfo.ui,sha256=oJJnjLhIv2PF5Hji5sThzjlhB2_4TbqWS8S1_3XKvjY,1986
|
41
41
|
not1mm/data/phonetics/0.wav,sha256=0OpYiR-3MK6fVHE6MB-HeOxSAPiDNMjqvx5JcIZtsQk,42590
|
42
42
|
not1mm/data/phonetics/1.wav,sha256=OEAavA8cfVxFZwaT0HY9Wg9NAGEPKBhwhEdzGXkQs_U,30248
|
43
43
|
not1mm/data/phonetics/2.wav,sha256=AmCfvo8y8BT9OlHkCs_N4y_mUAjmyG_x9ahbgiwU2FE,29584
|
@@ -96,51 +96,51 @@ not1mm/lib/edit_macro.py,sha256=raKWBwsHInj5EUKmvyLQ6gqc3ZFDlstsD3xqoM4PC8E,517
|
|
96
96
|
not1mm/lib/edit_opon.py,sha256=j3qJ1aBsQoIOnQ9yiBl3lyeISvKTP0I_rtBYBPAfgeI,359
|
97
97
|
not1mm/lib/edit_station.py,sha256=doL21Hs6jzIE43ohAopdFt_iqnRJZHFcqzcnCS0-iio,1965
|
98
98
|
not1mm/lib/ham_utility.py,sha256=pUrysod3wGk4BYOWDAKJxZZTiUNDE4ZzRk8S5ZnllNA,10978
|
99
|
-
not1mm/lib/lookup.py,sha256=
|
99
|
+
not1mm/lib/lookup.py,sha256=F2fl5QkMxaGSxl1XMWnLUub3T9Mt7LhCX4acOlAsks4,13952
|
100
100
|
not1mm/lib/multicast.py,sha256=bnFUNHyy82GmIb3_88EPBVVssj7-HzkJPaH671cK8Qw,3249
|
101
101
|
not1mm/lib/n1mm.py,sha256=V1NiNyOHaPNYKe_vRsq44O1R42N8uS5PlfRa5Db4Tv0,5712
|
102
|
-
not1mm/lib/new_contest.py,sha256=
|
102
|
+
not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
|
103
103
|
not1mm/lib/plugin_common.py,sha256=AAKBPCXzTWZJb-h08uPNnHVG7bSCg7kwukc211gFivY,8605
|
104
104
|
not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
|
105
105
|
not1mm/lib/settings.py,sha256=tlXlJUUZP0IFwIDc9DboM5_1by_tHNtMXvyJ0E7B6RI,8877
|
106
106
|
not1mm/lib/super_check_partial.py,sha256=p5l3u2ZOCBtlWgbvskC50FpuoaIpR07tfC6zTdRWbh4,2334
|
107
|
-
not1mm/lib/version.py,sha256=
|
107
|
+
not1mm/lib/version.py,sha256=HjO--fiMajqd0V_9fJOBO07Crj2XOf9gi0rZlRjUAi8,47
|
108
108
|
not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
|
109
|
-
not1mm/plugins/10_10_fall_cw.py,sha256=
|
110
|
-
not1mm/plugins/10_10_spring_cw.py,sha256=
|
111
|
-
not1mm/plugins/10_10_summer_phone.py,sha256=
|
112
|
-
not1mm/plugins/10_10_winter_phone.py,sha256=
|
109
|
+
not1mm/plugins/10_10_fall_cw.py,sha256=fUjfwjuscDjicXIxsO0JHh7xTR9Vu0iPsrOLb896Qak,10873
|
110
|
+
not1mm/plugins/10_10_spring_cw.py,sha256=WNaJP5mBQfaB6SxnFI0Vawt3AKDr94tKVtAK-EVhtUY,10878
|
111
|
+
not1mm/plugins/10_10_summer_phone.py,sha256=_dgrXDQ4S44EiTr1bDydSBkvY9jOY_ll8PQ54eXfd8U,10887
|
112
|
+
not1mm/plugins/10_10_winter_phone.py,sha256=8uKM7iE6_fkARUpvOZeTmJkgME5nAhGq7axOX7JA4sg,10890
|
113
113
|
not1mm/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
|
-
not1mm/plugins/arrl_10m.py,sha256
|
115
|
-
not1mm/plugins/arrl_dx_cw.py,sha256=
|
116
|
-
not1mm/plugins/arrl_dx_ssb.py,sha256=
|
117
|
-
not1mm/plugins/arrl_field_day.py,sha256=
|
118
|
-
not1mm/plugins/arrl_rtty_ru.py,sha256=
|
119
|
-
not1mm/plugins/arrl_ss_cw.py,sha256=
|
120
|
-
not1mm/plugins/arrl_ss_phone.py,sha256=
|
121
|
-
not1mm/plugins/arrl_vhf_jan.py,sha256=
|
122
|
-
not1mm/plugins/arrl_vhf_jun.py,sha256=
|
123
|
-
not1mm/plugins/arrl_vhf_sep.py,sha256=
|
124
|
-
not1mm/plugins/canada_day.py,sha256=
|
125
|
-
not1mm/plugins/cq_160_cw.py,sha256=
|
126
|
-
not1mm/plugins/cq_160_ssb.py,sha256=
|
127
|
-
not1mm/plugins/cq_wpx_cw.py,sha256=
|
128
|
-
not1mm/plugins/cq_wpx_ssb.py,sha256=
|
129
|
-
not1mm/plugins/cq_ww_cw.py,sha256=
|
130
|
-
not1mm/plugins/cq_ww_ssb.py,sha256=
|
131
|
-
not1mm/plugins/cwt.py,sha256=
|
132
|
-
not1mm/plugins/general_logging.py,sha256=
|
133
|
-
not1mm/plugins/iaru_hf.py,sha256=
|
134
|
-
not1mm/plugins/jidx_cw.py,sha256=
|
135
|
-
not1mm/plugins/jidx_ph.py,sha256=
|
136
|
-
not1mm/plugins/naqp_cw.py,sha256=
|
137
|
-
not1mm/plugins/naqp_ssb.py,sha256=
|
138
|
-
not1mm/plugins/phone_weekly_test.py,sha256=
|
139
|
-
not1mm/plugins/stew_perry_topband.py,sha256=
|
140
|
-
not1mm/plugins/winter_field_day.py,sha256=
|
141
|
-
not1mm-24.4.
|
142
|
-
not1mm-24.4.
|
143
|
-
not1mm-24.4.
|
144
|
-
not1mm-24.4.
|
145
|
-
not1mm-24.4.
|
146
|
-
not1mm-24.4.
|
114
|
+
not1mm/plugins/arrl_10m.py,sha256=pnRyBqAZy5rP2kTWNyEX-fAjJTOF7ze8STc4KHULvTQ,13677
|
115
|
+
not1mm/plugins/arrl_dx_cw.py,sha256=B4mX8C1pPygioG8NjEXhrgSUrbhnXhceo1ZTbTB0hsQ,13722
|
116
|
+
not1mm/plugins/arrl_dx_ssb.py,sha256=aVhNnA2dGl5BLoIXY8ZuJ5nHNok8EFVN2y-dXN7H66o,13725
|
117
|
+
not1mm/plugins/arrl_field_day.py,sha256=OSro24LsSVW41yecKziWQMjflJbo62P8C53Q3M3-Lb0,10052
|
118
|
+
not1mm/plugins/arrl_rtty_ru.py,sha256=hKUS4isjdXo3EYxQrsqsDupPp2chW8fpoWj0T1pTgJ4,7994
|
119
|
+
not1mm/plugins/arrl_ss_cw.py,sha256=yxir0G-UfRCR2NiniTVyE2oWh6rEbTqUUNEm3Der5Ms,12989
|
120
|
+
not1mm/plugins/arrl_ss_phone.py,sha256=M9CKmzyzpEvwPYkbjJepzbOtJ2DVuxZLSmN_sYvT4Ic,12977
|
121
|
+
not1mm/plugins/arrl_vhf_jan.py,sha256=ttYIXvwlnwqp0Jg6zkwEj-f1aLj4SZ7gJKKfmpNa5n8,12481
|
122
|
+
not1mm/plugins/arrl_vhf_jun.py,sha256=I3dcU01n5-VC07EM3mWJu7CpKo515MduImi9P0sLWz4,11500
|
123
|
+
not1mm/plugins/arrl_vhf_sep.py,sha256=HR3zuArCNUu86Nh3xhbPiVNF4ug_GtBrGPwNEG131Fo,11500
|
124
|
+
not1mm/plugins/canada_day.py,sha256=X7T0AjEoooHlm0h37KuLb4u5hQsrCNp8qtd3affbUbE,11907
|
125
|
+
not1mm/plugins/cq_160_cw.py,sha256=0h90dF8avfl7UJcUsAK4SMuXpmStkssQB2gSQMW3tnU,14059
|
126
|
+
not1mm/plugins/cq_160_ssb.py,sha256=jhUc_1hc68jtv8vNS_UadqfaRjY1KnBPHJXGE1K27d4,14102
|
127
|
+
not1mm/plugins/cq_wpx_cw.py,sha256=iGuGvsLe9V_HzsGRjMckCPJBklvuDjyp9jVOX6Wr-1A,12399
|
128
|
+
not1mm/plugins/cq_wpx_ssb.py,sha256=C-25CMIhvKIhUx6j4TEvOK5597EwRYrTcHptILAoEnI,12487
|
129
|
+
not1mm/plugins/cq_ww_cw.py,sha256=O4E4r0Jbp-lz5Npuhe3GYPwJ9dcEalW1YNe3TusforU,11114
|
130
|
+
not1mm/plugins/cq_ww_ssb.py,sha256=WG_wsMuqt6F1M7DRvbW3c4kdl5nycUeIHcffjMHGVJs,11119
|
131
|
+
not1mm/plugins/cwt.py,sha256=YtgWH1wjXVmaTNfYG5e3yCrXnfbjOmxuTe8fFCqObFU,12020
|
132
|
+
not1mm/plugins/general_logging.py,sha256=1Y9ruPaxCQkvHHX6N0cwKjZtdC9az-jLbHnJLrcj3M0,3387
|
133
|
+
not1mm/plugins/iaru_hf.py,sha256=PN31WHeRyOFJf8obZPkoPySTxguIQ2KGG8ulj_ZzJRc,11461
|
134
|
+
not1mm/plugins/jidx_cw.py,sha256=Yc-LWjqhphAkiBxZT3KEAJzJ5IUKUdTQEMjfN1OUsBo,11090
|
135
|
+
not1mm/plugins/jidx_ph.py,sha256=S-0Pxti_OdIQGID7w0tR6G44J4hoxQ3XGaCWm_3LXOE,11092
|
136
|
+
not1mm/plugins/naqp_cw.py,sha256=27m1PtUQCROusrzs7OSx1Uxb5223ob5FJKksUj2BTjs,11510
|
137
|
+
not1mm/plugins/naqp_ssb.py,sha256=IWksulcb2_DxlkeW0h3048t8I-u00G_67KBVKkp-TV4,11515
|
138
|
+
not1mm/plugins/phone_weekly_test.py,sha256=gCX0ESUoiQzDp9puwibt9-dRembNsiuEeBdawCVvjHA,12316
|
139
|
+
not1mm/plugins/stew_perry_topband.py,sha256=DIMI3mGMKokXXb9pPLqdhBI6JVnnIs7ZnAL23nFmshE,10588
|
140
|
+
not1mm/plugins/winter_field_day.py,sha256=4rcfRtobwjHO6BNL3WOTHzBmyyeuX79BNGBG8PfjrI8,10238
|
141
|
+
not1mm-24.4.4.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
142
|
+
not1mm-24.4.4.dist-info/METADATA,sha256=w-lyauvXXE_ExubDbet2No9aXr7fuL_hsNe09gx1pBk,26634
|
143
|
+
not1mm-24.4.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
144
|
+
not1mm-24.4.4.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
145
|
+
not1mm-24.4.4.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
146
|
+
not1mm-24.4.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|