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.
Files changed (46) hide show
  1. not1mm/__main__.py +29 -26
  2. not1mm/bandmap.py +10 -4
  3. not1mm/checkwindow.py +9 -5
  4. not1mm/data/vfo.ui +12 -0
  5. not1mm/lib/lookup.py +6 -0
  6. not1mm/lib/new_contest.py +11 -0
  7. not1mm/lib/version.py +1 -1
  8. not1mm/logwindow.py +9 -3
  9. not1mm/plugins/10_10_fall_cw.py +2 -0
  10. not1mm/plugins/10_10_spring_cw.py +2 -0
  11. not1mm/plugins/10_10_summer_phone.py +2 -0
  12. not1mm/plugins/10_10_winter_phone.py +2 -0
  13. not1mm/plugins/arrl_10m.py +2 -0
  14. not1mm/plugins/arrl_dx_cw.py +2 -0
  15. not1mm/plugins/arrl_dx_ssb.py +2 -0
  16. not1mm/plugins/arrl_field_day.py +2 -0
  17. not1mm/plugins/arrl_rtty_ru.py +2 -0
  18. not1mm/plugins/arrl_ss_cw.py +2 -5
  19. not1mm/plugins/arrl_ss_phone.py +2 -5
  20. not1mm/plugins/arrl_vhf_jan.py +2 -0
  21. not1mm/plugins/arrl_vhf_jun.py +2 -0
  22. not1mm/plugins/arrl_vhf_sep.py +2 -0
  23. not1mm/plugins/canada_day.py +2 -0
  24. not1mm/plugins/cq_160_cw.py +2 -0
  25. not1mm/plugins/cq_160_ssb.py +2 -0
  26. not1mm/plugins/cq_wpx_cw.py +2 -0
  27. not1mm/plugins/cq_wpx_ssb.py +2 -0
  28. not1mm/plugins/cq_ww_cw.py +2 -0
  29. not1mm/plugins/cq_ww_ssb.py +2 -0
  30. not1mm/plugins/cwt.py +3 -0
  31. not1mm/plugins/general_logging.py +1 -1
  32. not1mm/plugins/iaru_hf.py +2 -0
  33. not1mm/plugins/jidx_cw.py +2 -0
  34. not1mm/plugins/jidx_ph.py +2 -0
  35. not1mm/plugins/naqp_cw.py +2 -0
  36. not1mm/plugins/naqp_ssb.py +2 -0
  37. not1mm/plugins/phone_weekly_test.py +2 -0
  38. not1mm/plugins/stew_perry_topband.py +1 -0
  39. not1mm/plugins/winter_field_day.py +2 -0
  40. not1mm/vfo.py +15 -7
  41. {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/METADATA +7 -6
  42. {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/RECORD +46 -46
  43. {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/LICENSE +0 -0
  44. {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/WHEEL +0 -0
  45. {not1mm-24.4.2.dist-info → not1mm-24.4.4.dist-info}/entry_points.txt +0 -0
  46. {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, QDockWidget
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 not self.log_window:
1394
- self.log_window = LogWindow()
1395
- self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.log_window)
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 not self.bandmap_window:
1401
- self.bandmap_window = BandMapWindow()
1402
- self.addDockWidget(
1403
- Qt.DockWidgetArea.RightDockWidgetArea, self.bandmap_window
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 not self.check_window:
1410
- self.check_window = CheckWindow()
1411
- self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.check_window)
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 not self.vfo_window:
1417
- self.vfo_window = VfoWindow()
1418
- self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.vfo_window)
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(self.station.get("GridSquare"), theirgrid)
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.exception(
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.MODULE_PATH}/data/k6gte.not1mm-32.png k6gte-not1mm"
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.MODULE_PATH}/data/k6gte.not1mm-64.png k6gte-not1mm"
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.MODULE_PATH}/data/k6gte.not1mm-128.png k6gte-not1mm"
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.MODULE_PATH}/data/k6gte-not1mm.desktop"
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(QtWidgets.QDockWidget):
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, *args, **kwargs):
325
- super().__init__(*args, **kwargs)
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, *args, **kwargs):
45
- super().__init__(*args, **kwargs)
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
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.4.2"
3
+ __version__ = "24.4.4"
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 Qt, QItemSelectionModel
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, *args, **kwargs):
91
- super().__init__(*args, **kwargs)
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
  )
