not1mm 24.4.30__py3-none-any.whl → 24.5.9__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 (45) hide show
  1. not1mm/__main__.py +40 -67
  2. not1mm/bandmap.py +3 -1
  3. not1mm/checkwindow.py +5 -1
  4. not1mm/data/new_contest.ui +5 -0
  5. not1mm/lib/playsound.py +296 -0
  6. not1mm/lib/version.py +1 -1
  7. not1mm/logwindow.py +5 -1
  8. not1mm/playsoundtest.py +15 -0
  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_ss_cw.py +2 -0
  17. not1mm/plugins/arrl_ss_phone.py +2 -0
  18. not1mm/plugins/arrl_vhf_jan.py +2 -0
  19. not1mm/plugins/arrl_vhf_jun.py +2 -0
  20. not1mm/plugins/arrl_vhf_sep.py +2 -0
  21. not1mm/plugins/canada_day.py +2 -0
  22. not1mm/plugins/cq_160_cw.py +2 -0
  23. not1mm/plugins/cq_160_ssb.py +2 -0
  24. not1mm/plugins/cq_wpx_cw.py +39 -0
  25. not1mm/plugins/cq_wpx_ssb.py +2 -0
  26. not1mm/plugins/cq_ww_cw.py +2 -0
  27. not1mm/plugins/cq_ww_ssb.py +2 -0
  28. not1mm/plugins/cwt.py +26 -0
  29. not1mm/plugins/general_logging.py +2 -0
  30. not1mm/plugins/iaru_hf.py +2 -0
  31. not1mm/plugins/icwc_mst.py +372 -0
  32. not1mm/plugins/jidx_cw.py +31 -0
  33. not1mm/plugins/jidx_ph.py +2 -0
  34. not1mm/plugins/naqp_cw.py +32 -0
  35. not1mm/plugins/naqp_ssb.py +2 -0
  36. not1mm/plugins/stew_perry_topband.py +2 -0
  37. not1mm/radio.py +12 -9
  38. not1mm/vfo.py +5 -1
  39. not1mm/voice_keying.py +103 -0
  40. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/METADATA +9 -21
  41. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/RECORD +45 -41
  42. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/LICENSE +0 -0
  43. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/WHEEL +0 -0
  44. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/entry_points.txt +0 -0
  45. {not1mm-24.4.30.dist-info → not1mm-24.5.9.dist-info}/top_level.txt +0 -0
@@ -52,6 +52,8 @@ def interface(self):
52
52
  self.field2.show()
53
53
  self.field3.show()
54
54
  self.field4.show()
55
+ self.snt_label.setText("SNT")
56
+ self.field1.setAccessibleName("RST Sent")
55
57
  label = self.field3.findChild(QtWidgets.QLabel)
56
58
  label.setText("SentNR")
57
59
  self.field3.setAccessibleName("Sent Number")
@@ -83,6 +83,8 @@ def interface(self):
83
83
  self.field2.show()
84
84
  self.field3.show()
85
85
  self.field4.show()
86
+ self.snt_label.setText("SNT")
87
+ self.field1.setAccessibleName("RST Sent")
86
88
  label = self.field3.findChild(QtWidgets.QLabel)
87
89
  label.setText("SentNR")
88
90
  self.field3.setAccessibleName("Sent Grid")
@@ -51,6 +51,8 @@ def interface(self):
51
51
  self.field2.show()
52
52
  self.field3.show()
53
53
  self.field4.show()
54
+ self.snt_label.setText("SNT")
55
+ self.field1.setAccessibleName("RST Sent")
54
56
  label = self.field3.findChild(QtWidgets.QLabel)
55
57
  label.setText("SentNR")
56
58
  self.field3.setAccessibleName("Sent Grid")
@@ -51,6 +51,8 @@ def interface(self):
51
51
  self.field2.show()
52
52
  self.field3.show()
53
53
  self.field4.show()
54
+ self.snt_label.setText("SNT")
55
+ self.field1.setAccessibleName("RST Sent")
54
56
  label = self.field3.findChild(QtWidgets.QLabel)
55
57
  label.setText("SentNR")
56
58
  self.field3.setAccessibleName("Sent Grid")
