not1mm 24.9.14__py3-none-any.whl → 24.9.22__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 +31 -17
- not1mm/data/MASTER.SCP +1155 -1554
- not1mm/data/cty.json +1 -1
- not1mm/data/new_contest.ui +9 -4
- not1mm/data/rttymacros.txt +24 -0
- not1mm/lib/cwinterface.py +29 -21
- not1mm/lib/fldigi_sendstring.py +23 -0
- not1mm/lib/lookup.py +7 -4
- not1mm/lib/plugin_common.py +9 -0
- not1mm/lib/version.py +1 -1
- not1mm/plugins/arrl_vhf_jan.py +2 -2
- not1mm/plugins/arrl_vhf_jun.py +2 -2
- not1mm/plugins/arrl_vhf_sep.py +2 -2
- not1mm/plugins/cq_ww_cw.py +34 -0
- not1mm/plugins/cq_ww_rtty.py +478 -0
- not1mm/plugins/cq_ww_ssb.py +34 -0
- not1mm/test.py +19 -4
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/METADATA +4 -1
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/RECORD +23 -20
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/WHEEL +1 -1
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/LICENSE +0 -0
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/entry_points.txt +0 -0
- {not1mm-24.9.14.dist-info → not1mm-24.9.22.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,478 @@
|
|
1
|
+
"""CQ World Wide DX CW plugin"""
|
2
|
+
|
3
|
+
# CQ Worldwide DX Contest, RTTY
|
4
|
+
# Status: Active
|
5
|
+
# Geographic Focus: Worldwide
|
6
|
+
# Participation: Worldwide
|
7
|
+
# Awards: Worldwide
|
8
|
+
# Mode: RTTY
|
9
|
+
# Bands: 80, 40, 20, 15, 10m
|
10
|
+
# Classes: Single Op All Band (High/Low/QRP)
|
11
|
+
# Single Op Single Band (High/Low/QRP)
|
12
|
+
# Single Op Assisted All Band (High/Low/QRP)
|
13
|
+
# Single Op Assisted Single Band (High/Low/QRP)
|
14
|
+
# Single Op Overlays: (Classic/Rookie/Youth)
|
15
|
+
# Multi-Single (High/Low)
|
16
|
+
# Multi-Two
|
17
|
+
# Multi-Multi
|
18
|
+
# Explorer
|
19
|
+
# Max power: HP: 1500 watts
|
20
|
+
# LP: 100 watts
|
21
|
+
# QRP: 5 watts
|
22
|
+
# Exchange: 48 States/Canada: RST + CQ Zone + (state/VE area)
|
23
|
+
# All Others: RST + CQ Zone
|
24
|
+
# Work stations: Once per band
|
25
|
+
# QSO Points: 1 point per QSO with same country
|
26
|
+
# 2 points per QSO with same continent
|
27
|
+
# 3 points per QSO with different continent
|
28
|
+
# Multipliers: W/VE Stations: Each US state/VE area once per band
|
29
|
+
# Each DXCC/WAE country once per band
|
30
|
+
# Each CQ zone once per band
|
31
|
+
# Score Calculation: Total score = total QSO points x total mults
|
32
|
+
# E-mail logs to: (none)
|
33
|
+
# Upload log at: https://www.cqwwrtty.com/logcheck/
|
34
|
+
# Mail logs to: (see rules)
|
35
|
+
# Find rules at: https://www.cqwwrtty.com/
|
36
|
+
# Cabrillo name: CQ-WW-RTTY
|
37
|
+
|
38
|
+
|
39
|
+
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
|
40
|
+
|
41
|
+
import datetime
|
42
|
+
import logging
|
43
|
+
|
44
|
+
from pathlib import Path
|
45
|
+
|
46
|
+
from PyQt6 import QtWidgets
|
47
|
+
|
48
|
+
from not1mm.lib.ham_utility import get_logged_band
|
49
|
+
from not1mm.lib.plugin_common import gen_adif, get_points
|
50
|
+
from not1mm.lib.version import __version__
|
51
|
+
|
52
|
+
logger = logging.getLogger(__name__)
|
53
|
+
|
54
|
+
ALTEREGO = None
|
55
|
+
|
56
|
+
EXCHANGE_HINT = "RST + CQ Zone + (state/VE area)"
|
57
|
+
|
58
|
+
name = "CQ WW RTTY"
|
59
|
+
cabrillo_name = "CQ-WW-RTTY"
|
60
|
+
mode = "RTTY" # CW SSB BOTH RTTY
|
61
|
+
# columns = [0, 1, 2, 3, 4, 5, 6, 15]
|
62
|
+
columns = [
|
63
|
+
"YYYY-MM-DD HH:MM:SS",
|
64
|
+
"Call",
|
65
|
+
"Freq",
|
66
|
+
"Snt",
|
67
|
+
"Rcv",
|
68
|
+
"SentNr",
|
69
|
+
"ZN",
|
70
|
+
"Exchange1",
|
71
|
+
"PTS",
|
72
|
+
]
|
73
|
+
|
74
|
+
advance_on_space = [True, True, True, True, True]
|
75
|
+
|
76
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
77
|
+
dupe_type = 2
|
78
|
+
|
79
|
+
|
80
|
+
def init_contest(self):
|
81
|
+
"""setup plugin"""
|
82
|
+
set_tab_next(self)
|
83
|
+
set_tab_prev(self)
|
84
|
+
interface(self)
|
85
|
+
self.next_field = self.other_1
|
86
|
+
|
87
|
+
|
88
|
+
def interface(self):
|
89
|
+
"""Setup user interface"""
|
90
|
+
self.field1.show()
|
91
|
+
self.field2.show()
|
92
|
+
self.field3.show()
|
93
|
+
self.field4.show()
|
94
|
+
self.snt_label.setText("SNT")
|
95
|
+
self.field1.setAccessibleName("RST Sent")
|
96
|
+
label = self.field3.findChild(QtWidgets.QLabel)
|
97
|
+
label.setText("CQ Zone")
|
98
|
+
self.field3.setAccessibleName("C Q Zone")
|
99
|
+
label = self.field4.findChild(QtWidgets.QLabel)
|
100
|
+
label.setText("State/Prov")
|
101
|
+
self.field4.setAccessibleName("U S State or Providence")
|
102
|
+
|
103
|
+
|
104
|
+
def reset_label(self):
|
105
|
+
"""reset label after field cleared"""
|
106
|
+
|
107
|
+
|
108
|
+
def set_tab_next(self):
|
109
|
+
"""Set TAB Advances"""
|
110
|
+
self.tab_next = {
|
111
|
+
self.callsign: self.field1.findChild(QtWidgets.QLineEdit),
|
112
|
+
self.field1.findChild(QtWidgets.QLineEdit): self.field2.findChild(
|
113
|
+
QtWidgets.QLineEdit
|
114
|
+
),
|
115
|
+
self.field2.findChild(QtWidgets.QLineEdit): self.field3.findChild(
|
116
|
+
QtWidgets.QLineEdit
|
117
|
+
),
|
118
|
+
self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
|
119
|
+
QtWidgets.QLineEdit
|
120
|
+
),
|
121
|
+
self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
def set_tab_prev(self):
|
126
|
+
"""Set TAB Advances"""
|
127
|
+
self.tab_prev = {
|
128
|
+
self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
|
129
|
+
self.field1.findChild(QtWidgets.QLineEdit): self.callsign,
|
130
|
+
self.field2.findChild(QtWidgets.QLineEdit): self.field1.findChild(
|
131
|
+
QtWidgets.QLineEdit
|
132
|
+
),
|
133
|
+
self.field3.findChild(QtWidgets.QLineEdit): self.field2.findChild(
|
134
|
+
QtWidgets.QLineEdit
|
135
|
+
),
|
136
|
+
self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
|
137
|
+
QtWidgets.QLineEdit
|
138
|
+
),
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
def set_contact_vars(self):
|
143
|
+
"""Contest Specific"""
|
144
|
+
self.contact["SNT"] = self.sent.text()
|
145
|
+
self.contact["RCV"] = self.receive.text()
|
146
|
+
self.contact["ZN"] = self.other_1.text()
|
147
|
+
self.contact["Exchange1"] = self.other_2.text()
|
148
|
+
self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
|
149
|
+
|
150
|
+
|
151
|
+
def predupe(self):
|
152
|
+
"""called after callsign entered"""
|
153
|
+
|
154
|
+
|
155
|
+
def prefill(self):
|
156
|
+
"""Fill CQ Zone"""
|
157
|
+
if len(self.other_1.text()) == 0:
|
158
|
+
self.other_1.setText(str(self.contact.get("ZN", "")))
|
159
|
+
|
160
|
+
|
161
|
+
def points(self):
|
162
|
+
"""Calc point"""
|
163
|
+
# QSO Points: 1 point per QSO with same country
|
164
|
+
# 2 points per QSO with same continent
|
165
|
+
# 3 points per QSO with different continent
|
166
|
+
|
167
|
+
result = self.cty_lookup(self.station.get("Call", ""))
|
168
|
+
if result:
|
169
|
+
for item in result.items():
|
170
|
+
mycountry = item[1].get("entity", "")
|
171
|
+
mycontinent = item[1].get("continent", "")
|
172
|
+
result = self.cty_lookup(self.contact.get("Call", ""))
|
173
|
+
if result:
|
174
|
+
for item in result.items():
|
175
|
+
entity = item[1].get("entity", "")
|
176
|
+
continent = item[1].get("continent", "")
|
177
|
+
if mycountry.upper() == entity.upper():
|
178
|
+
return 1
|
179
|
+
if mycontinent == continent:
|
180
|
+
return 2
|
181
|
+
else:
|
182
|
+
return 3
|
183
|
+
return 0
|
184
|
+
|
185
|
+
|
186
|
+
def show_mults(self):
|
187
|
+
"""Return display string for mults"""
|
188
|
+
|
189
|
+
# Multipliers: W/VE Stations: Each US state/VE area once per band
|
190
|
+
# Each DXCC/WAE country once per band
|
191
|
+
# Each CQ zone once per band
|
192
|
+
|
193
|
+
result1 = self.database.fetch_zn_band_count()
|
194
|
+
result2 = self.database.fetch_country_band_count()
|
195
|
+
res3_query = f"select count(DISTINCT(Exchange1 || ':' || Band)) as spc_count from dxlog where ContestNR = {self.database.current_contest};"
|
196
|
+
result3 = self.database.exec_sql(res3_query)
|
197
|
+
if result1 and result2 and result3:
|
198
|
+
return int(result1.get("zb_count", 0)) + int(result2.get("cb_count", 0)) + int(result3.get("spc_count", 0))
|
199
|
+
return 0
|
200
|
+
|
201
|
+
|
202
|
+
def show_qso(self):
|
203
|
+
"""Return qso count"""
|
204
|
+
result = self.database.fetch_qso_count()
|
205
|
+
if result:
|
206
|
+
return int(result.get("qsos", 0))
|
207
|
+
return 0
|
208
|
+
|
209
|
+
|
210
|
+
def calc_score(self):
|
211
|
+
"""Return calculated score"""
|
212
|
+
result = self.database.fetch_points()
|
213
|
+
if result is not None:
|
214
|
+
score = result.get("Points", "0")
|
215
|
+
if score is None:
|
216
|
+
score = "0"
|
217
|
+
contest_points = int(score)
|
218
|
+
mults = show_mults(self)
|
219
|
+
return contest_points * mults
|
220
|
+
return 0
|
221
|
+
|
222
|
+
|
223
|
+
def adif(self):
|
224
|
+
"""Call the generate ADIF function"""
|
225
|
+
gen_adif(self, cabrillo_name, "CQ-WW-RTTY")
|
226
|
+
|
227
|
+
|
228
|
+
def cabrillo(self):
|
229
|
+
"""Generates Cabrillo file. Maybe."""
|
230
|
+
# https://www.cqwpx.com/cabrillo.htm
|
231
|
+
logger.debug("******Cabrillo*****")
|
232
|
+
logger.debug("Station: %s", f"{self.station}")
|
233
|
+
logger.debug("Contest: %s", f"{self.contest_settings}")
|
234
|
+
now = datetime.datetime.now()
|
235
|
+
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
236
|
+
filename = (
|
237
|
+
str(Path.home())
|
238
|
+
+ "/"
|
239
|
+
+ f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
|
240
|
+
)
|
241
|
+
logger.debug("%s", filename)
|
242
|
+
log = self.database.fetch_all_contacts_asc()
|
243
|
+
try:
|
244
|
+
with open(filename, "w", encoding="ascii") as file_descriptor:
|
245
|
+
print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
|
246
|
+
print(
|
247
|
+
f"CREATED-BY: Not1MM v{__version__}",
|
248
|
+
end="\r\n",
|
249
|
+
file=file_descriptor,
|
250
|
+
)
|
251
|
+
print(
|
252
|
+
f"CONTEST: {cabrillo_name}",
|
253
|
+
end="\r\n",
|
254
|
+
file=file_descriptor,
|
255
|
+
)
|
256
|
+
if self.station.get("Club", ""):
|
257
|
+
print(
|
258
|
+
f"CLUB: {self.station.get('Club', '').upper()}",
|
259
|
+
end="\r\n",
|
260
|
+
file=file_descriptor,
|
261
|
+
)
|
262
|
+
print(
|
263
|
+
f"CALLSIGN: {self.station.get('Call','')}",
|
264
|
+
end="\r\n",
|
265
|
+
file=file_descriptor,
|
266
|
+
)
|
267
|
+
print(
|
268
|
+
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
269
|
+
end="\r\n",
|
270
|
+
file=file_descriptor,
|
271
|
+
)
|
272
|
+
print(
|
273
|
+
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
274
|
+
end="\r\n",
|
275
|
+
file=file_descriptor,
|
276
|
+
)
|
277
|
+
print(
|
278
|
+
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
279
|
+
end="\r\n",
|
280
|
+
file=file_descriptor,
|
281
|
+
)
|
282
|
+
print(
|
283
|
+
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
284
|
+
end="\r\n",
|
285
|
+
file=file_descriptor,
|
286
|
+
)
|
287
|
+
print(
|
288
|
+
f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
|
289
|
+
end="\r\n",
|
290
|
+
file=file_descriptor,
|
291
|
+
)
|
292
|
+
print(
|
293
|
+
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
294
|
+
end="\r\n",
|
295
|
+
file=file_descriptor,
|
296
|
+
)
|
297
|
+
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
298
|
+
print(
|
299
|
+
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
300
|
+
end="\r\n",
|
301
|
+
file=file_descriptor,
|
302
|
+
)
|
303
|
+
print(
|
304
|
+
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
305
|
+
end="\r\n",
|
306
|
+
file=file_descriptor,
|
307
|
+
)
|
308
|
+
print(
|
309
|
+
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
310
|
+
end="\r\n",
|
311
|
+
file=file_descriptor,
|
312
|
+
)
|
313
|
+
|
314
|
+
print(
|
315
|
+
f"CLAIMED-SCORE: {calc_score(self)}",
|
316
|
+
end="\r\n",
|
317
|
+
file=file_descriptor,
|
318
|
+
)
|
319
|
+
ops = f"@{self.station.get('Call','')}"
|
320
|
+
list_of_ops = self.database.get_ops()
|
321
|
+
for op in list_of_ops:
|
322
|
+
ops += f", {op.get('Operator', '')}"
|
323
|
+
print(
|
324
|
+
f"OPERATORS: {ops}",
|
325
|
+
end="\r\n",
|
326
|
+
file=file_descriptor,
|
327
|
+
)
|
328
|
+
print(
|
329
|
+
f"NAME: {self.station.get('Name', '')}",
|
330
|
+
end="\r\n",
|
331
|
+
file=file_descriptor,
|
332
|
+
)
|
333
|
+
print(
|
334
|
+
f"ADDRESS: {self.station.get('Street1', '')}",
|
335
|
+
end="\r\n",
|
336
|
+
file=file_descriptor,
|
337
|
+
)
|
338
|
+
print(
|
339
|
+
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
340
|
+
end="\r\n",
|
341
|
+
file=file_descriptor,
|
342
|
+
)
|
343
|
+
print(
|
344
|
+
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
345
|
+
end="\r\n",
|
346
|
+
file=file_descriptor,
|
347
|
+
)
|
348
|
+
print(
|
349
|
+
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
350
|
+
end="\r\n",
|
351
|
+
file=file_descriptor,
|
352
|
+
)
|
353
|
+
print(
|
354
|
+
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
355
|
+
end="\r\n",
|
356
|
+
file=file_descriptor,
|
357
|
+
)
|
358
|
+
print(
|
359
|
+
f"EMAIL: {self.station.get('Email', '')}",
|
360
|
+
end="\r\n",
|
361
|
+
file=file_descriptor,
|
362
|
+
)
|
363
|
+
for contact in log:
|
364
|
+
the_date_and_time = contact.get("TS", "")
|
365
|
+
themode = contact.get("Mode", "")
|
366
|
+
if themode == "LSB" or themode == "USB":
|
367
|
+
themode = "PH"
|
368
|
+
if themode.strip() == "RTTY":
|
369
|
+
themode = "RY"
|
370
|
+
frequency = str(int(contact.get("Freq", "0"))).rjust(5)
|
371
|
+
|
372
|
+
loggeddate = the_date_and_time[:10]
|
373
|
+
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
374
|
+
print(
|
375
|
+
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
376
|
+
f"{contact.get('StationPrefix', '').ljust(13)} "
|
377
|
+
f"{str(contact.get('SNT', '')).ljust(3)} "
|
378
|
+
f"{str(contact.get('SentNr', '')).ljust(6)} "
|
379
|
+
f"{contact.get('Call', '').ljust(13)} "
|
380
|
+
f"{str(contact.get('RCV', '')).ljust(3)} "
|
381
|
+
f"{str(contact.get('ZN', '')).zfill(2)}",
|
382
|
+
f"{str(contact.get('Exchange1', '')).ljust(2)}",
|
383
|
+
end="\r\n",
|
384
|
+
file=file_descriptor,
|
385
|
+
)
|
386
|
+
print("END-OF-LOG:", end="\r\n", file=file_descriptor)
|
387
|
+
self.show_message_box(f"Cabrillo saved to: {filename}")
|
388
|
+
except IOError as exception:
|
389
|
+
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
390
|
+
self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
|
391
|
+
return
|
392
|
+
|
393
|
+
|
394
|
+
def recalculate_mults(self):
|
395
|
+
"""Recalculates multipliers after change in logged qso."""
|
396
|
+
|
397
|
+
|
398
|
+
def set_self(the_outie):
|
399
|
+
"""..."""
|
400
|
+
globals()["ALTEREGO"] = the_outie
|
401
|
+
|
402
|
+
|
403
|
+
def ft8_handler(the_packet: dict):
|
404
|
+
"""Process FT8 QSO packets
|
405
|
+
FT8
|
406
|
+
{
|
407
|
+
'CALL': 'KE0OG',
|
408
|
+
'GRIDSQUARE': 'DM10AT',
|
409
|
+
'MODE': 'FT8',
|
410
|
+
'RST_SENT': '',
|
411
|
+
'RST_RCVD': '',
|
412
|
+
'QSO_DATE': '20210329',
|
413
|
+
'TIME_ON': '183213',
|
414
|
+
'QSO_DATE_OFF': '20210329',
|
415
|
+
'TIME_OFF': '183213',
|
416
|
+
'BAND': '20M',
|
417
|
+
'FREQ': '14.074754',
|
418
|
+
'STATION_CALLSIGN': 'K6GTE',
|
419
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
420
|
+
'CONTEST_ID': 'ARRL-FIELD-DAY',
|
421
|
+
'SRX_STRING': '1D UT',
|
422
|
+
'CLASS': '1D',
|
423
|
+
'ARRL_SECT': 'UT'
|
424
|
+
}
|
425
|
+
FlDigi
|
426
|
+
{
|
427
|
+
'FREQ': '7.029500',
|
428
|
+
'CALL': 'DL2DSL',
|
429
|
+
'MODE': 'RTTY',
|
430
|
+
'NAME': 'BOB',
|
431
|
+
'QSO_DATE': '20240904',
|
432
|
+
'QSO_DATE_OFF': '20240904',
|
433
|
+
'TIME_OFF': '212825',
|
434
|
+
'TIME_ON': '212800',
|
435
|
+
'RST_RCVD': '599',
|
436
|
+
'RST_SENT': '599',
|
437
|
+
'BAND': '40M',
|
438
|
+
'COUNTRY': 'FED. REP. OF GERMANY',
|
439
|
+
'CQZ': '14',
|
440
|
+
'STX': '000',
|
441
|
+
'STX_STRING': '1D ORG',
|
442
|
+
'CLASS': '1D',
|
443
|
+
'ARRL_SECT': 'DX',
|
444
|
+
'TX_PWR': '0',
|
445
|
+
'OPERATOR': 'K6GTE',
|
446
|
+
'STATION_CALLSIGN': 'K6GTE',
|
447
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
448
|
+
'MY_CITY': 'ANAHEIM, CA',
|
449
|
+
'MY_STATE': 'CA'
|
450
|
+
}
|
451
|
+
|
452
|
+
"""
|
453
|
+
logger.debug(f"{the_packet=}")
|
454
|
+
# {
|
455
|
+
# 'FREQ': '7.040000', 'CALL': 'K5TUX', 'MODE': 'RTTY', 'QSO_DATE': '20240916', 'QSO_DATE_OFF': '20240916',
|
456
|
+
# 'TIME_OFF': '235422', 'TIME_ON': '235100', 'RST_RCVD': '599', 'RST_SENT': '599', 'STATE': 'MO', 'BAND': '40M',
|
457
|
+
# 'COUNTRY': 'USA', 'CQZ': '3', 'STX': '000', 'STX_STRING': 'DM13', 'TX_PWR': '0', 'OPERATOR': 'K6GTE',
|
458
|
+
# 'STATION_CALLSIGN': 'K6GTE', 'MY_GRIDSQUARE': 'DM13AT', 'MY_CITY': 'ANAHEIM, CA', 'MY_STATE': 'CA'
|
459
|
+
# }
|
460
|
+
if ALTEREGO is not None:
|
461
|
+
ALTEREGO.callsign.setText(the_packet.get("CALL"))
|
462
|
+
ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
|
463
|
+
ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
|
464
|
+
ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
|
465
|
+
ALTEREGO.contact["Exchange1"] = f"{the_packet.get("STATE", "")}".strip()
|
466
|
+
ALTEREGO.contact["ZN"] = the_packet.get("CQZ", "")
|
467
|
+
ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
|
468
|
+
ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
|
469
|
+
ALTEREGO.contact["QSXFreq"] = round(
|
470
|
+
float(the_packet.get("FREQ", "0.0")) * 1000, 2
|
471
|
+
)
|
472
|
+
ALTEREGO.contact["Band"] = get_logged_band(
|
473
|
+
str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
|
474
|
+
)
|
475
|
+
logger.debug(f"{ALTEREGO.contact=}")
|
476
|
+
ALTEREGO.other_1.setText(str(the_packet.get("CQZ", "ERR")))
|
477
|
+
ALTEREGO.other_2.setText(f"{the_packet.get("STATE", "")}".strip())
|
478
|
+
ALTEREGO.save_contact()
|
not1mm/plugins/cq_ww_ssb.py
CHANGED
@@ -1,5 +1,39 @@
|
|
1
1
|
"""CQ World Wide DX SSB plugin"""
|
2
2
|
|
3
|
+
# CQ Worldwide DX Contest, SSB
|
4
|
+
# Status: Active
|
5
|
+
# Geographic Focus: Worldwide
|
6
|
+
# Participation: Worldwide
|
7
|
+
# Awards: Worldwide
|
8
|
+
# Mode: SSB
|
9
|
+
# Bands: 160, 80, 40, 20, 15, 10m
|
10
|
+
# Classes: Single Op All Band (QRP/Low/High)
|
11
|
+
# Single Op Single Band (QRP/Low/High)
|
12
|
+
# Single Op Assisted All Band (QRP/Low/High)
|
13
|
+
# Single Op Assisted Single Band (QRP/Low/High)
|
14
|
+
# Single Op Overlays: (Classic/Rookie/Youth)
|
15
|
+
# Multi-Single (Low/High)
|
16
|
+
# Multi-Two
|
17
|
+
# Multi-Multi
|
18
|
+
# Explorer
|
19
|
+
# Max power: HP: 1500 watts
|
20
|
+
# LP: 100 watts
|
21
|
+
# QRP: 5 watts
|
22
|
+
# Exchange: RS + CQ Zone No.
|
23
|
+
# Work stations: Once per band
|
24
|
+
# QSO Points: 0 points per QSO with same country (counts as mult)
|
25
|
+
# 1 point per QSO with different country same continent
|
26
|
+
# 2 points per QSO with different country same continent (NA)
|
27
|
+
# 3 points per QSO with different continent
|
28
|
+
# Multipliers: Each CQ zone once per band
|
29
|
+
# Each country once per band
|
30
|
+
# Score Calculation: Total score = total QSO points x total mults
|
31
|
+
# E-mail logs to: (none)
|
32
|
+
# Upload log at: https://www.cqww.com/logcheck/
|
33
|
+
# Mail logs to: (none)
|
34
|
+
# Find rules at: https://www.cqww.com/rules.htm
|
35
|
+
# Cabrillo name: CQ-WW-SSB
|
36
|
+
|
3
37
|
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
|
4
38
|
|
5
39
|
import datetime
|
not1mm/test.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import xmltodict
|
1
|
+
# import xmltodict
|
2
2
|
|
3
3
|
# import xmlrpc.client
|
4
4
|
|
@@ -8,6 +8,21 @@ import xmltodict
|
|
8
8
|
# response = server.log.add_record(adif)
|
9
9
|
|
10
10
|
|
11
|
-
xml = '<?xml version="1.0"?>\n<HamQTH version="2.8" xmlns="https://www.hamqth.com">\n <search>\n <callsign>K6GTE</callsign>\n <nick>Mike</nick>\n <qth>Anaheim</qth>\n <country>United States</country>\n <adif>291</adif>\n <itu>6</itu>\n <cq>3</cq>\n <grid>DM13AT</grid>\n <adr_name>Michael C Bridak</adr_name>\n <adr_street1>2854 W Bridgeport Ave</adr_street1>\n <adr_city>Anaheim</adr_city>\n <adr_zip>92804</adr_zip>\n <adr_country>United States</adr_country>\n <adr_adif>291</adr_adif>\n <us_state>CA</us_state>\n <us_county>Orange</us_county>\n <lotw>Y</lotw>\n <qsldirect>Y</qsldirect>\n <qsl>?</qsl>\n <eqsl>N</eqsl>\n <email>michael.bridak@gmail.com</email>\n <birth_year>1967</birth_year>\n <lic_year>2017</lic_year>\n <latitude>33.81</latitude>\n <longitude>-117.97</longitude>\n <continent>NA</continent>\n <utc_offset>-8</utc_offset>\n <picture>https://www.hamqth.com/userfiles/k/k6/k6gte/_header/header.jpg?ver=3</picture>\n </search>\n</HamQTH>'
|
12
|
-
result = xmltodict.parse(xml)
|
13
|
-
|
11
|
+
# xml = '<?xml version="1.0"?>\n<HamQTH version="2.8" xmlns="https://www.hamqth.com">\n <search>\n <callsign>K6GTE</callsign>\n <nick>Mike</nick>\n <qth>Anaheim</qth>\n <country>United States</country>\n <adif>291</adif>\n <itu>6</itu>\n <cq>3</cq>\n <grid>DM13AT</grid>\n <adr_name>Michael C Bridak</adr_name>\n <adr_street1>2854 W Bridgeport Ave</adr_street1>\n <adr_city>Anaheim</adr_city>\n <adr_zip>92804</adr_zip>\n <adr_country>United States</adr_country>\n <adr_adif>291</adr_adif>\n <us_state>CA</us_state>\n <us_county>Orange</us_county>\n <lotw>Y</lotw>\n <qsldirect>Y</qsldirect>\n <qsl>?</qsl>\n <eqsl>N</eqsl>\n <email>michael.bridak@gmail.com</email>\n <birth_year>1967</birth_year>\n <lic_year>2017</lic_year>\n <latitude>33.81</latitude>\n <longitude>-117.97</longitude>\n <continent>NA</continent>\n <utc_offset>-8</utc_offset>\n <picture>https://www.hamqth.com/userfiles/k/k6/k6gte/_header/header.jpg?ver=3</picture>\n </search>\n</HamQTH>'
|
12
|
+
# result = xmltodict.parse(xml)
|
13
|
+
|
14
|
+
import xmlrpc.client
|
15
|
+
|
16
|
+
target = "http://127.0.0.1:7362"
|
17
|
+
payload = "Hello^r"
|
18
|
+
response = ""
|
19
|
+
|
20
|
+
try:
|
21
|
+
server = xmlrpc.client.ServerProxy(target)
|
22
|
+
response = server.logbook.last_record()
|
23
|
+
response = server.main.tx()
|
24
|
+
response = server.text.add_tx(payload)
|
25
|
+
except ConnectionRefusedError:
|
26
|
+
...
|
27
|
+
|
28
|
+
print(f"{response=}")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: not1mm
|
3
|
-
Version: 24.9.
|
3
|
+
Version: 24.9.22
|
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
|
@@ -209,6 +209,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
209
209
|
- CQ WPX CW
|
210
210
|
- CQ WPX SSB
|
211
211
|
- CQ World Wide CW
|
212
|
+
- CQ World Wide RTTY
|
212
213
|
- CQ World Wide SSB
|
213
214
|
- CWOps CWT
|
214
215
|
- Helvetia
|
@@ -229,6 +230,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
229
230
|
|
230
231
|
## Recent Changes
|
231
232
|
|
233
|
+
- [24-9-22] Merged in changes for CQ WW RTTY
|
234
|
+
- [24-9-15] Fixing an ARRL VHF Cabrillo format error.
|
232
235
|
- [24-9-14] BugFix. Starting lookups fail init if no settings.
|
233
236
|
- [24-9-12] Fixed WSJT-X MFSK submodes FT4 Q65.
|
234
237
|
- [24-9-11-2] Removed all the sketchy threaded call lookups. They're now implimented as a multicast service.
|