not1mm 25.4.22__py3-none-any.whl → 25.4.28__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 +2 -5
- not1mm/data/new_contest.ui +5 -0
- not1mm/lib/version.py +1 -1
- not1mm/plugins/arrl_vhf_jan.py +5 -9
- not1mm/plugins/arrl_vhf_jun.py +5 -9
- not1mm/plugins/arrl_vhf_sep.py +5 -9
- not1mm/plugins/cwt.py +11 -14
- not1mm/plugins/vhf_sprint.py +621 -0
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/METADATA +3 -1
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/RECORD +14 -13
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/WHEEL +1 -1
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/entry_points.txt +0 -0
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/licenses/LICENSE +0 -0
- {not1mm-25.4.22.dist-info → not1mm-25.4.28.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -3925,13 +3925,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3925
3925
|
self.contact["Band"] = get_logged_band(str(vfo))
|
3926
3926
|
self.set_band_indicator(band)
|
3927
3927
|
|
3928
|
-
# if self.rig_control:
|
3929
|
-
# if self.rig_control.online:
|
3930
|
-
# print(f"{self.rig_control.get_modes()=}=======================")
|
3931
|
-
|
3932
3928
|
if self.radio_state.get("mode") != mode:
|
3933
3929
|
info_dirty = True
|
3934
|
-
|
3930
|
+
if "set_freq:" not in mode:
|
3931
|
+
self.radio_state["mode"] = mode
|
3935
3932
|
|
3936
3933
|
if self.radio_state.get("bw") != bw:
|
3937
3934
|
info_dirty = True
|
not1mm/data/new_contest.ui
CHANGED
not1mm/lib/version.py
CHANGED
not1mm/plugins/arrl_vhf_jan.py
CHANGED
@@ -82,13 +82,13 @@ def init_contest(self):
|
|
82
82
|
|
83
83
|
def interface(self):
|
84
84
|
"""Setup user interface"""
|
85
|
-
self.field1.
|
86
|
-
self.field2.
|
85
|
+
self.field1.hide()
|
86
|
+
self.field2.hide()
|
87
87
|
self.field3.show()
|
88
88
|
self.field4.show()
|
89
89
|
self.snt_label.setText("SNT")
|
90
90
|
self.field1.setAccessibleName("RST Sent")
|
91
|
-
self.other_label.setText("
|
91
|
+
self.other_label.setText("Sent Grid")
|
92
92
|
self.field3.setAccessibleName("Sent Grid")
|
93
93
|
self.exch_label.setText("Grid")
|
94
94
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -101,9 +101,7 @@ def reset_label(self):
|
|
101
101
|
def set_tab_next(self):
|
102
102
|
"""Set TAB Advances"""
|
103
103
|
self.tab_next = {
|
104
|
-
self.callsign: self.
|
105
|
-
self.sent: self.receive,
|
106
|
-
self.receive: self.other_1,
|
104
|
+
self.callsign: self.other_1,
|
107
105
|
self.other_1: self.other_2,
|
108
106
|
self.other_2: self.callsign,
|
109
107
|
}
|
@@ -113,10 +111,8 @@ def set_tab_prev(self):
|
|
113
111
|
"""Set TAB Advances"""
|
114
112
|
self.tab_prev = {
|
115
113
|
self.callsign: self.other_2,
|
116
|
-
self.sent: self.callsign,
|
117
|
-
self.receive: self.sent,
|
118
|
-
self.other_1: self.receive,
|
119
114
|
self.other_2: self.other_1,
|
115
|
+
self.other_1: self.callsign,
|
120
116
|
}
|
121
117
|
|
122
118
|
|
not1mm/plugins/arrl_vhf_jun.py
CHANGED
@@ -50,13 +50,13 @@ def init_contest(self):
|
|
50
50
|
|
51
51
|
def interface(self):
|
52
52
|
"""Setup user interface"""
|
53
|
-
self.field1.
|
54
|
-
self.field2.
|
53
|
+
self.field1.hide()
|
54
|
+
self.field2.hide()
|
55
55
|
self.field3.show()
|
56
56
|
self.field4.show()
|
57
57
|
self.snt_label.setText("SNT")
|
58
58
|
self.field1.setAccessibleName("RST Sent")
|
59
|
-
self.other_label.setText("
|
59
|
+
self.other_label.setText("Sent Grid")
|
60
60
|
self.field3.setAccessibleName("Sent Grid")
|
61
61
|
self.exch_label.setText("Grid")
|
62
62
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -69,9 +69,7 @@ def reset_label(self):
|
|
69
69
|
def set_tab_next(self):
|
70
70
|
"""Set TAB Advances"""
|
71
71
|
self.tab_next = {
|
72
|
-
self.callsign: self.
|
73
|
-
self.sent: self.receive,
|
74
|
-
self.receive: self.other_1,
|
72
|
+
self.callsign: self.other_1,
|
75
73
|
self.other_1: self.other_2,
|
76
74
|
self.other_2: self.callsign,
|
77
75
|
}
|
@@ -81,10 +79,8 @@ def set_tab_prev(self):
|
|
81
79
|
"""Set TAB Advances"""
|
82
80
|
self.tab_prev = {
|
83
81
|
self.callsign: self.other_2,
|
84
|
-
self.sent: self.callsign,
|
85
|
-
self.receive: self.sent,
|
86
|
-
self.other_1: self.receive,
|
87
82
|
self.other_2: self.other_1,
|
83
|
+
self.other_1: self.callsign,
|
88
84
|
}
|
89
85
|
|
90
86
|
|
not1mm/plugins/arrl_vhf_sep.py
CHANGED
@@ -50,13 +50,13 @@ def init_contest(self):
|
|
50
50
|
|
51
51
|
def interface(self):
|
52
52
|
"""Setup user interface"""
|
53
|
-
self.field1.
|
54
|
-
self.field2.
|
53
|
+
self.field1.hide()
|
54
|
+
self.field2.hide()
|
55
55
|
self.field3.show()
|
56
56
|
self.field4.show()
|
57
57
|
self.snt_label.setText("SNT")
|
58
58
|
self.field1.setAccessibleName("RST Sent")
|
59
|
-
self.other_label.setText("
|
59
|
+
self.other_label.setText("Sent Grid")
|
60
60
|
self.field3.setAccessibleName("Sent Grid")
|
61
61
|
self.exch_label.setText("Grid")
|
62
62
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -69,9 +69,7 @@ def reset_label(self):
|
|
69
69
|
def set_tab_next(self):
|
70
70
|
"""Set TAB Advances"""
|
71
71
|
self.tab_next = {
|
72
|
-
self.callsign: self.
|
73
|
-
self.sent: self.receive,
|
74
|
-
self.receive: self.other_1,
|
72
|
+
self.callsign: self.other_1,
|
75
73
|
self.other_1: self.other_2,
|
76
74
|
self.other_2: self.callsign,
|
77
75
|
}
|
@@ -81,10 +79,8 @@ def set_tab_prev(self):
|
|
81
79
|
"""Set TAB Advances"""
|
82
80
|
self.tab_prev = {
|
83
81
|
self.callsign: self.other_2,
|
84
|
-
self.sent: self.callsign,
|
85
|
-
self.receive: self.sent,
|
86
|
-
self.other_1: self.receive,
|
87
82
|
self.other_2: self.other_1,
|
83
|
+
self.other_1: self.callsign,
|
88
84
|
}
|
89
85
|
|
90
86
|
|
not1mm/plugins/cwt.py
CHANGED
@@ -11,10 +11,11 @@
|
|
11
11
|
# Bands: 160, 80, 40, 20, 15, 10m
|
12
12
|
# Classes: Single Op (QRP/Low/High)
|
13
13
|
# Max power: HP: >100 watts
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# Exchange:
|
17
|
-
#
|
14
|
+
# LP: 100 watts
|
15
|
+
# QRP: 5 watts
|
16
|
+
# Exchange:
|
17
|
+
# Member: Name + Member No./"CWA"
|
18
|
+
# Non-Member: Name + (state/province/country)
|
18
19
|
# Work stations: Once per band
|
19
20
|
# QSO Points: 1 point per QSO
|
20
21
|
# Multipliers: Each call once
|
@@ -72,16 +73,16 @@ def init_contest(self):
|
|
72
73
|
|
73
74
|
def interface(self):
|
74
75
|
"""Setup user interface"""
|
75
|
-
self.field1.
|
76
|
-
self.field2.
|
76
|
+
self.field1.hide()
|
77
|
+
self.field2.hide()
|
77
78
|
self.field3.show()
|
78
79
|
self.field4.show()
|
79
80
|
self.snt_label.setText("SNT")
|
80
81
|
self.field1.setAccessibleName("RST Sent")
|
81
82
|
self.other_label.setText("Name")
|
82
83
|
self.field3.setAccessibleName("Name")
|
83
|
-
self.exch_label.setText("
|
84
|
-
self.field4.setAccessibleName("
|
84
|
+
self.exch_label.setText("Number or State")
|
85
|
+
self.field4.setAccessibleName("Number or State")
|
85
86
|
|
86
87
|
|
87
88
|
def reset_label(self):
|
@@ -91,9 +92,7 @@ def reset_label(self):
|
|
91
92
|
def set_tab_next(self):
|
92
93
|
"""Set TAB Advances"""
|
93
94
|
self.tab_next = {
|
94
|
-
self.callsign: self.
|
95
|
-
self.sent: self.field2.findChild(QtWidgets.QLineEdit),
|
96
|
-
self.receive: self.other_1,
|
95
|
+
self.callsign: self.other_1,
|
97
96
|
self.other_1: self.other_2,
|
98
97
|
self.other_2: self.callsign,
|
99
98
|
}
|
@@ -103,9 +102,7 @@ def set_tab_prev(self):
|
|
103
102
|
"""Set TAB Advances"""
|
104
103
|
self.tab_prev = {
|
105
104
|
self.callsign: self.other_2,
|
106
|
-
self.
|
107
|
-
self.receive: self.sent,
|
108
|
-
self.other_1: self.receive,
|
105
|
+
self.other_1: self.callsign,
|
109
106
|
self.other_2: self.other_1,
|
110
107
|
}
|
111
108
|
|
@@ -0,0 +1,621 @@
|
|
1
|
+
"""VHF SPRINT"""
|
2
|
+
|
3
|
+
# Single band VHF Sprint. Exchange is 4-digit grid square.
|
4
|
+
# 1 point per each valid QSO multiplied by number of grid squares worked.
|
5
|
+
# Cabrillo name: VHF-SPRINT
|
6
|
+
|
7
|
+
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member
|
8
|
+
|
9
|
+
import datetime
|
10
|
+
import logging
|
11
|
+
|
12
|
+
from pathlib import Path
|
13
|
+
from PyQt6 import QtWidgets
|
14
|
+
|
15
|
+
from not1mm.lib.ham_utility import get_logged_band
|
16
|
+
from not1mm.lib.plugin_common import gen_adif, get_points, online_score_xml
|
17
|
+
from not1mm.lib.version import __version__
|
18
|
+
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
|
21
|
+
ALTEREGO = None
|
22
|
+
EXCHANGE_HINT = "4-character grid square"
|
23
|
+
|
24
|
+
name = "VHF SPRINT"
|
25
|
+
mode = "BOTH" # CW SSB BOTH RTTY
|
26
|
+
cabrillo_name = "VHF-SPRINT"
|
27
|
+
|
28
|
+
columns = [
|
29
|
+
"YYYY-MM-DD HH:MM:SS",
|
30
|
+
"Call",
|
31
|
+
"Freq",
|
32
|
+
"Mode",
|
33
|
+
"SentNr",
|
34
|
+
"RcvNr",
|
35
|
+
"PTS",
|
36
|
+
]
|
37
|
+
|
38
|
+
advance_on_space = [True, True, True, True, True]
|
39
|
+
|
40
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
41
|
+
dupe_type = 3
|
42
|
+
|
43
|
+
|
44
|
+
def init_contest(self):
|
45
|
+
"""setup plugin"""
|
46
|
+
set_tab_next(self)
|
47
|
+
set_tab_prev(self)
|
48
|
+
interface(self)
|
49
|
+
self.next_field = self.other_2
|
50
|
+
|
51
|
+
|
52
|
+
def interface(self):
|
53
|
+
"""Setup user interface"""
|
54
|
+
self.field1.hide()
|
55
|
+
self.field2.hide()
|
56
|
+
self.field3.show()
|
57
|
+
self.field4.show()
|
58
|
+
self.snt_label.setText("SNT")
|
59
|
+
self.field1.setAccessibleName("RST Sent")
|
60
|
+
self.other_label.setText("Sent Grid")
|
61
|
+
self.field3.setAccessibleName("Sent Grid")
|
62
|
+
self.exch_label.setText("Grid")
|
63
|
+
self.field4.setAccessibleName("Gridsquare")
|
64
|
+
|
65
|
+
|
66
|
+
def reset_label(self):
|
67
|
+
"""reset label after field cleared"""
|
68
|
+
|
69
|
+
|
70
|
+
def set_tab_next(self):
|
71
|
+
"""Set TAB Advances"""
|
72
|
+
self.tab_next = {
|
73
|
+
self.callsign: self.other_1,
|
74
|
+
self.other_1: self.other_2,
|
75
|
+
self.other_2: self.callsign,
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
def set_tab_prev(self):
|
80
|
+
"""Set TAB Advances"""
|
81
|
+
self.tab_prev = {
|
82
|
+
self.callsign: self.other_2,
|
83
|
+
self.other_2: self.other_1,
|
84
|
+
self.other_1: self.callsign,
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
def validate(self):
|
89
|
+
"""doc"""
|
90
|
+
# exchange = self.other_2.text().upper().split()
|
91
|
+
# if len(exchange) == 3:
|
92
|
+
# if exchange[0].isalpha() and exchange[1].isdigit() and exchange[2].isalpha():
|
93
|
+
# return True
|
94
|
+
# return False
|
95
|
+
return True
|
96
|
+
|
97
|
+
|
98
|
+
def set_contact_vars(self):
|
99
|
+
"""Contest Specific"""
|
100
|
+
self.contact["SNT"] = self.sent.text()
|
101
|
+
self.contact["RCV"] = self.receive.text()
|
102
|
+
self.contact["NR"] = self.other_2.text().upper()
|
103
|
+
self.contact["SentNr"] = self.other_1.text()
|
104
|
+
|
105
|
+
|
106
|
+
def predupe(self):
|
107
|
+
"""called after callsign entered"""
|
108
|
+
|
109
|
+
|
110
|
+
def prefill(self):
|
111
|
+
"""Fill sentnr"""
|
112
|
+
result = self.database.get_serial()
|
113
|
+
serial_nr = str(result.get("serial_nr", "1")).zfill(3)
|
114
|
+
if serial_nr == "None":
|
115
|
+
serial_nr = "001"
|
116
|
+
|
117
|
+
exchange = self.contest_settings.get("SentExchange", "").replace("#", serial_nr)
|
118
|
+
if len(self.other_1.text()) == 0:
|
119
|
+
self.other_1.setText(exchange)
|
120
|
+
|
121
|
+
|
122
|
+
def points(self):
|
123
|
+
"""Calc point"""
|
124
|
+
|
125
|
+
# QSO Points: 1 point per QSO
|
126
|
+
|
127
|
+
if self.contact_is_dupe > 0:
|
128
|
+
return 0
|
129
|
+
|
130
|
+
_band = self.contact.get("Band", "")
|
131
|
+
if _band in ["50", "144"]:
|
132
|
+
return 1
|
133
|
+
if _band in ["222", "432"]:
|
134
|
+
return 1
|
135
|
+
if _band in ["902", "1296"]:
|
136
|
+
return 1
|
137
|
+
if _band in ["2300+"]:
|
138
|
+
return 1
|
139
|
+
return 0
|
140
|
+
|
141
|
+
|
142
|
+
def show_mults(self):
|
143
|
+
"""Return display string for mults"""
|
144
|
+
# Multipliers: Grid squares once per band
|
145
|
+
|
146
|
+
dx = 0
|
147
|
+
|
148
|
+
sql = (
|
149
|
+
"select count(DISTINCT(NR || ':' || Band)) as mult_count "
|
150
|
+
f"from dxlog where ContestNR = {self.database.current_contest} and typeof(NR) = 'text';"
|
151
|
+
)
|
152
|
+
result = self.database.exec_sql(sql)
|
153
|
+
|
154
|
+
if result:
|
155
|
+
dx = result.get("mult_count", 0)
|
156
|
+
|
157
|
+
return dx
|
158
|
+
|
159
|
+
|
160
|
+
def show_qso(self):
|
161
|
+
"""Return qso count"""
|
162
|
+
result = self.database.fetch_qso_count()
|
163
|
+
if result:
|
164
|
+
return int(result.get("qsos", 0))
|
165
|
+
return 0
|
166
|
+
|
167
|
+
|
168
|
+
def calc_score(self):
|
169
|
+
"""Return calculated score"""
|
170
|
+
# Multipliers: Each US State + DC once per mode
|
171
|
+
_points = get_points(self)
|
172
|
+
_mults = show_mults(self)
|
173
|
+
_power_mult = 1
|
174
|
+
# if self.contest_settings.get("PowerCategory", "") == "QRP":
|
175
|
+
# _power_mult = 2
|
176
|
+
return _points * _power_mult * _mults
|
177
|
+
|
178
|
+
|
179
|
+
def adif(self):
|
180
|
+
"""Call the generate ADIF function"""
|
181
|
+
gen_adif(self, cabrillo_name)
|
182
|
+
|
183
|
+
|
184
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
185
|
+
""""""
|
186
|
+
print(
|
187
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
188
|
+
end=ending,
|
189
|
+
file=file_descriptor,
|
190
|
+
)
|
191
|
+
|
192
|
+
|
193
|
+
def cabrillo(self, file_encoding):
|
194
|
+
"""Generates Cabrillo file. Maybe."""
|
195
|
+
# https://www.cqwpx.com/cabrillo.htm
|
196
|
+
logger.debug("******Cabrillo*****")
|
197
|
+
logger.debug("Station: %s", f"{self.station}")
|
198
|
+
logger.debug("Contest: %s", f"{self.contest_settings}")
|
199
|
+
now = datetime.datetime.now()
|
200
|
+
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
201
|
+
filename = (
|
202
|
+
str(Path.home())
|
203
|
+
+ "/"
|
204
|
+
+ f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
|
205
|
+
)
|
206
|
+
logger.debug("%s", filename)
|
207
|
+
log = self.database.fetch_all_contacts_asc()
|
208
|
+
try:
|
209
|
+
with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
|
210
|
+
output_cabrillo_line(
|
211
|
+
"START-OF-LOG: 3.0",
|
212
|
+
"\r\n",
|
213
|
+
file_descriptor,
|
214
|
+
file_encoding,
|
215
|
+
)
|
216
|
+
output_cabrillo_line(
|
217
|
+
f"CREATED-BY: Not1MM v{__version__}",
|
218
|
+
"\r\n",
|
219
|
+
file_descriptor,
|
220
|
+
file_encoding,
|
221
|
+
)
|
222
|
+
output_cabrillo_line(
|
223
|
+
f"CONTEST: {cabrillo_name}",
|
224
|
+
"\r\n",
|
225
|
+
file_descriptor,
|
226
|
+
file_encoding,
|
227
|
+
)
|
228
|
+
if self.station.get("Club", ""):
|
229
|
+
output_cabrillo_line(
|
230
|
+
f"CLUB: {self.station.get('Club', '').upper()}",
|
231
|
+
"\r\n",
|
232
|
+
file_descriptor,
|
233
|
+
file_encoding,
|
234
|
+
)
|
235
|
+
output_cabrillo_line(
|
236
|
+
f"CALLSIGN: {self.station.get('Call','')}",
|
237
|
+
"\r\n",
|
238
|
+
file_descriptor,
|
239
|
+
file_encoding,
|
240
|
+
)
|
241
|
+
output_cabrillo_line(
|
242
|
+
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
243
|
+
"\r\n",
|
244
|
+
file_descriptor,
|
245
|
+
file_encoding,
|
246
|
+
)
|
247
|
+
output_cabrillo_line(
|
248
|
+
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
249
|
+
"\r\n",
|
250
|
+
file_descriptor,
|
251
|
+
file_encoding,
|
252
|
+
)
|
253
|
+
output_cabrillo_line(
|
254
|
+
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
255
|
+
"\r\n",
|
256
|
+
file_descriptor,
|
257
|
+
file_encoding,
|
258
|
+
)
|
259
|
+
output_cabrillo_line(
|
260
|
+
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
261
|
+
"\r\n",
|
262
|
+
file_descriptor,
|
263
|
+
file_encoding,
|
264
|
+
)
|
265
|
+
mode = self.contest_settings.get("ModeCategory", "")
|
266
|
+
if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
|
267
|
+
mode = "MIXED"
|
268
|
+
output_cabrillo_line(
|
269
|
+
f"CATEGORY-MODE: {mode}",
|
270
|
+
"\r\n",
|
271
|
+
file_descriptor,
|
272
|
+
file_encoding,
|
273
|
+
)
|
274
|
+
output_cabrillo_line(
|
275
|
+
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
276
|
+
"\r\n",
|
277
|
+
file_descriptor,
|
278
|
+
file_encoding,
|
279
|
+
)
|
280
|
+
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
281
|
+
output_cabrillo_line(
|
282
|
+
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
283
|
+
"\r\n",
|
284
|
+
file_descriptor,
|
285
|
+
file_encoding,
|
286
|
+
)
|
287
|
+
output_cabrillo_line(
|
288
|
+
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
289
|
+
"\r\n",
|
290
|
+
file_descriptor,
|
291
|
+
file_encoding,
|
292
|
+
)
|
293
|
+
output_cabrillo_line(
|
294
|
+
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
295
|
+
"\r\n",
|
296
|
+
file_descriptor,
|
297
|
+
file_encoding,
|
298
|
+
)
|
299
|
+
|
300
|
+
output_cabrillo_line(
|
301
|
+
f"CLAIMED-SCORE: {calc_score(self)}",
|
302
|
+
"\r\n",
|
303
|
+
file_descriptor,
|
304
|
+
file_encoding,
|
305
|
+
)
|
306
|
+
ops = f"@{self.station.get('Call','')}"
|
307
|
+
list_of_ops = self.database.get_ops()
|
308
|
+
for op in list_of_ops:
|
309
|
+
ops += f", {op.get('Operator', '')}"
|
310
|
+
output_cabrillo_line(
|
311
|
+
f"OPERATORS: {ops}",
|
312
|
+
"\r\n",
|
313
|
+
file_descriptor,
|
314
|
+
file_encoding,
|
315
|
+
)
|
316
|
+
output_cabrillo_line(
|
317
|
+
f"NAME: {self.station.get('Name', '')}",
|
318
|
+
"\r\n",
|
319
|
+
file_descriptor,
|
320
|
+
file_encoding,
|
321
|
+
)
|
322
|
+
output_cabrillo_line(
|
323
|
+
f"ADDRESS: {self.station.get('Street1', '')}",
|
324
|
+
"\r\n",
|
325
|
+
file_descriptor,
|
326
|
+
file_encoding,
|
327
|
+
)
|
328
|
+
output_cabrillo_line(
|
329
|
+
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
330
|
+
"\r\n",
|
331
|
+
file_descriptor,
|
332
|
+
file_encoding,
|
333
|
+
)
|
334
|
+
output_cabrillo_line(
|
335
|
+
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
336
|
+
"\r\n",
|
337
|
+
file_descriptor,
|
338
|
+
file_encoding,
|
339
|
+
)
|
340
|
+
output_cabrillo_line(
|
341
|
+
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
342
|
+
"\r\n",
|
343
|
+
file_descriptor,
|
344
|
+
file_encoding,
|
345
|
+
)
|
346
|
+
output_cabrillo_line(
|
347
|
+
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
348
|
+
"\r\n",
|
349
|
+
file_descriptor,
|
350
|
+
file_encoding,
|
351
|
+
)
|
352
|
+
output_cabrillo_line(
|
353
|
+
f"EMAIL: {self.station.get('Email', '')}",
|
354
|
+
"\r\n",
|
355
|
+
file_descriptor,
|
356
|
+
file_encoding,
|
357
|
+
)
|
358
|
+
for contact in log:
|
359
|
+
the_date_and_time = contact.get("TS", "")
|
360
|
+
themode = contact.get("Mode", "")
|
361
|
+
if themode in ("LSB", "USB", "AM"):
|
362
|
+
themode = "PH"
|
363
|
+
if themode in (
|
364
|
+
"FT8",
|
365
|
+
"FT4",
|
366
|
+
"RTTY",
|
367
|
+
"PSK31",
|
368
|
+
"FSK441",
|
369
|
+
"MSK144",
|
370
|
+
"JT65",
|
371
|
+
"JT9",
|
372
|
+
"Q65",
|
373
|
+
):
|
374
|
+
themode = "DG"
|
375
|
+
freq = int(contact.get("Freq", "0")) / 1000
|
376
|
+
|
377
|
+
frequency = str(int(freq)).rjust(4)
|
378
|
+
|
379
|
+
loggeddate = the_date_and_time[:10]
|
380
|
+
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
381
|
+
output_cabrillo_line(
|
382
|
+
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
383
|
+
f"{contact.get('StationPrefix', '').ljust(13)} "
|
384
|
+
# f"{str(contact.get('SNT', '')).ljust(3)} "
|
385
|
+
f"{str(contact.get('SentNr', '')).ljust(6)} "
|
386
|
+
f"{contact.get('Call', '').ljust(13)} "
|
387
|
+
# f"{str(contact.get('RCV', '')).ljust(3)} "
|
388
|
+
f"{str(contact.get('NR', '')).ljust(6)}",
|
389
|
+
"\r\n",
|
390
|
+
file_descriptor,
|
391
|
+
file_encoding,
|
392
|
+
)
|
393
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
394
|
+
self.show_message_box(f"Cabrillo saved to: {filename}")
|
395
|
+
except IOError as exception:
|
396
|
+
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
397
|
+
self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
|
398
|
+
return
|
399
|
+
|
400
|
+
|
401
|
+
def recalculate_mults(self):
|
402
|
+
"""Recalculates multipliers after change in logged qso."""
|
403
|
+
|
404
|
+
|
405
|
+
def set_self(the_outie):
|
406
|
+
"""..."""
|
407
|
+
globals()["ALTEREGO"] = the_outie
|
408
|
+
|
409
|
+
|
410
|
+
def ft8_handler(the_packet: dict):
|
411
|
+
"""Process FT8 QSO packets
|
412
|
+
FT8
|
413
|
+
{
|
414
|
+
'CALL': 'KE0OG',
|
415
|
+
'GRIDSQUARE': 'DM10AT',
|
416
|
+
'MODE': 'FT8',
|
417
|
+
'RST_SENT': '',
|
418
|
+
'RST_RCVD': '',
|
419
|
+
'QSO_DATE': '20210329',
|
420
|
+
'TIME_ON': '183213',
|
421
|
+
'QSO_DATE_OFF': '20210329',
|
422
|
+
'TIME_OFF': '183213',
|
423
|
+
'BAND': '20M',
|
424
|
+
'FREQ': '14.074754',
|
425
|
+
'STATION_CALLSIGN': 'K6GTE',
|
426
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
427
|
+
'CONTEST_ID': 'ARRL-FIELD-DAY',
|
428
|
+
'SRX_STRING': '1D UT',
|
429
|
+
'CLASS': '1D',
|
430
|
+
'ARRL_SECT': 'UT'
|
431
|
+
}
|
432
|
+
FlDigi
|
433
|
+
{
|
434
|
+
'FREQ': '7.029500',
|
435
|
+
'CALL': 'DL2DSL',
|
436
|
+
'MODE': 'RTTY',
|
437
|
+
'NAME': 'BOB',
|
438
|
+
'QSO_DATE': '20240904',
|
439
|
+
'QSO_DATE_OFF': '20240904',
|
440
|
+
'TIME_OFF': '212825',
|
441
|
+
'TIME_ON': '212800',
|
442
|
+
'RST_RCVD': '599',
|
443
|
+
'RST_SENT': '599',
|
444
|
+
'BAND': '40M',
|
445
|
+
'COUNTRY': 'FED. REP. OF GERMANY',
|
446
|
+
'CQZ': '14',
|
447
|
+
'STX': '000',
|
448
|
+
'STX_STRING': '1D ORG',
|
449
|
+
'CLASS': '1D',
|
450
|
+
'ARRL_SECT': 'DX',
|
451
|
+
'TX_PWR': '0',
|
452
|
+
'OPERATOR': 'K6GTE',
|
453
|
+
'STATION_CALLSIGN': 'K6GTE',
|
454
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
455
|
+
'MY_CITY': 'ANAHEIM, CA',
|
456
|
+
'MY_STATE': 'CA'
|
457
|
+
}
|
458
|
+
|
459
|
+
"""
|
460
|
+
logger.debug(f"{the_packet=}")
|
461
|
+
if ALTEREGO is not None:
|
462
|
+
ALTEREGO.callsign.setText(the_packet.get("CALL"))
|
463
|
+
ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
|
464
|
+
ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
|
465
|
+
ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
|
466
|
+
my_grid = the_packet.get("MY_GRIDSQUARE", "")
|
467
|
+
if my_grid:
|
468
|
+
if len(my_grid) > 4:
|
469
|
+
my_grid = my_grid[:4]
|
470
|
+
their_grid = the_packet.get("GRIDSQUARE", "")
|
471
|
+
if their_grid:
|
472
|
+
if len(their_grid) > 4:
|
473
|
+
their_grid = their_grid[:4]
|
474
|
+
ALTEREGO.contact["NR"] = their_grid
|
475
|
+
# ALTEREGO.contact["Sect"] = the_packet.get("ARRL_SECT", "ERR")
|
476
|
+
if the_packet.get("SUBMODE"):
|
477
|
+
ALTEREGO.contact["Mode"] = the_packet.get("SUBMODE", "ERR")
|
478
|
+
else:
|
479
|
+
ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
|
480
|
+
ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
|
481
|
+
ALTEREGO.contact["QSXFreq"] = round(
|
482
|
+
float(the_packet.get("FREQ", "0.0")) * 1000, 2
|
483
|
+
)
|
484
|
+
ALTEREGO.contact["Band"] = get_logged_band(
|
485
|
+
str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
|
486
|
+
)
|
487
|
+
logger.debug(f"{ALTEREGO.contact=}")
|
488
|
+
ALTEREGO.other_1.setText(my_grid)
|
489
|
+
ALTEREGO.other_2.setText(their_grid)
|
490
|
+
ALTEREGO.save_contact()
|
491
|
+
|
492
|
+
|
493
|
+
def process_esm(self, new_focused_widget=None, with_enter=False):
|
494
|
+
"""ESM State Machine"""
|
495
|
+
|
496
|
+
# self.pref["run_state"]
|
497
|
+
|
498
|
+
# -----===== Assigned F-Keys =====-----
|
499
|
+
# self.esm_dict["CQ"]
|
500
|
+
# self.esm_dict["EXCH"]
|
501
|
+
# self.esm_dict["QRZ"]
|
502
|
+
# self.esm_dict["AGN"]
|
503
|
+
# self.esm_dict["HISCALL"]
|
504
|
+
# self.esm_dict["MYCALL"]
|
505
|
+
# self.esm_dict["QSOB4"]
|
506
|
+
|
507
|
+
# ----==== text fields ====----
|
508
|
+
# self.callsign
|
509
|
+
# self.sent
|
510
|
+
# self.receive
|
511
|
+
# self.other_1
|
512
|
+
# self.other_2
|
513
|
+
|
514
|
+
if new_focused_widget is not None:
|
515
|
+
self.current_widget = self.inputs_dict.get(new_focused_widget)
|
516
|
+
|
517
|
+
# print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
|
518
|
+
|
519
|
+
for a_button in [
|
520
|
+
self.esm_dict["CQ"],
|
521
|
+
self.esm_dict["EXCH"],
|
522
|
+
self.esm_dict["QRZ"],
|
523
|
+
self.esm_dict["AGN"],
|
524
|
+
self.esm_dict["HISCALL"],
|
525
|
+
self.esm_dict["MYCALL"],
|
526
|
+
self.esm_dict["QSOB4"],
|
527
|
+
]:
|
528
|
+
if a_button is not None:
|
529
|
+
self.restore_button_color(a_button)
|
530
|
+
|
531
|
+
buttons_to_send = []
|
532
|
+
|
533
|
+
if self.pref.get("run_state"):
|
534
|
+
if self.current_widget == "callsign":
|
535
|
+
if len(self.callsign.text()) < 3:
|
536
|
+
self.make_button_green(self.esm_dict["CQ"])
|
537
|
+
buttons_to_send.append(self.esm_dict["CQ"])
|
538
|
+
elif len(self.callsign.text()) > 2:
|
539
|
+
self.make_button_green(self.esm_dict["HISCALL"])
|
540
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
541
|
+
buttons_to_send.append(self.esm_dict["HISCALL"])
|
542
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
543
|
+
|
544
|
+
elif self.current_widget in ["other_2"]:
|
545
|
+
if self.other_2.text() == "":
|
546
|
+
self.make_button_green(self.esm_dict["AGN"])
|
547
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
548
|
+
else:
|
549
|
+
self.make_button_green(self.esm_dict["QRZ"])
|
550
|
+
buttons_to_send.append(self.esm_dict["QRZ"])
|
551
|
+
buttons_to_send.append("LOGIT")
|
552
|
+
|
553
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
554
|
+
for button in buttons_to_send:
|
555
|
+
if button:
|
556
|
+
if button == "LOGIT":
|
557
|
+
self.save_contact()
|
558
|
+
continue
|
559
|
+
self.process_function_key(button)
|
560
|
+
else:
|
561
|
+
if self.current_widget == "callsign":
|
562
|
+
if len(self.callsign.text()) > 2:
|
563
|
+
self.make_button_green(self.esm_dict["MYCALL"])
|
564
|
+
buttons_to_send.append(self.esm_dict["MYCALL"])
|
565
|
+
|
566
|
+
elif self.current_widget in ["other_2"]:
|
567
|
+
if self.other_2.text() == "":
|
568
|
+
self.make_button_green(self.esm_dict["AGN"])
|
569
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
570
|
+
else:
|
571
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
572
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
573
|
+
buttons_to_send.append("LOGIT")
|
574
|
+
|
575
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
576
|
+
for button in buttons_to_send:
|
577
|
+
if button:
|
578
|
+
if button == "LOGIT":
|
579
|
+
self.save_contact()
|
580
|
+
continue
|
581
|
+
self.process_function_key(button)
|
582
|
+
|
583
|
+
|
584
|
+
def populate_history_info_line(self):
|
585
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
586
|
+
if result:
|
587
|
+
self.history_info.setText(
|
588
|
+
f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
|
589
|
+
)
|
590
|
+
else:
|
591
|
+
self.history_info.setText("")
|
592
|
+
|
593
|
+
|
594
|
+
def check_call_history(self):
|
595
|
+
""""""
|
596
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
597
|
+
if result:
|
598
|
+
self.history_info.setText(f"{result.get('UserText','')}")
|
599
|
+
if self.other_2.text() == "":
|
600
|
+
self.other_2.setText(f"{result.get('Loc1', '')}")
|
601
|
+
|
602
|
+
|
603
|
+
# !!Order!!,Call,Name,Loc1,UserText,
|
604
|
+
# gridsquare
|
605
|
+
def get_mults(self):
|
606
|
+
""""""
|
607
|
+
|
608
|
+
mults = {}
|
609
|
+
mults["gridsquare"] = show_mults(self)
|
610
|
+
return mults
|
611
|
+
|
612
|
+
|
613
|
+
def just_points(self):
|
614
|
+
""""""
|
615
|
+
result = self.database.fetch_points()
|
616
|
+
if result is not None:
|
617
|
+
score = result.get("Points", "0")
|
618
|
+
if score is None:
|
619
|
+
score = "0"
|
620
|
+
return int(score)
|
621
|
+
return 0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: not1mm
|
3
|
-
Version: 25.4.
|
3
|
+
Version: 25.4.28
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
6
|
License: GPL-3.0-or-later
|
@@ -256,6 +256,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
256
256
|
|
257
257
|
## Recent Changes
|
258
258
|
|
259
|
+
- [25-4-28] Merged PR from MicroPhonon adding VHF Sprint.
|
260
|
+
- [25-4-25] Merged PR from @microphonon making changes to ARRL VHF and CWOps CWT.
|
259
261
|
- [25-4-22] Mostly code cleanup. Not running some code when not needed.
|
260
262
|
- [25-4-21] Add a couple more debug messages. Add LSB/USB to input-able commands to the callsign field.
|
261
263
|
- [25-4-19-1] Add FM and AM as input-able commands to the callsign field.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=bf-uGk88mT8OVbDJFr6wu-5StUBYNWBAJS1E8l8avCE,156555
|
3
3
|
not1mm/bandmap.py,sha256=n8mrRzo_8b1muzICk8nSpvaiAV4NyNoUkZBa6Rjprns,29968
|
4
4
|
not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
|
5
5
|
not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
|
@@ -34,7 +34,7 @@ not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N
|
|
34
34
|
not1mm/data/logwindow.ui,sha256=f7vULj96tHIQuR1nJMyvPHHcmVgzkhv9D1isyojsnFU,1458
|
35
35
|
not1mm/data/logwindowx.ui,sha256=CwpI-h7cI1yqyldH9quKftsdHL5lTyL9ABOcf80nfqc,1632
|
36
36
|
not1mm/data/main.ui,sha256=-JDQXOaxj8_7Wda9KT2rEM4YUjBs31CiT1Rjc_DBobM,64907
|
37
|
-
not1mm/data/new_contest.ui,sha256=
|
37
|
+
not1mm/data/new_contest.ui,sha256=KrtNDS41-Cr1Kzt9IR9sVEyjsLXlj4R1I2GHRKjP9oo,25331
|
38
38
|
not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
|
39
39
|
not1mm/data/opon.ui,sha256=QDicqAk2lORG2UWsHa6jHlsGn6uzrrI2R4HSAocpPes,2258
|
40
40
|
not1mm/data/pickcontest.ui,sha256=4hPBszCglObThx_eIWtmK9CEcbr7WBjbB1rKZdI-o3I,1707
|
@@ -118,7 +118,7 @@ not1mm/lib/plugin_common.py,sha256=D1OBjyLmX7zuSPqgTCmHwXzAKA12J_zTQItvyIem-4Y,1
|
|
118
118
|
not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
|
119
119
|
not1mm/lib/settings.py,sha256=cC83Nw4pGLWyHybIflDR1ylX9P7Hq2P5b5yFZtx-llY,15410
|
120
120
|
not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
|
121
|
-
not1mm/lib/version.py,sha256=
|
121
|
+
not1mm/lib/version.py,sha256=5jdO9DBGbXDZaLtewVMj8VGR5qrBGSWRxQpmSZc69xw,48
|
122
122
|
not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
|
123
123
|
not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
|
124
124
|
not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
|
@@ -134,9 +134,9 @@ not1mm/plugins/arrl_field_day.py,sha256=CzUAzcOus4MwJ0Ha08OvQwCfjcfRRNIEx1WCL9xB
|
|
134
134
|
not1mm/plugins/arrl_rtty_ru.py,sha256=bxOvrcb6R_Qf3H2MnkfpQkAfJbCyGjKwbZXt1PHCuAM,20957
|
135
135
|
not1mm/plugins/arrl_ss_cw.py,sha256=WnRiVLqiC_sX4QqDyyMOy3f07IJCPgxkFf9PstKkhK4,17522
|
136
136
|
not1mm/plugins/arrl_ss_phone.py,sha256=PzybC--tSB7_oNLbbN9xYkMnftH-z6qgcGZUp3-JGLU,16858
|
137
|
-
not1mm/plugins/arrl_vhf_jan.py,sha256=
|
138
|
-
not1mm/plugins/arrl_vhf_jun.py,sha256=
|
139
|
-
not1mm/plugins/arrl_vhf_sep.py,sha256=
|
137
|
+
not1mm/plugins/arrl_vhf_jan.py,sha256=paYrF_o1EotBRmXn_x9_hEM16SWx7sLDzoSoXcYXcCY,20201
|
138
|
+
not1mm/plugins/arrl_vhf_jun.py,sha256=WwQ-UGFekIZj26bIbq3sLacTYMmUzBYySHhPz2APm2M,19293
|
139
|
+
not1mm/plugins/arrl_vhf_sep.py,sha256=kq5Rncru74G9B76VwfXMeTaF9AL8hq-1vw9ZMYmJmvM,19326
|
140
140
|
not1mm/plugins/canada_day.py,sha256=89aGXm4S9PjKL9FYm3z7BMFRz--MugQQilwQnzLJvv0,15770
|
141
141
|
not1mm/plugins/cq_160_cw.py,sha256=bmHtxVcIWsqmgqpMCMso7DCBERtAr9fIKIjgymSKtms,18711
|
142
142
|
not1mm/plugins/cq_160_ssb.py,sha256=9KKDmmapETEebm1azfEzUWk1NyW3TBnYtBlFIPZYHBs,18754
|
@@ -146,7 +146,7 @@ not1mm/plugins/cq_wpx_ssb.py,sha256=mtUD0tQnraDHoCHIeuWpOD64my3Kni9mXVH5IF2QPL0,
|
|
146
146
|
not1mm/plugins/cq_ww_cw.py,sha256=EtcfWGZCb49WXBNoVzB7WCy5JmLc1KLglmA0O1PFN2w,18040
|
147
147
|
not1mm/plugins/cq_ww_rtty.py,sha256=2u3k4ofPh3S4B-BVlQtis-X4rwdx221WRf3hjHWPEyg,22549
|
148
148
|
not1mm/plugins/cq_ww_ssb.py,sha256=txeBfJ8rZCrAG2BWY-UmTH81ufRYbkeJJ6NpnV1eKKg,18055
|
149
|
-
not1mm/plugins/cwt.py,sha256=
|
149
|
+
not1mm/plugins/cwt.py,sha256=ozNGV_ziOjxJoFuqBjJC8_r9CWqJhunQJD5g9YrJBEM,17446
|
150
150
|
not1mm/plugins/darc_vhf.py,sha256=cyckJ-0c_z7uONEWwxbvxi_olxPP0NJm3ryQRCkT5tE,27419
|
151
151
|
not1mm/plugins/darc_xmas.py,sha256=p5UNYLdtylsC_sSlxT8NvXXL1oSW0KyUhIN-rJonHgI,18971
|
152
152
|
not1mm/plugins/ea_majistad_cw.py,sha256=tl9y92Oz4NTch4H-SrBnZND2tHGqWQvtgl3emXfU8og,23352
|
@@ -177,11 +177,12 @@ not1mm/plugins/sac_ssb.py,sha256=_hzcU-ZN9S8Z1HrLXIdUL-h60cVrTM3s9CGfksI35Uo,213
|
|
177
177
|
not1mm/plugins/spdx.py,sha256=O_PhTaWdjaV29hj2G8tUK3m6GNx8f40hO1JAF-olLMg,15909
|
178
178
|
not1mm/plugins/stew_perry_topband.py,sha256=3U-Dr28haBTqTaZWLiC1qHQBmLsLENDL-ihyddPpJbg,15403
|
179
179
|
not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,19105
|
180
|
+
not1mm/plugins/vhf_sprint.py,sha256=a9QFTpv8XUbZ_GLjdVCh7svykFa-gXOWwKFZ6MD3uQM,19289
|
180
181
|
not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
|
181
182
|
not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
|
182
|
-
not1mm-25.4.
|
183
|
-
not1mm-25.4.
|
184
|
-
not1mm-25.4.
|
185
|
-
not1mm-25.4.
|
186
|
-
not1mm-25.4.
|
187
|
-
not1mm-25.4.
|
183
|
+
not1mm-25.4.28.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
184
|
+
not1mm-25.4.28.dist-info/METADATA,sha256=sMrrAxzBkOF5dhq-xkmm_IxRhURwBcJbryNHDo7IeBY,40736
|
185
|
+
not1mm-25.4.28.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
|
186
|
+
not1mm-25.4.28.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
187
|
+
not1mm-25.4.28.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
188
|
+
not1mm-25.4.28.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|