@@ -84,6 +84,8 @@ def interface(self):
84
84
  self.field2.show()
85
85
  self.field3.show()
86
86
  self.field4.show()
87
+ self.snt_label.setText("SNT")
88
+ self.field1.setAccessibleName("RST Sent")
87
89
  label = self.field3.findChild(QtWidgets.QLabel)
88
90
  label.setText("SentNR")
89
91
  self.field3.setAccessibleName("Sent Number")
@@ -53,6 +53,8 @@ def interface(self):
53
53
  self.field2.show()
54
54
  self.field3.hide()
55
55
  self.field4.show()
56
+ self.snt_label.setText("SNT")
57
+ self.field1.setAccessibleName("RST Sent")
56
58
  # self.other_label.setText("SentNR")
57
59
  # self.field3.setAccessibleName("Sent Number")
58
60
  self.exch_label.setText("ST/Prov/CQ Zone")
@@ -53,6 +53,8 @@ def interface(self):
53
53
  self.field2.show()
54
54
  self.field3.hide()
55
55
  self.field4.show()
56
+ self.snt_label.setText("SNT")
57
+ self.field1.setAccessibleName("RST Sent")
56
58
  # self.other_label.setText("SentNR")
57
59
  # self.field3.setAccessibleName("Sent Number")
58
60
  self.exch_label.setText("ST/Prov/CQ Zone")
@@ -2,6 +2,43 @@
2
2
 
3
3
  # pylint: disable=invalid-name, c-extension-no-member, unused-import
4
4
 
5
+ # CQ WW WPX Contest, CW
6
+ # Status: Active
7
+ # Geographic Focus: Worldwide
8
+ # Participation: Worldwide
9
+ # Awards: Worldwide
10
+ # Mode: CW
11
+ # Bands: 160, 80, 40, 20, 15, 10m
12
+ # Classes: Single Op All Band (QRP/Low/High)
13
+ # Single Op Single Band (QRP/Low/High)
14
+ # Single Op Overlays: (TB-Wires/Rookie/Classic/Youth)
15
+ # Multi-Single (Low/High)
16
+ # Multi-Two
17
+ # Multi-Multi
18
+ # Multi-Distributed
19
+ # Max operating hours: Single Op: 36 hours with offtimes of at least 60 minutes
20
+ # Multi-Op: 48 hours
21
+ # Max power: HP: 1500 watts
22
+ # LP: 100 watts
23
+ # QRP: 5 watts
24
+ # Exchange: RST + Serial No.
25
+ # Work stations: Once per band
26
+ # QSO Points: All: 6 points per 160/80/40m QSO with different continent
27
+ # All: 3 points per 20/15/10m QSO with different continent
28
+ # Non-NA: 2 points per 160/80/40m QSO with same continent different country
29
+ # Non-NA: 1 point per 20/15/10m QSO with same continent different country
30
+ # NA: 4 points per 160/80/40m QSO with same continent different country
31
+ # NA: 2 points per 20/15/10m QSO with same continent different country
32
+ # All: 1 point per QSO with same country
33
+ # Multipliers: Prefixes once
34
+ # Score Calculation: Total score = total QSO points x total mults
35
+ # E-mail logs to: (none)
36
+ # Upload log at: https://www.cqwpx.com/logcheck/
37
+ # Mail logs to: (none)
38
+ # Find rules at: https://www.cqwpx.com/rules.htm
39
+ # Cabrillo name: CQ-WPX-CW
40
+
41
+
5
42
  import datetime
6
43
  import logging
7
44
 
@@ -53,6 +90,8 @@ def interface(self):
53
90
  self.field2.show()
54
91
  self.field3.show()
55
92
  self.field4.show()
93
+ self.snt_label.setText("SNT")
94
+ self.field1.setAccessibleName("RST Sent")
56
95
  self.other_label.setText("SentNR")
57
96
  self.field3.setAccessibleName("Sent Number")
58
97
  self.exch_label.setText("RcvNR")
@@ -53,6 +53,8 @@ def interface(self):
53
53
  self.field2.show()
54
54
  self.field3.show()
55
55
  self.field4.show()
