not1mm 25.4.9__py3-none-any.whl → 25.4.10.1__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
@@ -840,6 +840,15 @@ class MainWindow(QtWidgets.QMainWindow):
840
840
  if hasattr(self.contest, "process_esm"):
841
841
  self.contest.process_esm(self, new_focused_widget=new)
842
842
 
843
+ def make_button_blue(self, the_button: QtWidgets.QPushButton) -> None:
844
+ """Takes supplied QPushButton object and turns it blue."""
845
+ if the_button is not None:
846
+ pal = QPalette()
847
+ pal.isCopyOf(self.current_palette)
848
+ blueColor = QColor(0, 0, 128)
849
+ pal.setBrush(QPalette.ColorRole.Button, blueColor)
850
+ the_button.setPalette(pal)
851
+
843
852
  def make_button_green(self, the_button: QtWidgets.QPushButton) -> None:
844
853
  """Takes supplied QPushButton object and turns it green."""
845
854
  if the_button is not None:
@@ -1844,6 +1853,7 @@ class MainWindow(QtWidgets.QMainWindow):
1844
1853
  "[CTRL-SHIFT-K] Open CW text input field.\n"
1845
1854
  "[CTRL-=]\tLog the contact without sending the ESM macros.\n"
1846
1855
  "[CTRL-W]\tClears the input fields of any text.\n"
1856
+ "[CTRL-R]\tToggle the Run state.\n"
1847
1857
  )
1848
1858
 
1849
1859
  def filepicker(self, action: str) -> str:
@@ -2096,6 +2106,7 @@ class MainWindow(QtWidgets.QMainWindow):
2096
2106
  def stop_cw(self):
2097
2107
  """"""
2098
2108
  self.auto_cq = False
2109
+ self.leftdot.hide()
2099
2110
  if self.cw is not None:
2100
2111
  if self.cw.servertype == 1:
2101
2112
  self.cw.sendcw("\x1b4")
@@ -2202,6 +2213,12 @@ class MainWindow(QtWidgets.QMainWindow):
2202
2213
  if self.bandmap_window:
2203
2214
  self.bandmap_window.msg_from_main(cmd)
2204
2215
  return
2216
+ if (
2217
+ event.key() == Qt.Key.Key_R
2218
+ and modifier == Qt.KeyboardModifier.ControlModifier
2219
+ ): # pylint: disable=no-member
2220
+ self.toggle_run_sp()
2221
+ return
2205
2222
  if (
2206
2223
  event.key() == Qt.Key.Key_W
2207
2224
  and modifier == Qt.KeyboardModifier.ControlModifier
@@ -2213,16 +2230,6 @@ class MainWindow(QtWidgets.QMainWindow):
2213
2230
  and modifier != Qt.KeyboardModifier.ControlModifier
2214
2231
  ):
2215
2232
  self.stop_cw()
2216
- # if self.cw is not None:
2217
- # if self.cw.servertype == 1:
2218
- # self.cw.sendcw("\x1b4")
2219
- # return
2220
- # if self.rig_control:
2221
- # if self.rig_control.online:
2222
- # if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2223
- # if self.rig_control.interface == "flrig":
2224
- # self.rig_control.cat.set_flrig_cw_send(False)
2225
- # self.rig_control.cat.set_flrig_cw_send(True)
2226
2233
  if event.key() == Qt.Key.Key_Up:
2227
2234
  cmd = {}
2228
2235
  cmd["cmd"] = "PREVSPOT"
@@ -2341,6 +2348,8 @@ class MainWindow(QtWidgets.QMainWindow):
2341
2348
  if event.modifiers() == Qt.KeyboardModifier.ShiftModifier:
2342
2349
  self.radioButton_run.setChecked(True)
2343
2350
  self.run_sp_buttons_clicked()
2351
+ # self.make_button_blue(self.F1)
2352
+ self.leftdot.show()
2344
2353
  self.auto_cq = True
2345
2354
  self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
2346
2355
  milliseconds=self.auto_cq_delay
@@ -2896,8 +2905,8 @@ class MainWindow(QtWidgets.QMainWindow):
2896
2905
 
2897
2906
  logger.debug("PTT On")
2898
2907
  if self.rig_control:
2899
- self.leftdot.setPixmap(self.greendot)
2900
- app.processEvents()
2908
+ # self.leftdot.setPixmap(self.greendot)
2909
+ # app.processEvents()
2901
2910
  self.rig_control.ptt_on()
2902
2911
 
2903
2912
  def ptt_off(self) -> None:
@@ -2915,8 +2924,8 @@ class MainWindow(QtWidgets.QMainWindow):
2915
2924
 
2916
2925
  logger.debug("PTT Off")
2917
2926
  if self.rig_control:
2918
- self.leftdot.setPixmap(self.reddot)
2919
- app.processEvents()
2927
+ # self.leftdot.setPixmap(self.reddot)
2928
+ # app.processEvents()
2920
2929
  self.rig_control.ptt_off()
2921
2930
 
2922
2931
  def process_function_key(self, function_key, rttysendrx=True) -> None:
@@ -2959,6 +2968,14 @@ class MainWindow(QtWidgets.QMainWindow):
2959
2968
  return
2960
2969
  self.cw.sendcw(self.process_macro(function_key.toolTip()))
2961
2970
 
2971
+ def toggle_run_sp(self) -> None:
2972
+ """Toggles the radioButton_run and radioButton_sp."""
2973
+ if self.radioButton_run.isChecked():
2974
+ self.radioButton_sp.setChecked(True)
2975
+ else:
2976
+ self.radioButton_run.setChecked(True)
2977
+ self.run_sp_buttons_clicked()
2978
+
2962
2979
  def run_sp_buttons_clicked(self) -> None:
2963
2980
  """
2964
2981
  Handle Run/S&P mode changes.
not1mm/data/greendot.png CHANGED
Binary file
@@ -212,6 +212,11 @@
212
212
  <string>10 10 WINTER PHONE</string>
213
213
  </property>
214
214
  </item>
215
+ <item>
216
+ <property name="text">
217
+ <string>ARI 40 80</string>
218
+ </property>
219
+ </item>
215
220
  <item>
216
221
  <property name="text">
217
222
  <string>ARRL 10M</string>
not1mm/lib/version.py CHANGED
@@ -1,4 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.4.9"
4
-
3
+ __version__ = "25.4.10.1"
@@ -0,0 +1,482 @@
1
+ """CQ 160 CW plugin"""
2
+
3
+ # pylint: disable=invalid-name, c-extension-no-member, unused-import, line-too-long
4
+
5
+ import datetime
6
+ import logging
7
+ import platform
8
+
9
+ from pathlib import Path
10
+
11
+ from PyQt6 import QtWidgets
12
+
13
+ from not1mm.lib.plugin_common import gen_adif
14
+ from not1mm.lib.version import __version__
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ EXCHANGE_HINT = "Automobile Code"
19
+
20
+ name = "ARI 40 80"
21
+ cabrillo_name = "40-80"
22
+ mode = "BOTH" # CW SSB BOTH RTTY
23
+
24
+ columns = [
25
+ "YYYY-MM-DD HH:MM:SS",
26
+ "Call",
27
+ "Freq",
28
+ "Mode",
29
+ "Snt",
30
+ "Rcv",
31
+ "Exchange1",
32
+ "PTS",
33
+ ]
34
+
35
+ advance_on_space = [True, True, True, True, True]
36
+
37
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
38
+ dupe_type = 3
39
+
40
+
41
+ def init_contest(self):
42
+ """setup plugin"""
43
+ set_tab_next(self)
44
+ set_tab_prev(self)
45
+ interface(self)
46
+ self.next_field = self.other_2
47
+
48
+
49
+ def interface(self):
50
+ """Setup user interface"""
51
+ self.field1.show()
52
+ self.field2.show()
53
+ self.field3.hide()
54
+ self.field4.show()
55
+ self.snt_label.setText("SNT")
56
+ self.field1.setAccessibleName("RST Sent")
57
+ self.exch_label.setText("Automobile Code")
58
+ self.field4.setAccessibleName("Received Exchange")
59
+
60
+
61
+ def reset_label(self): # pylint: disable=unused-argument
62
+ """reset label after field cleared"""
63
+
64
+
65
+ def set_tab_next(self):
66
+ """Set TAB Advances"""
67
+ self.tab_next = {
68
+ self.callsign: self.sent,
69
+ self.sent: self.receive,
70
+ self.receive: self.other_2,
71
+ self.other_1: self.other_2,
72
+ self.other_2: self.callsign,
73
+ }
74
+
75
+
76
+ def set_tab_prev(self):
77
+ """Set TAB Advances"""
78
+ self.tab_prev = {
79
+ self.callsign: self.other_2,
80
+ self.sent: self.callsign,
81
+ self.receive: self.sent,
82
+ self.other_1: self.receive,
83
+ self.other_2: self.receive,
84
+ }
85
+
86
+
87
+ def set_contact_vars(self):
88
+ """Contest Specific"""
89
+ self.contact["SNT"] = self.sent.text()
90
+ self.contact["RCV"] = self.receive.text()
91
+ self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
92
+ self.contact["Exchange1"] = self.other_2.text()
93
+ self.contact["IsMultiplier1"] = 0
94
+
95
+
96
+ def predupe(self): # pylint: disable=unused-argument
97
+ """called after callsign entered"""
98
+
99
+
100
+ def prefill(self):
101
+ """Fill SentNR"""
102
+
103
+
104
+ def points(self) -> int:
105
+ """Calc point"""
106
+
107
+ # a . QSOs/HRDs in CW are worth 3 points;
108
+ # b. QSOs/HRDs in RTTY are worth 2 points;
109
+ # c. QSOs/HRDs in SSB are worth 1 point.
110
+
111
+ if self.contact_is_dupe > 0:
112
+ return 0
113
+
114
+ _mode = self.contact.get("Mode", "")
115
+ if _mode in "SSB, USB, LSB, FM, AM":
116
+ return 1
117
+ if _mode in "RTTY":
118
+ return 2
119
+ if _mode in "CW":
120
+ return 3
121
+ return 0
122
+
123
+
124
+ def show_mults(self):
125
+ """Return display string for mults"""
126
+ query = f"select count(DISTINCT(Exchange1 || ':' || Mode || ':' || Band)) as mult_count from dxlog where ContestNR = {self.pref.get('contest', '1')};"
127
+
128
+ result = self.database.exec_sql(query)
129
+ if result:
130
+ return int(result.get("mult_count", 0))
131
+ return 0
132
+
133
+
134
+ def show_qso(self):
135
+ """Return qso count"""
136
+ result = self.database.fetch_qso_count()
137
+ if result:
138
+ return int(result.get("qsos", 0))
139
+ return 0
140
+
141
+
142
+ def calc_score(self):
143
+ """Return calculated score"""
144
+ result = self.database.fetch_points()
145
+ if result is not None:
146
+ score = result.get("Points", "0")
147
+ if score is None:
148
+ score = "0"
149
+ contest_points = int(score)
150
+ mults = int(show_mults(self))
151
+ return contest_points * mults
152
+ return 0
153
+
154
+
155
+ def adif(self):
156
+ """Call the generate ADIF function"""
157
+ gen_adif(self, cabrillo_name, cabrillo_name)
158
+
159
+
160
+ def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
161
+ """"""
162
+ print(
163
+ line_to_output.encode(file_encoding, errors="ignore").decode(),
164
+ end=ending,
165
+ file=file_descriptor,
166
+ )
167
+
168
+
169
+ def cabrillo(self, file_encoding):
170
+ """Generates Cabrillo file. Maybe."""
171
+ # https://www.cw160.com/cabrillo.htm
172
+ logger.debug("******Cabrillo*****")
173
+ logger.debug("Station: %s", f"{self.station}")
174
+ logger.debug("Contest: %s", f"{self.contest_settings}")
175
+ now = datetime.datetime.now()
176
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
177
+ filename = (
178
+ str(Path.home())
179
+ + "/"
180
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
181
+ )
182
+ logger.debug("%s", filename)
183
+ log = self.database.fetch_all_contacts_asc()
184
+ try:
185
+ with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
186
+ output_cabrillo_line(
187
+ "START-OF-LOG: 3.0",
188
+ "\r\n",
189
+ file_descriptor,
190
+ file_encoding,
191
+ )
192
+ output_cabrillo_line(
193
+ f"CREATED-BY: Not1MM v{__version__}",
194
+ "\r\n",
195
+ file_descriptor,
196
+ file_encoding,
197
+ )
198
+ output_cabrillo_line(
199
+ f"CONTEST: {cabrillo_name}",
200
+ "\r\n",
201
+ file_descriptor,
202
+ file_encoding,
203
+ )
204
+ if self.station.get("Club", ""):
205
+ output_cabrillo_line(
206
+ f"CLUB: {self.station.get('Club', '').upper()}",
207
+ "\r\n",
208
+ file_descriptor,
209
+ file_encoding,
210
+ )
211
+ output_cabrillo_line(
212
+ f"CALLSIGN: {self.station.get('Call','')}",
213
+ "\r\n",
214
+ file_descriptor,
215
+ file_encoding,
216
+ )
217
+ output_cabrillo_line(
218
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
219
+ "\r\n",
220
+ file_descriptor,
221
+ file_encoding,
222
+ )
223
+ output_cabrillo_line(
224
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
225
+ "\r\n",
226
+ file_descriptor,
227
+ file_encoding,
228
+ )
229
+ output_cabrillo_line(
230
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
231
+ "\r\n",
232
+ file_descriptor,
233
+ file_encoding,
234
+ )
235
+ output_cabrillo_line(
236
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
237
+ "\r\n",
238
+ file_descriptor,
239
+ file_encoding,
240
+ )
241
+ mode = self.contest_settings.get("ModeCategory", "")
242
+ if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
243
+ mode = "MIXED"
244
+ output_cabrillo_line(
245
+ f"CATEGORY-MODE: {mode}",
246
+ "\r\n",
247
+ file_descriptor,
248
+ file_encoding,
249
+ )
250
+ output_cabrillo_line(
251
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
252
+ "\r\n",
253
+ file_descriptor,
254
+ file_encoding,
255
+ )
256
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
257
+ output_cabrillo_line(
258
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
259
+ "\r\n",
260
+ file_descriptor,
261
+ file_encoding,
262
+ )
263
+ output_cabrillo_line(
264
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
265
+ "\r\n",
266
+ file_descriptor,
267
+ file_encoding,
268
+ )
269
+ output_cabrillo_line(
270
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
271
+ "\r\n",
272
+ file_descriptor,
273
+ file_encoding,
274
+ )
275
+
276
+ output_cabrillo_line(
277
+ f"CLAIMED-SCORE: {calc_score(self)}",
278
+ "\r\n",
279
+ file_descriptor,
280
+ file_encoding,
281
+ )
282
+ ops = f"@{self.station.get('Call','')}"
283
+ list_of_ops = self.database.get_ops()
284
+ for op in list_of_ops:
285
+ ops += f", {op.get('Operator', '')}"
286
+ output_cabrillo_line(
287
+ f"OPERATORS: {ops}",
288
+ "\r\n",
289
+ file_descriptor,
290
+ file_encoding,
291
+ )
292
+ output_cabrillo_line(
293
+ f"NAME: {self.station.get('Name', '')}",
294
+ "\r\n",
295
+ file_descriptor,
296
+ file_encoding,
297
+ )
298
+ output_cabrillo_line(
299
+ f"ADDRESS: {self.station.get('Street1', '')}",
300
+ "\r\n",
301
+ file_descriptor,
302
+ file_encoding,
303
+ )
304
+ output_cabrillo_line(
305
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
306
+ "\r\n",
307
+ file_descriptor,
308
+ file_encoding,
309
+ )
310
+ output_cabrillo_line(
311
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
312
+ "\r\n",
313
+ file_descriptor,
314
+ file_encoding,
315
+ )
316
+ output_cabrillo_line(
317
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
318
+ "\r\n",
319
+ file_descriptor,
320
+ file_encoding,
321
+ )
322
+ output_cabrillo_line(
323
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
324
+ "\r\n",
325
+ file_descriptor,
326
+ file_encoding,
327
+ )
328
+ output_cabrillo_line(
329
+ f"EMAIL: {self.station.get('Email', '')}",
330
+ "\r\n",
331
+ file_descriptor,
332
+ file_encoding,
333
+ )
334
+ for contact in log:
335
+ the_date_and_time = contact.get("TS", "")
336
+ themode = contact.get("Mode", "")
337
+ if themode == "LSB" or themode == "USB":
338
+ themode = "PH"
339
+ if themode == "RTTY":
340
+ themode = "RY"
341
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
342
+
343
+ loggeddate = the_date_and_time[:10]
344
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
345
+ output_cabrillo_line(
346
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
347
+ f"{contact.get('StationPrefix', '').ljust(13)} "
348
+ f"{str(contact.get('SNT', '')).ljust(3)} "
349
+ f"{str(contact.get('SentNr', '')).upper().ljust(6)} "
350
+ f"{contact.get('Call', '').ljust(13)} "
351
+ f"{str(contact.get('RCV', '')).ljust(3)} "
352
+ f"{str(contact.get('Exchange1', '')).upper().ljust(6)}",
353
+ "\r\n",
354
+ file_descriptor,
355
+ file_encoding,
356
+ )
357
+ output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
358
+ self.show_message_box(f"Cabrillo saved to: {filename}")
359
+ except IOError as exception:
360
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
361
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
362
+ return
363
+
364
+
365
+ def trigger_update(self):
366
+ """Triggers the log window to update."""
367
+ cmd = {}
368
+ cmd["cmd"] = "UPDATELOG"
369
+ if self.log_window:
370
+ self.log_window.msg_from_main(cmd)
371
+
372
+
373
+ def recalculate_mults(self):
374
+ """Recalculates multipliers after change in logged qso."""
375
+
376
+
377
+ def process_esm(self, new_focused_widget=None, with_enter=False):
378
+ """ESM State Machine"""
379
+
380
+ # self.pref["run_state"]
381
+
382
+ # -----===== Assigned F-Keys =====-----
383
+ # self.esm_dict["CQ"]
384
+ # self.esm_dict["EXCH"]
385
+ # self.esm_dict["QRZ"]
386
+ # self.esm_dict["AGN"]
387
+ # self.esm_dict["HISCALL"]
388
+ # self.esm_dict["MYCALL"]
389
+ # self.esm_dict["QSOB4"]
390
+
391
+ # ----==== text fields ====----
392
+ # self.callsign
393
+ # self.sent
394
+ # self.receive
395
+ # self.other_1
396
+ # self.other_2
397
+
398
+ if new_focused_widget is not None:
399
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
400
+
401
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
402
+
403
+ for a_button in [
404
+ self.esm_dict["CQ"],
405
+ self.esm_dict["EXCH"],
406
+ self.esm_dict["QRZ"],
407
+ self.esm_dict["AGN"],
408
+ self.esm_dict["HISCALL"],
409
+ self.esm_dict["MYCALL"],
410
+ self.esm_dict["QSOB4"],
411
+ ]:
412
+ if a_button is not None:
413
+ self.restore_button_color(a_button)
414
+
415
+ buttons_to_send = []
416
+
417
+ if self.pref.get("run_state"):
418
+ if self.current_widget == "callsign":
419
+ if len(self.callsign.text()) < 3:
420
+ self.make_button_green(self.esm_dict["CQ"])
421
+ buttons_to_send.append(self.esm_dict["CQ"])
422
+ elif len(self.callsign.text()) > 2:
423
+ self.make_button_green(self.esm_dict["HISCALL"])
424
+ self.make_button_green(self.esm_dict["EXCH"])
425
+ buttons_to_send.append(self.esm_dict["HISCALL"])
426
+ buttons_to_send.append(self.esm_dict["EXCH"])
427
+
428
+ elif self.current_widget in ["other_2"]:
429
+ if self.other_2.text() == "":
430
+ self.make_button_green(self.esm_dict["AGN"])
431
+ buttons_to_send.append(self.esm_dict["AGN"])
432
+ else:
433
+ self.make_button_green(self.esm_dict["QRZ"])
434
+ buttons_to_send.append(self.esm_dict["QRZ"])
435
+ buttons_to_send.append("LOGIT")
436
+
437
+ if with_enter is True and bool(len(buttons_to_send)):
438
+ for button in buttons_to_send:
439
+ if button:
440
+ if button == "LOGIT":
441
+ self.save_contact()
442
+ continue
443
+ self.process_function_key(button)
444
+ else:
445
+ if self.current_widget == "callsign":
446
+ if len(self.callsign.text()) > 2:
447
+ self.make_button_green(self.esm_dict["MYCALL"])
448
+ buttons_to_send.append(self.esm_dict["MYCALL"])
449
+
450
+ elif self.current_widget in ["other_2"]:
451
+ if self.other_2.text() == "":
452
+ self.make_button_green(self.esm_dict["AGN"])
453
+ buttons_to_send.append(self.esm_dict["AGN"])
454
+ else:
455
+ self.make_button_green(self.esm_dict["EXCH"])
456
+ buttons_to_send.append(self.esm_dict["EXCH"])
457
+ buttons_to_send.append("LOGIT")
458
+
459
+ if with_enter is True and bool(len(buttons_to_send)):
460
+ for button in buttons_to_send:
461
+ if button:
462
+ if button == "LOGIT":
463
+ self.save_contact()
464
+ continue
465
+ self.process_function_key(button)
466
+
467
+
468
+ def populate_history_info_line(self):
469
+ result = self.database.fetch_call_history(self.callsign.text())
470
+ if result:
471
+ self.history_info.setText(f"{result.get('Call', '')}, {result.get('Sect', '')}")
472
+ else:
473
+ self.history_info.setText("")
474
+
475
+
476
+ def check_call_history(self):
477
+ """"""
478
+ result = self.database.fetch_call_history(self.callsign.text())
479
+ if result:
480
+ self.history_info.setText(f"{result.get('UserText','')}")
481
+ if self.other_2.text() == "":
482
+ self.other_2.setText(f"{result.get('Sect', '')}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.4.9
3
+ Version: 25.4.10.1
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -250,6 +250,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
250
250
 
251
251
  ## Recent Changes
252
252
 
253
+ - [25-4-10-1] Add ARI 40/80 contest. Add Auto CQ visual indicator. Add CTRL-R to toggle Run state.
254
+ - [25-4-10] Add Auto CQ visual indicator.
253
255
  - [25-4-9] Added UKEI DX
254
256
  - [25-4-8] Remove focus from statistics table widget.
255
257
  - [25-4-7] Merge in changes from dj1yfk correcting SPDX Cabrillo name.
@@ -664,9 +666,13 @@ pressing F1 - F12. See next section on Editing macro keys.
664
666
  ### Auto CQ
665
667
 
666
668
  If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
667
- after each Auto CQ Delay interval has passed. The delay can be changed by going to the
668
- `Options` TAB in the Configuration dialog. If you are in S&P mode, you will be automatically
669
- switched into RUN mode.
669
+ after each Auto CQ Delay interval has passed. An indicator will appear to the upper left of
670
+ the F1 macro key as a visual reminder that your Auto CQ is active.
671
+
672
+ ![Auto CQ Visual Indicator](https://github.com/mbridak/not1mm/raw/master/pic/auto_cq_indicator.png)
673
+
674
+ The delay can be changed by going to the `Options` TAB in the Configuration dialog. If you are in
675
+ S&P mode when you enable Auto CQ, you will be automatically switched into RUN mode.
670
676
 
671
677
  The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
672
678
 
@@ -773,6 +779,7 @@ is this has happened, since the gridsquare will replace the word "Regional".
773
779
  | [SPACE] | When in the callsign field, will move the input to the first field needed for the exchange. |
774
780
  | [Enter] | Submits the fields to the log. Unless ESM is enabled. |
775
781
  | [F1-F12] | Send (CW/RTTY/Voice) macros. |
782
+ | [CTRL-R] | Toggle between Run and S&P modes. |
776
783
  | [CTRL-S] | Spot Callsign to the cluster. |
777
784
  | [CTRL-M] | Mark Callsign to the bandmap window to work later. |
778
785
  | [CTRL-G] | Tune to a spot matching partial text in the callsign entry field (CAT Required). |
@@ -1,5 +1,5 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=tFLfbd7kbc4GiR4RKYK3F4DKnohI1SBIiKMsjw67--E,151892
2
+ not1mm/__main__.py,sha256=M3AByjOQQN42Frgo-FHfXS1mkXpYpRbRW1LBmrMEJbM,152417
3
3
  not1mm/bandmap.py,sha256=-zu5slsuAm2GmeW8g3yvURzsuQxemwIQfw1HEq8xKHM,29920
4
4
  not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
@@ -26,7 +26,7 @@ not1mm/data/cwmacros.txt,sha256=NztufsX6R52gAO7VyJ2AHr7wOh41pJTwHKh5Lcs32ds,468
26
26
  not1mm/data/donors.html,sha256=0NEh7eu9Dsfv1Gy0_f6UMp4ZjVjm7OgoQJEQd-4whoU,267
27
27
  not1mm/data/editcontact.ui,sha256=TNOsXETYfDaON4wj6AkzCJ-n2SmbNRO2-g2SLl5m8s0,27437
28
28
  not1mm/data/editmacro.ui,sha256=Vg-S62ogKYcWlDDlza_JYyZkCQfa8mCfF-cFqpBej-w,2700
29
- not1mm/data/greendot.png,sha256=6h6KFMj5mmu07ppPWXXewH0PLAvbOOre-5z6rpzWLLo,474
29
+ not1mm/data/greendot.png,sha256=El9TomJcGtViRcHOR7kMxGzjzvYs0TSAqOb3tZv0JDA,368
30
30
  not1mm/data/k6gte-not1mm.desktop,sha256=dUi-YbHbavOsL3A29eglDQ0p1_cSKzJeEGQ52Qv_eKo,243
31
31
  not1mm/data/k6gte.not1mm-128.png,sha256=ZP93MfRqr4WwsFCwg1m5MZjLs8bG895vDW9DDDn1B_Q,6076
32
32
  not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcCac,1526
@@ -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=DNJ7jK_1Dd9SDiiGbdwvXDA0WEKjApdRKqBPYFt7S3c,63737
37
- not1mm/data/new_contest.ui,sha256=-EMhmysI9hq3HbMv-SH8bJGzsiW0wOhmRE2iOjqxFQ0,24806
37
+ not1mm/data/new_contest.ui,sha256=U_6Ig7aKpnU8aivuw48kWG6CRn6s4Kcf652154WlMBg,24912
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,13 +118,14 @@ 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=mXffn8Xaj5KATPQinNBR0V5DbHWQPsRfh24_axWGYuk,15254
120
120
  not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
121
- not1mm/lib/version.py,sha256=lbRD-owMDb7rKcR3mQWVmU6ChK_06HlEYDAkRCUHqd8,48
121
+ not1mm/lib/version.py,sha256=zqvGkzvASjvvdsqMsiERQLKrRomu4JV0biAowKaXgMk,50
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
125
125
  not1mm/plugins/10_10_summer_phone.py,sha256=NWWT5YTZN6CkPl5Jy4lCuTqHd1R_JodhsOLqCoGOzdU,14896
126
126
  not1mm/plugins/10_10_winter_phone.py,sha256=4xoWLbnE2di5XnUUlhsvTR__E0Z4kbhu-rcUitPMR0U,14795
127
127
  not1mm/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ not1mm/plugins/ari_40_80.py,sha256=_CaUWEo0zJONXvxPqJKyqmStJezqxEsNxOnEdSLmxzY,15333
128
129
  not1mm/plugins/arrl_10m.py,sha256=9p7EX2vAXVilF8y6AYHG4fXczU6g9QuMA2Pvj64pSXE,18389
129
130
  not1mm/plugins/arrl_160m.py,sha256=rdWDhmPN0h9ADTlYaRLk-5j8KVye0rUEs1tyD-kfHV0,20300
130
131
  not1mm/plugins/arrl_dx_cw.py,sha256=Bx6_PBmTHKf4l52XwLFVeR2y6F134kXbGTfEXC_1agk,18890
@@ -175,9 +176,9 @@ not1mm/plugins/stew_perry_topband.py,sha256=3U-Dr28haBTqTaZWLiC1qHQBmLsLENDL-ihy
175
176
  not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,19105
176
177
  not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
177
178
  not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
178
- not1mm-25.4.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
179
- not1mm-25.4.9.dist-info/METADATA,sha256=Lrk0LmsoyTv2hyw5_Kl8yGDeWZkyPe6hMnYbGF2WSw8,37550
180
- not1mm-25.4.9.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
181
- not1mm-25.4.9.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
182
- not1mm-25.4.9.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
183
- not1mm-25.4.9.dist-info/RECORD,,
179
+ not1mm-25.4.10.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
180
+ not1mm-25.4.10.1.dist-info/METADATA,sha256=llXLhCzn7vFSrIvs2gIBBQ2VQ7oIPCJiz1LzP5wGP1A,37982
181
+ not1mm-25.4.10.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
182
+ not1mm-25.4.10.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
183
+ not1mm-25.4.10.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
184
+ not1mm-25.4.10.1.dist-info/RECORD,,