@@ -13,6 +13,8 @@ from not1mm.lib.version import __version__
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
+ EXCHANGE_HINT = "Name + 10-10# + SPC"
17
+
16
18
  name = "10 10 FALL CW"
17
19
  cabrillo_name = "10-10-FALL-CW"
18
20
  mode = "CW" # CW SSB BOTH RTTY
@@ -12,6 +12,8 @@ from not1mm.lib.version import __version__
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
+ EXCHANGE_HINT = "Name + 10-10# + SPC"
16
+
15
17
  name = "10 10 SPRING CW"
16
18
  cabrillo_name = "10-10-SPRING-CW"
17
19
  mode = "CW" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "Name + 10-10# + SPC"
18
+
17
19
  name = "10 10 SUMMER PHONE"
18
20
  cabrillo_name = "10-10-SUMMER-PHONE"
19
21
  mode = "SSB" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "Name + 10-10# + SPC"
18
+
17
19
  name = "10 10 WINTER PHONE"
18
20
  cabrillo_name = "10-10-WINTER-PHONE"
19
21
  mode = "SSB" # CW SSB BOTH RTTY
@@ -57,6 +57,8 @@ from not1mm.lib.version import __version__
57
57
 
58
58
  logger = logging.getLogger(__name__)
59
59
 
60
+ EXCHANGE_HINT = "State/Province"
61
+
60
62
  name = "ARRL 10M"
61
63
  mode = "BOTH" # CW SSB BOTH RTTY
62
64
  cabrillo_name = "ARRL-10"
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "State/Province"
19
+
18
20
  name = "ARRL DX CW"
19
21
  cabrillo_name = "ARRL-DX-CW"
20
22
  mode = "CW" # CW SSB BOTH RTTY
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "State/Province"
19
+
18
20
  name = "ARRL DX SSB"
19
21
  cabrillo_name = "ARRL-DX-SSB"
20
22
  mode = "SSB" # CW SSB BOTH RTTY
@@ -13,6 +13,8 @@ from not1mm.lib.version import __version__
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
+ EXCHANGE_HINT = "1D ORG"
17
+
16
18
  name = "ARRL Field Day"
17
19
  mode = "BOTH" # CW SSB BOTH RTTY
18
20
  cabrillo_name = "ARRL-FD"
@@ -8,6 +8,8 @@ from pathlib import Path
8
8
 
9
9
  from PyQt6 import QtWidgets
10
10
 
11
+ EXCHANGE_HINT = ""
12
+
11
13
  name = "ARRL RTTY Round Up"
12
14
  cabrillo_name = "ARRL-RTTY"
13
15
  mode = "BOTH" # CW SSB BOTH RTTY
@@ -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
@@ -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
@@ -48,6 +48,8 @@ from not1mm.lib.version import __version__
48
48
 
49
49
  logger = logging.getLogger(__name__)
50
50
 
51
+ EXCHANGE_HINT = "4-character grid square"
52
+
51
53
  name = "ARRL VHF JAN"
52
54
  mode = "BOTH" # CW SSB BOTH RTTY
53
55
  cabrillo_name = "ARRL-VHF-JAN"
@@ -16,6 +16,8 @@ from not1mm.lib.version import __version__
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
19
+ EXCHANGE_HINT = "4-character grid square"
20
+
19
21
  name = "ARRL VHF JUN"
20
22
  mode = "BOTH" # CW SSB BOTH RTTY
21
23
  cabrillo_name = "ARRL-VHF-JUN"
@@ -16,6 +16,8 @@ from not1mm.lib.version import __version__
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
19
+ EXCHANGE_HINT = "4-character grid square"
20
+
19
21
  name = "ARRL VHF SEP"
20
22
  mode = "BOTH" # CW SSB BOTH RTTY
21
23
  cabrillo_name = "ARRL-VHF-SEP"
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "Province/Territory"
18
+
17
19
  name = "CANADA DAY"
