not1mm 24.11.24__py3-none-any.whl → 24.12.3.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.
@@ -490,11 +490,102 @@ def ft8_handler(the_packet: dict):
490
490
  ALTEREGO.save_contact()
491
491
 
492
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
+
493
584
  def populate_history_info_line(self):
494
585
  result = self.database.fetch_call_history(self.callsign.text())
495
586
  if result:
496
587
  self.history_info.setText(
497
- f"{result.get('Call', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
588
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
498
589
  )
499
590
  else:
500
591
  self.history_info.setText("")
@@ -490,11 +490,102 @@ def ft8_handler(the_packet: dict):
490
490
  ALTEREGO.save_contact()
491
491
 
492
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
+
493
584
  def populate_history_info_line(self):
494
585
  result = self.database.fetch_call_history(self.callsign.text())
495
586
  if result:
496
587
  self.history_info.setText(
497
- f"{result.get('Call', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
588
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
498
589
  )
499
590
  else:
500
591
  self.history_info.setText("")
@@ -507,3 +598,6 @@ def check_call_history(self):
507
598
  self.history_info.setText(f"{result.get('UserText','')}")
508
599
  if self.other_2.text() == "":
509
600
  self.other_2.setText(f"{result.get('Loc1', '')}")
601
+
602
+
603
+ # !!Order!!,Call,Name,Loc1,UserText,
@@ -436,11 +436,102 @@ def recalculate_mults(self):
436
436
  trigger_update(self)
437
437
 
438
438
 
439
+ def process_esm(self, new_focused_widget=None, with_enter=False):
440
+ """ESM State Machine"""
441
+
442
+ # self.pref["run_state"]
443
+
444
+ # -----===== Assigned F-Keys =====-----
445
+ # self.esm_dict["CQ"]
446
+ # self.esm_dict["EXCH"]
447
+ # self.esm_dict["QRZ"]
448
+ # self.esm_dict["AGN"]
449
+ # self.esm_dict["HISCALL"]
450
+ # self.esm_dict["MYCALL"]
451
+ # self.esm_dict["QSOB4"]
452
+
453
+ # ----==== text fields ====----
454
+ # self.callsign
455
+ # self.sent
456
+ # self.receive
457
+ # self.other_1
458
+ # self.other_2
459
+
460
+ if new_focused_widget is not None:
461
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
462
+
463
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
464
+
465
+ for a_button in [
466
+ self.esm_dict["CQ"],
467
+ self.esm_dict["EXCH"],
468
+ self.esm_dict["QRZ"],
469
+ self.esm_dict["AGN"],
470
+ self.esm_dict["HISCALL"],
471
+ self.esm_dict["MYCALL"],
472
+ self.esm_dict["QSOB4"],
473
+ ]:
474
+ if a_button is not None:
475
+ self.restore_button_color(a_button)
476
+
477
+ buttons_to_send = []
478
+
479
+ if self.pref.get("run_state"):
480
+ if self.current_widget == "callsign":
481
+ if len(self.callsign.text()) < 3:
482
+ self.make_button_green(self.esm_dict["CQ"])
483
+ buttons_to_send.append(self.esm_dict["CQ"])
484
+ elif len(self.callsign.text()) > 2:
485
+ self.make_button_green(self.esm_dict["HISCALL"])
486
+ self.make_button_green(self.esm_dict["EXCH"])
487
+ buttons_to_send.append(self.esm_dict["HISCALL"])
488
+ buttons_to_send.append(self.esm_dict["EXCH"])
489
+
490
+ elif self.current_widget in ["other_2"]:
491
+ if self.other_2.text() == "":
492
+ self.make_button_green(self.esm_dict["AGN"])
493
+ buttons_to_send.append(self.esm_dict["AGN"])
494
+ else:
495
+ self.make_button_green(self.esm_dict["QRZ"])
496
+ buttons_to_send.append(self.esm_dict["QRZ"])
497
+ buttons_to_send.append("LOGIT")
498
+
499
+ if with_enter is True and bool(len(buttons_to_send)):
500
+ for button in buttons_to_send:
501
+ if button:
502
+ if button == "LOGIT":
503
+ self.save_contact()
504
+ continue
505
+ self.process_function_key(button)
506
+ else:
507
+ if self.current_widget == "callsign":
508
+ if len(self.callsign.text()) > 2:
509
+ self.make_button_green(self.esm_dict["MYCALL"])
510
+ buttons_to_send.append(self.esm_dict["MYCALL"])
511
+
512
+ elif self.current_widget in ["other_2"]:
513
+ if self.other_2.text() == "":
514
+ self.make_button_green(self.esm_dict["AGN"])
515
+ buttons_to_send.append(self.esm_dict["AGN"])
516
+ else:
517
+ self.make_button_green(self.esm_dict["EXCH"])
518
+ buttons_to_send.append(self.esm_dict["EXCH"])
519
+ buttons_to_send.append("LOGIT")
520
+
521
+ if with_enter is True and bool(len(buttons_to_send)):
522
+ for button in buttons_to_send:
523
+ if button:
524
+ if button == "LOGIT":
525
+ self.save_contact()
526
+ continue
527
+ self.process_function_key(button)
528
+
529
+
439
530
  def populate_history_info_line(self):