56
+ self.snt_label.setText("SNT")
57
+ self.field1.setAccessibleName("RST Sent")
56
58
  label = self.field3.findChild(QtWidgets.QLabel)
57
59
  label.setText("SentNR")
58
60
  self.field3.setAccessibleName("Sent Number")
@@ -51,6 +51,8 @@ def interface(self):
51
51
  self.field2.show()
52
52
  self.field3.hide()
53
53
  self.field4.show()
54
+ self.snt_label.setText("SNT")
55
+ self.field1.setAccessibleName("RST Sent")
54
56
  label = self.field4.findChild(QtWidgets.QLabel)
55
57
  label.setText("CQ Zone")
56
58
  self.field4.setAccessibleName("C Q Zone")
@@ -51,6 +51,8 @@ def interface(self):
51
51
  self.field2.show()
52
52
  self.field3.hide()
53
53
  self.field4.show()
54
+ self.snt_label.setText("SNT")
55
+ self.field1.setAccessibleName("RST Sent")
54
56
  label = self.field4.findChild(QtWidgets.QLabel)
55
57
  label.setText("CQ Zone")
56
58
  self.field4.setAccessibleName("C Q Zone")
not1mm/plugins/cwt.py CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
4
 
5
+ # CWops Test (CWT)
6
+ # Status: Active
7
+ # Geographic Focus: Worldwide
8
+ # Participation: Worldwide
9
+ # Awards: Worldwide
10
+ # Mode: CW
11
+ # Bands: 160, 80, 40, 20, 15, 10m
12
+ # Classes: Single Op (QRP/Low/High)
13
+ # Max power: HP: >100 watts
14
+ # LP: 100 watts
15
+ # QRP: 5 watts
16
+ # Exchange: Member: Name + Member No./"CWA"
17
+ # non-Member: Name + (state/province/country)
18
+ # Work stations: Once per band
19
+ # QSO Points: 1 point per QSO
20
+ # Multipliers: Each call once
21
+ # Score Calculation: Total score = total QSO points x total mults
22
+ # Post log summary at: http://www.3830scores.com
23
+ # Mail logs to: (none)
24
+ # Find rules at: https://cwops.org/cwops-tests/
25
+ # Cabrillo name: CW-OPS
26
+ # Cabrillo name aliases: CW-OPS-CWT
27
+
28
+
5
29
  import datetime
6
30
  import logging
7
31
 
@@ -52,6 +76,8 @@ def interface(self):
52
76
  self.field2.show()
53
77
  self.field3.show()
54
78
  self.field4.show()
79
+ self.snt_label.setText("SNT")
80
+ self.field1.setAccessibleName("RST Sent")
55
81
  label = self.field3.findChild(QtWidgets.QLabel)
56
82
  label.setText("Name")
57
83
  self.field3.setAccessibleName("Name")
@@ -43,6 +43,8 @@ def interface(self):
43
43
  self.field2.show()
44
44
  self.field3.show()
45
45
  self.field4.show()
46
+ self.snt_label.setText("SNT")
47
+ self.field1.setAccessibleName("RST Sent")
46
48
  label = self.field3.findChild(QtWidgets.QLabel)
47
49
  label.setText("Name")
48
50
  self.field3.setAccessibleName("Name")
not1mm/plugins/iaru_hf.py CHANGED
@@ -67,6 +67,8 @@ def interface(self):
67
67
  self.field2.show()
68
68
  self.field3.hide()
69
69
  self.field4.show()
70
+ self.snt_label.setText("SNT")
71
+ self.field1.setAccessibleName("RST Sent")
70
72
  label = self.field4.findChild(QtWidgets.QLabel)
71
73
  label.setText("ITU Zone")
72
74
  self.field4.setAccessibleName("I T U Zone")