18
20
  cabrillo_name = "CANADA-DAY"
19
21
  mode = "BOTH" # CW SSB BOTH RTTY
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "ST/Prov or DX CQ Zone"
19
+
18
20
  name = "CQ 160 CW"
19
21
  cabrillo_name = "CQ-160-CW"
20
22
  mode = "CW" # CW SSB BOTH RTTY
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "ST/Prov or DX CQ Zone"
19
+
18
20
  name = "CQ 160 SSB"
19
21
  cabrillo_name = "CQ-160-SSB"
20
22
  mode = "SSB" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "#"
18
+
17
19
  name = "CQ WPX CW"
18
20
  cabrillo_name = "CQ-WPX-CW"
19
21
  mode = "CW" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "#"
18
+
17
19
  name = "CQ WPX SSB"
18
20
  cabrillo_name = "CQ-WPX-SSB"
19
21
  mode = "SSB" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "CQ Zone No."
18
+
17
19
  name = "CQ WW CW"
18
20
  cabrillo_name = "CQ-WW-CW"
19
21
  mode = "CW" # CW SSB BOTH RTTY
@@ -14,6 +14,8 @@ from not1mm.lib.version import __version__
14
14
 
15
15
  logger = logging.getLogger(__name__)
16
16
 
17
+ EXCHANGE_HINT = "CQ Zone No."
18
+
17
19
  name = "CQ WW SSB"
18
20
  cabrillo_name = "CQ-WW-SSB"
19
21
  mode = "SSB" # CW SSB BOTH RTTY
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
@@ -27,6 +27,8 @@ from not1mm.lib.version import __version__
27
27
 
28
28
  logger = logging.getLogger(__name__)
29
29
 
30
+ EXCHANGE_HINT = "ITU Zone"
31
+
30
32
  name = "IARU HF"
31
33
  cabrillo_name = "IARU-HF"
32
34
  mode = "BOTH" # CW SSB BOTH RTTY
not1mm/plugins/jidx_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 = "Prefecture or CQ Zone"
18
+
17
19
  name = "JIDX CW"
18
20
  cabrillo_name = "JIDX-CW"
19
21
  mode = "CW" # CW SSB BOTH RTTY
not1mm/plugins/jidx_ph.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 = "Prefecture or CQ Zone"
18
+
17
19
  name = "JIDX PH"
18
20
  cabrillo_name = "JIDX-PH"
19
21
  mode = "SSB" # CW SSB BOTH RTTY
not1mm/plugins/naqp_cw.py CHANGED
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "Name or Name + SPC"
19
+
18
20
  name = "NAQP CW"
19
21
  cabrillo_name = "NAQP-CW"
20
22
  mode = "CW" # CW SSB BOTH RTTY
@@ -15,6 +15,8 @@ from not1mm.lib.version import __version__
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
+ EXCHANGE_HINT = "Name or Name + SPC"
19
+
18
20
  name = "NAQP SSB"
19
21
  cabrillo_name = "NAQP-SSB"
20
22
  mode = "SSB" # CW SSB BOTH RTTY
@@ -37,6 +37,8 @@ from not1mm.lib.version import __version__
37
37
 
38
38
  logger = logging.getLogger(__name__)
39
39
 
40
+ EXCHANGE_HINT = "Name or Name + SPC"
41
+
40
42
  name = "PHONE WEEKLY TEST"
41
43
  cabrillo_name = "PHONE-WEEKLY-TEST"
42
44
  mode = "SSB" # CW SSB BOTH RTTY
@@ -39,6 +39,7 @@ from not1mm.lib.ham_utility import distance
39
39
 
40
40
  logger = logging.getLogger(__name__)
41
41
 
42
+ EXCHANGE_HINT = "4-Character grid square"
42
43
  cabrillo_name = "STEW-PERRY"
43
44
  name = "Stew Perry Topband"
44
45
 
@@ -12,6 +12,8 @@ from not1mm.lib.version import __version__
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
+ EXCHANGE_HINT = "1O ORG"
16
+
15
17
  cabrillo_name = "WFD"
16
18
  name = "Winter Field Day"