440
531
  result = self.database.fetch_call_history(self.callsign.text())
441
532
  if result:
442
533
  self.history_info.setText(
443
- f"{result.get('Call', '')}, {result.get('UserText','...')}"
534
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('State', '')}, {result.get('UserText','...')}"
444
535
  )
445
536
  else:
446
537
  self.history_info.setText("")
@@ -451,7 +542,5 @@ def check_call_history(self):
451
542
  result = self.database.fetch_call_history(self.callsign.text())
452
543
  if result:
453
544
  self.history_info.setText(f"{result.get('UserText','')}")
454
- # if self.other_1.text() == "":
455
- # self.other_1.setText(f"{result.get('CQZone', '')}")
456
- # if self.other_2.text() == "":
457
- # self.other_2.setText(f"{result.get('State', '')}")
545
+ if self.other_2.text() == "":
546
+ self.other_2.setText(f"{result.get('State', '')}")
@@ -436,11 +436,102 @@ def recalculate_mults(self):
436
436
  trigger_update(self)
437
437
 
438
438
 
439
+ def process_esm(self, new_focused_widget=None, with_enter=False):
440
+ """ESM State Machine"""
441
+
442
+ # self.pref["run_state"]
443
+
444
+ # -----===== Assigned F-Keys =====-----
445
+ # self.esm_dict["CQ"]
446
+ # self.esm_dict["EXCH"]
447
+ # self.esm_dict["QRZ"]
448
+ # self.esm_dict["AGN"]
449
+ # self.esm_dict["HISCALL"]
450
+ # self.esm_dict["MYCALL"]
451
+ # self.esm_dict["QSOB4"]
452
+
453
+ # ----==== text fields ====----
454
+ # self.callsign
455
+ # self.sent
456
+ # self.receive
457
+ # self.other_1
458
+ # self.other_2
459
+
460
+ if new_focused_widget is not None:
461
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
462
+
463
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
464
+
465
+ for a_button in [
466
+ self.esm_dict["CQ"],
467
+ self.esm_dict["EXCH"],
468
+ self.esm_dict["QRZ"],
469
+ self.esm_dict["AGN"],
470
+ self.esm_dict["HISCALL"],
471
+ self.esm_dict["MYCALL"],
472
+ self.esm_dict["QSOB4"],
473
+ ]:
474
+ if a_button is not None:
475
+ self.restore_button_color(a_button)
476
+
477
+ buttons_to_send = []
478
+
479
+ if self.pref.get("run_state"):
480
+ if self.current_widget == "callsign":
481
+ if len(self.callsign.text()) < 3:
482
+ self.make_button_green(self.esm_dict["CQ"])
483
+ buttons_to_send.append(self.esm_dict["CQ"])
484
+ elif len(self.callsign.text()) > 2:
485
+ self.make_button_green(self.esm_dict["HISCALL"])
486
+ self.make_button_green(self.esm_dict["EXCH"])
487
+ buttons_to_send.append(self.esm_dict["HISCALL"])
488
+ buttons_to_send.append(self.esm_dict["EXCH"])
489
+
490
+ elif self.current_widget in ["other_2"]:
491
+ if self.other_2.text() == "":
492
+ self.make_button_green(self.esm_dict["AGN"])
493
+ buttons_to_send.append(self.esm_dict["AGN"])
494
+ else:
495
+ self.make_button_green(self.esm_dict["QRZ"])
496
+ buttons_to_send.append(self.esm_dict["QRZ"])
497
+ buttons_to_send.append("LOGIT")
498
+
499
+ if with_enter is True and bool(len(buttons_to_send)):
500
+ for button in buttons_to_send:
501
+ if button:
502
+ if button == "LOGIT":
503
+ self.save_contact()
504
+ continue
505
+ self.process_function_key(button)
506
+ else:
507
+ if self.current_widget == "callsign":
508
+ if len(self.callsign.text()) > 2:
509
+ self.make_button_green(self.esm_dict["MYCALL"])
510
+ buttons_to_send.append(self.esm_dict["MYCALL"])
511
+
512
+ elif self.current_widget in ["other_2"]:
513
+ if self.other_2.text() == "":
514
+ self.make_button_green(self.esm_dict["AGN"])
515
+ buttons_to_send.append(self.esm_dict["AGN"])
516
+ else:
517
+ self.make_button_green(self.esm_dict["EXCH"])
518
+ buttons_to_send.append(self.esm_dict["EXCH"])
519
+ buttons_to_send.append("LOGIT")
520
+
521
+ if with_enter is True and bool(len(buttons_to_send)):
522
+ for button in buttons_to_send:
523
+ if button:
524
+ if button == "LOGIT":
525
+ self.save_contact()
526
+ continue
527
+ self.process_function_key(button)
528
+
529
+
439
530
  def populate_history_info_line(self):