@@ -0,0 +1,372 @@
1
+ """ICWC Medium Speed Test"""
2
+
3
+ # pylint: disable=invalid-name, c-extension-no-member, unused-import
4
+
5
+
6
+ # ICWC Medium Speed Test
7
+ # Status: Active
8
+ # Geographic Focus: Worldwide
9
+ # Participation: Worldwide
10
+ # Mode: CW
11
+ # Bands: 160, 80, 40, 20, 15, 10m
12
+ # Classes: Single Op (QRP/Low/High)
13
+ # Max power: HP: >100 watts
14
+ # LP: 100 watts
15
+ # QRP: 5 watts
16
+ # Exchange: Name + QSO No.
17
+ # Work stations: Once per band
18
+ # QSO Points: 1 point per QSO
19
+ # Multipliers: Each call once
20
+ # Score Calculation: Total score = total QSO points x total mults
21
+ # Post log summary at: http://www.3830scores.com
22
+ # Mail logs to: (none)
23
+ # Find rules at: https://internationalcwcouncil.org/mst-contest/
24
+ # Cabrillo name: ICWC-MST
25
+
26
+ # The final score can be calculated by counting 1 point per QSO
27
+ # (work a station once per band only) and multiplying total points
28
+ # by the number of unique callsigns worked
29
+
30
+ import datetime
31
+ import logging
32
+
33
+ from pathlib import Path
34
+
35
+ from PyQt6 import QtWidgets
36
+
37
+ from not1mm.lib.plugin_common import gen_adif, get_points
38
+ from not1mm.lib.version import __version__
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+ EXCHANGE_HINT = "NAME"
43
+
44
+ name = "ICWC Medium Speed Test"
45
+ cabrillo_name = "ICWC-MST"
46
+ mode = "CW" # CW SSB BOTH RTTY
47
+
48
+ columns = [
49
+ "YYYY-MM-DD HH:MM:SS",
50
+ "Call",
51
+ "Freq",
52
+ "SentNr",
53
+ "Name",
54
+ "RcvNr",
55
+ "PTS",
56
+ ]
57
+
58
+ advance_on_space = [True, True, True, True, True]
59
+
60
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
61
+ dupe_type = 2
62
+
63
+
64
+ def init_contest(self):
65
+ """setup plugin"""
66
+ set_tab_next(self)
67
+ set_tab_prev(self)
68
+ interface(self)
69
+ self.next_field = self.other_1
70
+
71
+
72
+ def interface(self):
73
+ """Setup user interface"""
74
+ self.field1.show()
75
+ self.field2.hide()
76
+ self.field3.show()
77
+ self.field4.show()
78
+ self.snt_label.setText("Sent S/N")
79
+ self.field1.setAccessibleName("Sent Serial Number")
80
+ self.other_label.setText("Name")
81
+ self.field3.setAccessibleName("Name")
82
+ self.exch_label.setText("S/N")
83
+ self.field4.setAccessibleName("Serial Number")
84
+ self.sent.setText("")
85
+
86
+
87
+ def reset_label(self): # pylint: disable=unused-argument
88
+ """reset label after field cleared"""
89
+
90
+
91
+ def set_tab_next(self):
92
+ """Set TAB Advances"""
93
+ self.tab_next = {
94
+ self.callsign: self.field1.findChild(QtWidgets.QLineEdit),
95
+ self.field1.findChild(QtWidgets.QLineEdit): self.field3.findChild(
96
+ QtWidgets.QLineEdit
97
+ ),
98
+ # self.field2.findChild(QtWidgets.QLineEdit): self.field3.findChild(
99
+ # QtWidgets.QLineEdit
100
+ # ),
101
+ self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
102
+ QtWidgets.QLineEdit
103
+ ),
104
+ self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
105
+ }
106
+
107
+
108
+ def set_tab_prev(self):
109
+ """Set TAB Advances"""
110
+ self.tab_prev = {
111
+ self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
112
+ self.field1.findChild(QtWidgets.QLineEdit): self.callsign,
113
+ # self.field2.findChild(QtWidgets.QLineEdit): self.field1.findChild(
114
+ # QtWidgets.QLineEdit
115
+ # ),
116
+ self.field3.findChild(QtWidgets.QLineEdit): self.field1.findChild(
117
+ QtWidgets.QLineEdit
118
+ ),
119
+ self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
120
+ QtWidgets.QLineEdit
121
+ ),
122
+ }
123
+
124
+
125
+ def set_contact_vars(self):
126
+ """Contest Specific"""
127
+ self.contact["SNT"] = "599"
128
+ self.contact["RCV"] = "599"
129
+ self.contact["SentNr"] = self.sent.text()
130
+ self.contact["Name"] = self.other_1.text()
131
+ self.contact["NR"] = self.other_2.text()
132
+
133
+
134
+ def predupe(self): # pylint: disable=unused-argument
135
+ """called after callsign entered"""
136
+
137
+
138
+ def prefill(self):
139
+ """Fill SentNR"""
140
+ result = self.database.get_serial()
141
+ serial_nr = str(result.get("serial_nr", "1"))
142
+ if serial_nr == "None":
143
+ serial_nr = "1"
144
+ field = self.sent
145
+ if len(field.text()) == 0:
146
+ field.setText(serial_nr)
147
+
148
+
149
+ def points(self):
150
+ """Calc point"""
151
+ return 1
152
+
153
+
154
+ def show_mults(self):
155
+ """Return display string for mults"""
156
+ result = self.database.fetch_call_count()
157
+ if result:
158
+ return int(result.get("call_count", 0))
159
+ return 0
160
+
161
+
162
+ def show_qso(self):
163
+ """Return qso count"""
164
+ result = self.database.fetch_qso_count()
165
+ if result:
166
+ return int(result.get("qsos", 0))
167
+ return 0
168
+
169
+
170
+ def calc_score(self):
171
+ """Return calculated score"""
172
+ result = self.database.fetch_points()
173
+ if result is not None:
174
+ score = result.get("Points", "0")
175
+ if score is None:
176
+ score = "0"
177
+ contest_points = int(score)
178
+ mults = show_mults(self)
179
+ return contest_points * mults
180
+ return 0
181
+
182
+
183
+ def adif(self):
184
+ """Call the generate ADIF function"""
185
+ gen_adif(self, cabrillo_name, "ICWC-MST")
186
+
187
+
188
+ def cabrillo(self):
189
+ """Generates Cabrillo file. Maybe."""
190
+ logger.debug("******Cabrillo*****")
191
+ logger.debug("Station: %s", f"{self.station}")
192
+ logger.debug("Contest: %s", f"{self.contest_settings}")
193
+ now = datetime.datetime.now()
194
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
195
+ filename = (
196
+ str(Path.home())
197
+ + "/"
198
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
199
+ )
200
+ logger.debug("%s", filename)
201
+ log = self.database.fetch_all_contacts_asc()
202
+ try:
203
+ with open(filename, "w", encoding="ascii") as file_descriptor:
204
+ print("START-OF-LOG: 3.0", end="\r\n", file=file_descriptor)
205
+ print(
206
+ f"CREATED-BY: Not1MM v{__version__}",
207
+ end="\r\n",
208
+ file=file_descriptor,
209
+ )
210
+ print(
211
+ f"CONTEST: {cabrillo_name}",
212
+ end="\r\n",
213
+ file=file_descriptor,
214
+ )
215
+ if self.station.get("Club", ""):
216
+ print(
217
+ f"CLUB: {self.station.get('Club', '').upper()}",
218
+ end="\r\n",
219
+ file=file_descriptor,
220
+ )
221
+ print(
222
+ f"CALLSIGN: {self.station.get('Call','')}",
223
+ end="\r\n",
224
+ file=file_descriptor,
225
+ )
226
+ print(
227
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
228
+ end="\r\n",
229
+ file=file_descriptor,
230
+ )
231
+ # print(
232
+ # f"ARRL-SECTION: {self.pref.get('section', '')}",
233
+ # end="\r\n",
234
+ # file=file_descriptor,
235
+ # )
236
+ print(
237
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
238
+ end="\r\n",
239
+ file=file_descriptor,
240
+ )
241
+ print(
242
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
243
+ end="\r\n",
244
+ file=file_descriptor,
245
+ )
246
+ print(
247
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
248
+ end="\r\n",
249
+ file=file_descriptor,
250
+ )
251
+ print(
252
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
253
+ end="\r\n",
254
+ file=file_descriptor,
255
+ )
256
+ print(
257
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
258
+ end="\r\n",
259
+ file=file_descriptor,
260
+ )
261
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
262
+ print(
263
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
264
+ end="\r\n",
265
+ file=file_descriptor,
266
+ )
267
+ print(
268
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
269
+ end="\r\n",
270
+ file=file_descriptor,
271
+ )
272
+ # print(
273
+ # f"CATEGORY: {None}",
274
+ # end="\r\n",
275
+ # file=file_descriptor,
276
+ # )
277
+ print(
278
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
279
+ end="\r\n",
280
+ file=file_descriptor,
281
+ )
282
+
283
+ print(
284
+ f"CLAIMED-SCORE: {calc_score(self)}",
285
+ end="\r\n",
286
+ file=file_descriptor,
287
+ )
288
+ ops = f"@{self.station.get('Call','')}"
289
+ list_of_ops = self.database.get_ops()
290
+ for op in list_of_ops:
291
+ ops += f", {op.get('Operator', '')}"
292
+ print(
293
+ f"OPERATORS: {ops}",
294
+ end="\r\n",
295
+ file=file_descriptor,
296
+ )
297
+ print(
298
+ f"NAME: {self.station.get('Name', '')}",
299
+ end="\r\n",
300
+ file=file_descriptor,
301
+ )
302
+ print(
303
+ f"ADDRESS: {self.station.get('Street1', '')}",
304
+ end="\r\n",
305
+ file=file_descriptor,
306
+ )
307
+ print(
308
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
309
+ end="\r\n",
310
+ file=file_descriptor,
311
+ )
312
+ print(
313
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
314
+ end="\r\n",
315
+ file=file_descriptor,
316
+ )
317
+ print(
318
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
319
+ end="\r\n",
320
+ file=file_descriptor,
321
+ )
322
+ print(
323
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
324
+ end="\r\n",
325
+ file=file_descriptor,
326
+ )
327
+ print(
328
+ f"EMAIL: {self.station.get('Email', '')}",
329
+ end="\r\n",
330
+ file=file_descriptor,
331
+ )
332
+ for contact in log:
333
+ the_date_and_time = contact.get("TS", "")
334
+ themode = contact.get("Mode", "")
335
+ if themode == "LSB" or themode == "USB":
336
+ themode = "PH"
337
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
338
+
339
+ loggeddate = the_date_and_time[:10]
340
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
341
+ print(
342
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
343
+ f"{contact.get('StationPrefix', '').ljust(13)} "
344
+ f"{self.contest_settings.get('SentExchange', '').ljust(14).upper()}"
345
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
346
+ f"{contact.get('Call', '').ljust(13)} "
347
+ f"{str(contact.get('Name', '')).ljust(14)} "
348
+ f"{str(contact.get('NR', '')).ljust(6)}",
349
+ end="\r\n",
350
+ file=file_descriptor,
351
+ )
352
+ print("END-OF-LOG:", end="\r\n", file=file_descriptor)
353
+ self.show_message_box(f"Cabrillo saved to: {filename}")
354
+ except IOError as exception:
355
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
356
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
357
+ return
358
+
359
+
360
+ def recalculate_mults(self):
361
+ """Recalculates multipliers after change in logged qso."""
362
+ # all_contacts = self.database.fetch_all_contacts_asc()
363
+ # for contact in all_contacts:
364
+ # time_stamp = contact.get("TS", "")
365
+ # wpx = contact.get("WPXPrefix", "")
366
+ # result = self.database.fetch_wpx_exists_before_me(wpx, time_stamp)
367
+ # wpx_count = result.get("wpx_count", 1)
368
+ # if wpx_count == 0:
369
+ # contact["IsMultiplier1"] = 1
370
+ # else:
371
+ # contact["IsMultiplier1"] = 0
372
+ # self.database.change_contact(contact)
not1mm/plugins/jidx_cw.py CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  # pylint: disable=invalid-name, unused-variable, c-extension-no-member
4
4
 