17
19
  # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
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 Qt, QTimer
19
- from PyQt6.QtWidgets import QWidget, QDockWidget
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, *args, **kwargs):
40
- super().__init__(*args, **kwargs)
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
- message_box.setPalette(self.current_palette)
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.2
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
- The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
35
+ ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
36
+
37
+ The worlds #1 unfinished contest logger <sup>*According to my daughter Corinna.<sup>
36
38
 
37
39
  [![PyPI](https://img.shields.io/pypi/v/not1mm)](https://pypi.org/project/not1mm/)
38
40
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
39
41
  [![Python: 3.10+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
40
- [![Made With:PyQt5](https://img.shields.io/badge/Made%20with-PyQt5-red)](https://pypi.org/project/PyQt5/)
42
+ [![Made With:PyQt6](https://img.shields.io/badge/Made%20with-PyQt6-blue)](https://pypi.org/project/PyQt6/)
41
43
  [![Code Maturity:Snot Nosed](https://img.shields.io/badge/Code%20Maturity-Snot%20Nosed-red)](https://xkcd.com/1695/)
42
44
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/not1mm)](https://pypi.org/project/not1mm/)
43
45
 
44
- ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
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-pyqt5 python3-numpy
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=60mAxgkf3P-1LqkwgDMJxfHX2VyLf_dpQ9n80oOx6_A,119707
3
- not1mm/bandmap.py,sha256=vxsNNVkplMcaBsBboIbwEnN6hl5nhqc_qL-iPT67uK8,34051
4
- not1mm/checkwindow.py,sha256=a6wNnt0qEOggXU-nD5mF5qxqPvDHsxmFrWwaKhQ-FU0,10221
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=MbzEIna-iaQ4EZCu6XEWynakHmmwrBX_ROcI0wxA8AY,44639
7
- not1mm/vfo.py,sha256=4LhCU3NHbGtrd0pWQOhS8Zo8MbxA4zk2ieBlQYWsitE,12206
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=VKlwBd1CvNknJ98-PQlZNG5DMzuArp7yur0j-6mB0MA,1608
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=WyLfb4i763fyRR9_QjV4eLexNxwsEcPUpuycevGuntw,13775
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=cenfR08g_7hGPYQOmg6Q48xgZg0YLwbJlwNS67IsP84,350
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=JI7H44EyrLDCm3VUG_NwwTbOF4PFB9kKL-xM8EWFb9M,47
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=pzwdVk_ezaZIlAWDiEF0FVyZYPzx93xaIx8EZ8OTOwM,10834
110
- not1mm/plugins/10_10_spring_cw.py,sha256=hUdC5vkdIHSuMil4zhlid1HwUkkkbtppsvMTQd5gLvY,10839
111
- not1mm/plugins/10_10_summer_phone.py,sha256=2-Ry9mp7A_1dUD1gQLbdaeD9ubGez9Ik4mzRio9KUz8,10848
112
- not1mm/plugins/10_10_winter_phone.py,sha256=qd5f9oeJ6DUsA42VdJg_dLIpZYo74mWndjzzgqx6YGk,10851
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=-6oOW2775wKL19xY5ARWzjStkPbuvp1dlRp8wti6ORk,13643
115
- not1mm/plugins/arrl_dx_cw.py,sha256=Rx6i1tGFXw2nicM4Y_IczwwkUhBQQMhO-gySBMfy1Jo,13688
116
- not1mm/plugins/arrl_dx_ssb.py,sha256=SVdXNBBdm0JVnqUoMeNv3vlEZO2uJLpFyCz80Cp6kG8,13691
117
- not1mm/plugins/arrl_field_day.py,sha256=jB9DqrGo_tbdHDevTd_DeYCebHoNS8qPrx3X3WVYnVk,10026
118
- not1mm/plugins/arrl_rtty_ru.py,sha256=j7niG1BUoBU383QwNfM4bDRmfALjFLGNDQtxPTXMloY,7974
119
- not1mm/plugins/arrl_ss_cw.py,sha256=X2gmVVsVhn3mO38EIpGalaKAY_noEZl1Z-I3dr6AKFQ,13141
120
- not1mm/plugins/arrl_ss_phone.py,sha256=KAuuFdY4koZxYRdqC6D5HwfyUMYI3r6rz73LmHNaC4A,13147
121
- not1mm/plugins/arrl_vhf_jan.py,sha256=wdB3TQG90NFktHxU3_KBfgDBf0iKsxXLHz-0Vt_N4MY,12438
122
- not1mm/plugins/arrl_vhf_jun.py,sha256=M8xL7PExwi5tHNbr3G1YfWzO3v46Q4f_69KYIppIhh8,11457
123
- not1mm/plugins/arrl_vhf_sep.py,sha256=vll2uKDB_Mu_Yut4KKtPqZKxdeBG1X7dQAC4zLTWXoU,11457
124
- not1mm/plugins/canada_day.py,sha256=_y1Gqa4AenQNHYwOJAM8L-BwLDTIy4uCtZdVHq2GLyQ,11869
125
- not1mm/plugins/cq_160_cw.py,sha256=mNfqgq_SungfUoj7AfuEHrJFXZ9aMFUuvg5W5FOA7fQ,14018
126
- not1mm/plugins/cq_160_ssb.py,sha256=jZaWjLV1kQgUMWI_eZ8GqnZPOzJ_kENR8B9pd2dHS0k,14061
127
- not1mm/plugins/cq_wpx_cw.py,sha256=ejgTQzkPvwTnp4XAEPa3A3IWRA5hBNocFLhIjI8hb5k,12378
128
- not1mm/plugins/cq_wpx_ssb.py,sha256=VCl3rib5S8BCvSAM5XBESz0c8Ab3lE7r8pQwtw-1tes,12466
129
- not1mm/plugins/cq_ww_cw.py,sha256=t9ExXSlPZik2NRDSf1kgW0-v5wtzq55WJfxKY2CVytQ,11083
130
- not1mm/plugins/cq_ww_ssb.py,sha256=9oAWVdDfiYlNjq8EYlcwq_CMP5jvxmeaJujS4V74mEc,11088
131
- not1mm/plugins/cwt.py,sha256=Fd8d0QilYmmZq4PSXKGAxZ9yYuous7cGHYNlQczi2qw,11976
132
- not1mm/plugins/general_logging.py,sha256=wkopclj5_Kw2bY9COMbAtK1lrvVtAbRIZoGDfD_ZgfY,3369
133
- not1mm/plugins/iaru_hf.py,sha256=YYU-Ny50SU1v_jwCkatN6nCl0nUIrMbdRLEW15OzFJg,11433
134
- not1mm/plugins/jidx_cw.py,sha256=qx-o99zlSW5OPjbU2zE9ce_v3r3yTs1TV8G4S2XvZ2o,11049
135
- not1mm/plugins/jidx_ph.py,sha256=D8FMo9m-pD1qGXBoeVC68Re6h5WqN7eTToWjxIclQ5s,11051
136
- not1mm/plugins/naqp_cw.py,sha256=dLZOKY186HSKml6F9it1r1QbyDxhiOyvMON1R8ZiyQ4,11472
137
- not1mm/plugins/naqp_ssb.py,sha256=HJtPznRpVI66DCXNehDcxrdZmtAKW5WNm4AtqBK2ZiU,11477
138
- not1mm/plugins/phone_weekly_test.py,sha256=DklwBvVBVJ60HLGLd8_DNrloD1TyFtWgCztSwUdW4Ag,12278
139
- not1mm/plugins/stew_perry_topband.py,sha256=2uWD6MEENiqq01PwuhhgzTNIS0P5ukeBG1jesrFNOP0,10546
140
- not1mm/plugins/winter_field_day.py,sha256=Fb5Bb-VejO5K983h_nZfwpqC0rUdiolfr_iSkaqGF0M,10212
141
- not1mm-24.4.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
142
- not1mm-24.4.2.dist-info/METADATA,sha256=W-NiyaorWcfkmgMkUw8_SyPrhzLrj8X0xVxk3bXWpW4,26563
143
- not1mm-24.4.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
144
- not1mm-24.4.2.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
145
- not1mm-24.4.2.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
146
- not1mm-24.4.2.dist-info/RECORD,,
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,,