440
531
  result = self.database.fetch_call_history(self.callsign.text())
441
532
  if result:
442
533
  self.history_info.setText(
443
- f"{result.get('Call', '')}, {result.get('UserText','...')}"
534
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('State', '')}, {result.get('UserText','...')}"
444
535
  )
445
536
  else:
446
537
  self.history_info.setText("")
@@ -451,7 +542,5 @@ def check_call_history(self):
451
542
  result = self.database.fetch_call_history(self.callsign.text())
452
543
  if result:
453
544
  self.history_info.setText(f"{result.get('UserText','')}")
454
- # if self.other_1.text() == "":
455
- # self.other_1.setText(f"{result.get('CQZone', '')}")
456
- # if self.other_2.text() == "":
457
- # self.other_2.setText(f"{result.get('State', '')}")
545
+ if self.other_2.text() == "":
546
+ self.other_2.setText(f"{result.get('State', '')}")
@@ -154,17 +154,26 @@ def points(self):
154
154
  mycountry = item[1].get("entity", "")
155
155
  mycontinent = item[1].get("continent", "")
156
156
  result = self.cty_lookup(self.contact.get("Call", ""))
157
+
157
158
  if result:
158
159
  for item in result.items():
159
160
  entity = item[1].get("entity", "")
160
161
  continent = item[1].get("continent", "")
161
- if mycountry.upper() == entity.upper():
162
- return 0
163
- if mycontinent and continent == "NA":
162
+
163
+ # Contacts between stations on different continents count three (3) points.
164
+ if mycontinent != continent:
165
+ return 3
166
+
167
+ # Exception: Contacts between stations in different countries within the North American boundaries count two (2) points.
168
+ if (mycontinent == "NA" and continent == "NA") and mycountry != entity:
164
169
  return 2
165
- if mycontinent == continent:
170
+
171
+ # Contacts between stations on the same continent but in different countries count one (1) point.
172
+ if mycountry.upper() != entity.upper():
166
173
  return 1
167
- return 3
174
+
175
+ # Contacts between stations in the same country have zero (0) QSO point value, but count for zone and country multiplier credit.
176
+
168
177
  return 0
169
178
 
170
179
 
@@ -149,13 +149,21 @@ def points(self):
149
149
  for item in result.items():
150
150
  entity = item[1].get("entity", "")