5
+ # JIDX CW Contest
6
+ # Status: Active
7
+ # Geographic Focus: Japan
8
+ # Participation: Worldwide
9
+ # Mode: CW
10
+ # Bands: 160, 80, 40, 20, 15, 10m
11
+ # Classes: Single Op All Band (Low/High)
12
+ # Single Op Single Band (Low/High)
13
+ # Multi-Single
14
+ # Multi-Two
15
+ # Maritime Mobile
16
+ # Max power: HP: >100W
17
+ # LP: 100W
18
+ # Exchange: JA: RST + Prefecture No.
19
+ # non-JA: RST + CQ Zone No.
20
+ # Work stations: Once per band
21
+ # QSO Points: 4 points per JA-DX QSO on 160m
22
+ # 2 points per JA-DX QSO on 80m
23
+ # 1 points per JA-DX QSO on 40, 20, 15m
24
+ # 2 points per JA-DX QSO on 10m
25
+ # Multipliers: JA Stations: DXCC countries and CQ zones once per band
26
+ # non-JA Stations: JA prefectures plus JD1/O, JD1/MT, JD1/OT once per band
27
+ # Score Calculation: Total score = total QSO points x total mults
28
+ # E-mail logs to: cw[at]jidx[dot]org
29
+ # Upload log at: http://www.jidx.org/upload/uplog.html
30
+ # Mail logs to: (none)
31
+ # Find rules at: http://www.jidx.org/jidxrule-e.html
32
+ # Cabrillo name: JIDX-CW
33
+
5
34
  import datetime
