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 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
- self.radio_state["mode"] = mode
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
@@ -271,6 +271,11 @@
271
271
  <property name="text">
272
272
  <string>ARRL VHF SEP</string>
273
273
  </property>
274
+ </item>
275
+ <item>
276
+ <property name="text">
277
+ <string>VHF SPRINT</string>
278
+ </property>
274
279
  </item>
275
280
  <item>
276
281
  <property name="text">
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.4.22"
3
+ __version__ = "25.4.28"
@@ -82,13 +82,13 @@ def init_contest(self):
82
82
 
83
83
  def interface(self):
84
84
  """Setup user interface"""
85
- self.field1.show()
86
- self.field2.show()
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("SentNR")
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.sent,
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
 
@@ -50,13 +50,13 @@ def init_contest(self):
50
50
 
51
51
  def interface(self):
52
52
  """Setup user interface"""
53
- self.field1.show()
54
- self.field2.show()
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("SentNR")
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.sent,
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
 
@@ -50,13 +50,13 @@ def init_contest(self):
50
50
 
51
51
  def interface(self):
52
52
  """Setup user interface"""
53
- self.field1.show()
54
- self.field2.show()
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("SentNR")
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.sent,
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
- # LP: 100 watts
15
- # QRP: 5 watts
16
- # Exchange: Member: Name + Member No./"CWA"
17
- # non-Member: Name + (state/province/country)
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.show()
76
- self.field2.show()
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("ST/DX/#")
84
- self.field4.setAccessibleName("State D X or Number")
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.sent,
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.sent: self.callsign,
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.22
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=_rZzYXQyD1Ded9AENfUZRRyyJKPtWgo0QOj5xq0ofD0,156668
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=glqsmFGF5gh-JB-zuEVxAWrOR7-Hok5ibvZYCMcDCWE,25223
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=ziScggUquUMYDmJTMkk17HkC-imVcSH6S0USjwd6GY8,48
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=yGwzcwRwyHM6FF8d61WayjxvIEmJmOGqeziYUP9s3do,20330
138
- not1mm/plugins/arrl_vhf_jun.py,sha256=zieBad2LkyjmrtoB8NgDL5993zXBvuFu0Y-U1-Fy13k,19422
139
- not1mm/plugins/arrl_vhf_sep.py,sha256=4rFf8DXRKQqtyXQtG6ZpqZS1v3bBVJONG_e4EUmcm_U,19455
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=_bYlv6AMhfNVI7pChkSfEZ9amaIYhxu71qdmwgPTrKw,17594
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.22.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
183
- not1mm-25.4.22.dist-info/METADATA,sha256=PmAUZdFCwd3J4Y0vdPb2R9T_yowMus5u1cR4svjS5qY,40596
184
- not1mm-25.4.22.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
185
- not1mm-25.4.22.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
186
- not1mm-25.4.22.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
187
- not1mm-25.4.22.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5