151
151
  continent = item[1].get("continent", "")
152
- if mycountry.upper() == entity.upper():
153
- return 0
154
- if mycontinent and continent == "NA":
152
+
153
+ # Contacts between stations on different continents count three (3) points.
154
+ if mycontinent != continent:
155
+ return 3
156
+
157
+ # Exception: Contacts between stations in different countries within the North American boundaries count two (2) points.
158
+ if (mycontinent == "NA" and continent == "NA") and mycountry != entity:
155
159
  return 2
156
- if mycontinent == continent:
160
+
161
+ # Contacts between stations on the same continent but in different countries count one (1) point.
162
+ if mycountry.upper() != entity.upper():
157
163
  return 1
158
- return 3
164
+
165
+ # Contacts between stations in the same country have zero (0) QSO point value, but count for zone and country multiplier credit.
166
+
159
167
  return 0
160
168
 
161
169
 
not1mm/radio.py CHANGED
@@ -27,8 +27,8 @@ class Radio(QObject):
27
27
  vfoa = "14030000"
28
28
  mode = "CW"
29
29
  bw = "500"
30
- delta = 1
31
- poll_time = datetime.datetime.now() + datetime.timedelta(seconds=delta)
30
+ delta = 500
31
+ poll_time = datetime.datetime.now() + datetime.timedelta(milliseconds=delta)
32
32
  time_to_quit = False
33
33
  online = False
34
34
  interface = None
@@ -72,7 +72,7 @@ class Radio(QObject):
72
72
  while not self.time_to_quit:
73
73
  if datetime.datetime.now() > self.poll_time:
74
74
  self.poll_time = datetime.datetime.now() + datetime.timedelta(
75
- seconds=self.delta
75
+ milliseconds=self.delta
76
76
  )
77
77
  vfoa = self.cat.get_vfo()
78
78
  self.online = False
@@ -102,7 +102,8 @@ class Radio(QObject):
102
102
  )
103
103
  except QEventLoop:
104
104
  ...
105
- QThread.msleep(100)
105
+ # QThread.msleep(int(self.delta / 2))
106
+ QThread.msleep(1)
106
107
 
107
108
  def store_last_data_mode(self, the_mode: str = ""):