6
35
  import logging
7
36
 
@@ -52,6 +81,8 @@ def interface(self):
52
81
  self.field2.show()
53
82
  self.field3.show()
54
83
  self.field4.show()
84
+ self.snt_label.setText("SNT")
85
+ self.field1.setAccessibleName("RST Sent")
55
86
  label = self.field3.findChild(QtWidgets.QLabel)
56
87
  label.setText("SentNR")
57
88
  self.field3.setAccessibleName("Sent Number")
not1mm/plugins/jidx_ph.py CHANGED
@@ -52,6 +52,8 @@ def interface(self):
52
52
  self.field2.show()
53
53
  self.field3.show()
54
54
  self.field4.show()
55
+ self.snt_label.setText("SNT")
56
+ self.field1.setAccessibleName("RST Sent")
55
57
  label = self.field3.findChild(QtWidgets.QLabel)
56
58
  label.setText("SentNR")
57
59
  self.field3.setAccessibleName("Sent Number")
not1mm/plugins/naqp_cw.py CHANGED
@@ -2,6 +2,36 @@
2
2
 
3
3
  # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
4
 
5
+ # North American QSO Party, CW
6
+ # Status: Active
7
+ # Geographic Focus: North America
8
+ # Participation: Worldwide
9
+ # Awards: North America
10
+ # Mode: CW
11
+ # Bands: 160, 80, 40, 20, 15, 10m
12
+ # Classes: Single Op (QRP/Low)
13
+ # Single Op Assisted (QRP/Low)
14
+ # Single Op Overlay: Youth
15
+ # Multi-Two (Low)
16
+ # Max operating hours: Single Op: 10 hours
17
+ # Multi-Two: 12 hours
18
+ # Max power: LP: 100 watts
19
+ # QRP: 5 watts
20
+ # Exchange: NA: Name + (state/DC/province/country)
21
+ # non-NA: Name
22
+ # Work stations: Once per band
23
+ # QSO Points: NA station: 1 point per QSO
24
+ # non-NA station: 1 point per QSO with an NA station
25
+ # Multipliers: Each US state and DC (including KH6/KL7) once per band
26
+ # Each VE province/territory once per band
27
+ # Each North American country (except W/VE) once per band
28
+ # Score Calculation: Total score = total QSO points x total mults
29
+ # E-mail logs to: (none)
30
+ # Upload log at: http://www.ncjweb.com/naqplogsubmit/
31
+ # Mail logs to: (none)
32
+ # Find rules at: https://www.ncjweb.com/NAQP-Rules.pdf
33
+ # Cabrillo name: NAQP-CW
34
+
5
35
  import datetime
6
36
  import logging
7
37
  import platform
@@ -51,6 +81,8 @@ def interface(self):
51
81
  self.field2.hide()
52
82
  self.field3.show()
53
83
  self.field4.show()
84
+ self.snt_label.setText("SNT")
85
+ self.field1.setAccessibleName("RST Sent")
54
86
  namefield = self.field3.findChild(QtWidgets.QLabel)
55
87
  namefield.setText("Name")
56
88
  self.field3.setAccessibleName("Name")