108
109
  """if the last mode is a data mode, save it."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.11.24
3
+ Version: 24.12.3.1
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
@@ -57,7 +57,7 @@ Requires-Dist: Levenshtein
57
57
  - [Data and RTTY](#data-and-rtty)
58
58
  - [Other not so supported contests](#other-not-so-supported-contests)
59
59
  - [Our Code Contributors ✨](#our-code-contributors-)
60
- - [List of should be working contests, those in bold have ESM](#list-of-should-be-working-contests-those-in-bold-have-esm)
60
+ - [List of should be working contests](#list-of-should-be-working-contests)
61
61
  - [Recent Changes (Polishing the Turd)](#recent-changes-polishing-the-turd)
62
62
  - [Flatpak](#flatpak)
63
63
  - [Installation](#installation)
@@ -203,55 +203,43 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
203
203
  <img src="https://contrib.rocks/image?repo=mbridak/not1mm" alt="Avatar icons for code contributors." />
204
204
  </a>
205
205
 
206
- ## List of should be working contests, those in bold have ESM
206
+ ## List of should be working contests
207
207
 
208
- - **General Logging** (There are better general loggers like QLog, KLog, CQRLog)
208
+ - General Logging (There are better general loggers like QLog, KLog, CQRLog)
209
209
  - 10 10 Fall CW
210
210
  - 10 10 Spring CW
211
211
  - 10 10 Summer Phone
212
212
  - 10 10 Winter Phone
213
213
  - ARRL 10M
214
- - **ARRL DX CW, SSB**
215
- - **ARRL Field Day**
216
- - **ARRL Sweepstakes CW, SSB**
214
+ - ARRL DX CW, SSB
215
+ - ARRL Field Day
216
+ - ARRL Sweepstakes CW, SSB
217
217
  - ARRL VHF January, June, September
218
218
  - CQ 160 CW, SSB
219
- - **CQ WPX CW, RTTY, SSB**
220
- - **CQ World Wide CW, RTTY, SSB**
221
- - **CWOps CWT**
222
- - **DARC Xmas**
223
- - **Helvetia**
224
- - **IARU Fieldday R1 CW, SSB**
225
- - **IARU HF**
226
- - **ICWC MST**
227
- - **Japan International DX CW, SSB**
228
- - **K1USN Slow Speed Test**
229
- - **LZ DX**
230
- - **NAQP CW, RTTY, SSB**
231
- - **Phone Weekly Test**
232
- - **RAEM**
233
- - **RAC Canada Day**
234
- - **REF CW, SSB**
235
- - **Stew Perry Topband**
236
- - **Weekly RTTY**
237
- - **Winter Field Day**
219
+ - CQ WPX CW, RTTY, SSB
220
+ - CQ World Wide CW, RTTY, SSB
221
+ - CWOps CWT
222
+ - DARC Xmas
223
+ - Helvetia
224
+ - IARU Fieldday R1 CW, SSB
225
+ - IARU HF
226
+ - ICWC MST
227
+ - Japan International DX CW, SSB
228
+ - K1USN Slow Speed Test
229
+ - LZ DX
230
+ - NAQP CW, RTTY, SSB
231
+ - Phone Weekly Test
232
+ - RAEM
233
+ - RAC Canada Day
234
+ - REF CW, SSB
235
+ - Stew Perry Topband
236
+ - Weekly RTTY
237
+ - Winter Field Day
238
238
 
239
239
  ## Recent Changes (Polishing the Turd)
240
240
 
241
- - [24-11-24] Added ESM to IARU HF and FieldDay.
242
- - [24-11-23] Made macros per contest.
243
- - [24-11-21] Merged PR from alduhoo setting CW Speed via rigctld, Added ESM and call history support for General Logging.
244
- - [24-11-19] Added ESM to Stew Perry, Phone Weekly, Medium Speed Test and JIDX.
245
- - [24-11-18] Accepted PR from dg9vh for the DARC XMAS Contest.
246
- - [24-11-17] Accepted PR from dg9vh for the LZ DX contest.
247
- - [24-11-15] Made checkwindow font bigger and match a little more contrasted.
248
- - [24-11-12] add check for ipv4 address for CAT.
249
- - [24-11-10] ReJiggered CAT/flrig interface to hopefull make it more workable.
250
- - [24-11-6] Added Call history to ARRL VHF, CQ160, CQWW, StewPerry, Weekly RTTY
251
- - [24-11-5] Fix crash with bad qrz credentials.
252
- - [24-11-3-1] Fixed CWT ESM, Add Call History to CWT, Helvetia, WFD, NAQP, K1USN. Add ESM Helvetia.
253
- - [24-11-3] Added RAEM contest
254
- - [24-11-2] Add beginning of call history files. Add command buttons.
241
+ - [24-12-3-1] Adding ARRL 160
242
+ - [24-12-3] Add button to bandmap to delete marked spots.
255
243
 
256
244
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
257
245
 
@@ -744,8 +732,7 @@ is this has happened, since the gridsquare will replace the word "Regional".
744
732
 
745
733
  | Key | Result |
746
734
  | -------------- | --- |
747
- | [Esc] | Clears the input fields of any text. |
748
- | [CTRL-Esc] | Stops cwdaemon from sending Morse. |
735
+ | [Esc] | Stops cwdaemon from sending Morse. |
749
736
  | [PgUp] | Increases the cw sending speed. |
750
737
  | [PgDown] | Decreases the cw sending speed. |
751
738
  | [Arrow-Up] | Jump to the next spot above the current VFO cursor in the bandmap window (CAT Required). |
@@ -760,6 +747,7 @@ is this has happened, since the gridsquare will replace the word "Regional".
760
747
  | [CTRL-G] | Tune to a spot matching partial text in the callsign entry field (CAT Required). |
761
748
  | [CTRL-SHIFT-K] | Open CW text input field. |
762
749
  | [CTRL-=] | Log the contact without sending the ESM macros.|
750
+ | [CTRL-W] | Clears the input fields of any text. |
763
751
 
764
752
  ### The Log Window
765
753