not1mm 24.4.26__py3-none-any.whl → 24.4.30__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
@@ -38,7 +38,7 @@ except OSError as exception:
38
38
  import soundfile as sf
39
39
  from PyQt6 import QtCore, QtGui, QtWidgets, uic
40
40
  from PyQt6.QtCore import QDir, Qt, QThread
41
- from PyQt6.QtGui import QFontDatabase, QColorConstants
41
+ from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor
42
42
  from PyQt6.QtWidgets import QFileDialog
43
43
 
44
44
  from not1mm.lib.about import About
@@ -567,76 +567,50 @@ class MainWindow(QtWidgets.QMainWindow):
567
567
  """
568
568
  print(f"{result=}")
569
569
 
570
- def setDarkMode(self, dark):
571
- """testing"""
570
+ def setDarkMode(self, setdarkmode=False) -> None:
571
+ """Forces a darkmode palette."""
572
572
 
573
- logger.debug(f"Dark mode set to: {dark}")
573
+ logger.debug(f"Dark mode set to: {setdarkmode}")
574
574
 
575
575
  cmd = {}
576
576
  cmd["cmd"] = "DARKMODE"
577
- cmd["state"] = dark
577
+ cmd["state"] = setdarkmode
578
578
  cmd["station"] = platform.node()
579
579
  self.multicast_interface.send_as_json(cmd)
580
580
 
581
- if dark:
582
- darkPalette = QtGui.QPalette()
583
- darkColor = QtGui.QColor(56, 56, 56)
584
- disabledColor = QtGui.QColor(127, 127, 127)
585
- darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
581
+ if setdarkmode:
582
+ darkPalette = QPalette()
583
+ darkColor = QColor(56, 56, 56)
584
+ disabledColor = QColor(127, 127, 127)
585
+ darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
586
+ darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
587
+ darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
588
+ darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
589
+ darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
590
+ darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
591
+ darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
592
+ darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
593
+ darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
594
+ darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
586
595
  darkPalette.setColor(
587
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
596
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
588
597
  )
589
598
  darkPalette.setColor(
590
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
591
- )
592
- darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
593
- darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
594
- darkPalette.setColor(
595
- QtGui.QPalette.ColorGroup.Disabled,
596
- QtGui.QPalette.ColorRole.Text,
599
+ QPalette.ColorGroup.Disabled,
600
+ QPalette.ColorRole.ButtonText,
597
601
  disabledColor,
598
602
  )
599
- darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
600
- darkPalette.setColor(
601
- QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
602
- )
603
603
  darkPalette.setColor(
604
- QtGui.QPalette.ColorGroup.Disabled,
605
- QtGui.QPalette.ColorRole.ButtonText,
604
+ QPalette.ColorGroup.Disabled,
605
+ QPalette.ColorRole.HighlightedText,
606
606
  disabledColor,
607
607
  )
608
608
  darkPalette.setColor(
609
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
610
- )
611
- darkPalette.setColor(
612
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
613
- )
614
- darkPalette.setColor(
615
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
616
- )
617
- darkPalette.setColor(
618
- QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
619
- )
620
- darkPalette.setColor(
621
- QtGui.QPalette.ColorGroup.Disabled,
622
- QtGui.QPalette.ColorRole.HighlightedText,
609
+ QPalette.ColorGroup.Disabled,
610
+ QPalette.ColorRole.Text,
623
611
  disabledColor,
624
612
  )
625
- dark_button_style = (
626
- "QPushButton {"
627
- "background-color: rgb(56,56,56);"
628
- "color: white;"
629
- "border-style: outset;"
630
- "border-width: 2px;"
631
- "border-radius: 5px;"
632
- "border-color: rgb(45,45,45);"
633
- "padding: 6px;"
634
- "}"
635
- "QPushButton:pressed {"
636
- "background-color: rgb(127, 127, 127);"
637
- "border-style: inset;"
638
- "}"
639
- )
613
+
640
614
  self.current_palette = darkPalette
641
615
  self.setPalette(darkPalette)
642
616
  self.text_color = QColorConstants.White
@@ -651,18 +625,6 @@ class MainWindow(QtWidgets.QMainWindow):
651
625
  self.other_1.setPalette(darkPalette)
652
626
  self.other_2.setPalette(darkPalette)
653
627
  self.cw_entry.setPalette(darkPalette)
654
- self.F1.setStyleSheet(dark_button_style)
655
- self.F2.setStyleSheet(dark_button_style)
656
- self.F3.setStyleSheet(dark_button_style)
657
- self.F4.setStyleSheet(dark_button_style)
658
- self.F5.setStyleSheet(dark_button_style)
659
- self.F6.setStyleSheet(dark_button_style)
660
- self.F7.setStyleSheet(dark_button_style)
661
- self.F8.setStyleSheet(dark_button_style)
662
- self.F9.setStyleSheet(dark_button_style)
663
- self.F10.setStyleSheet(dark_button_style)
664
- self.F11.setStyleSheet(dark_button_style)
665
- self.F12.setStyleSheet(dark_button_style)
666
628
  else:
667
629
  palette = self.style().standardPalette()
668
630
  self.current_palette = palette
@@ -679,33 +641,6 @@ class MainWindow(QtWidgets.QMainWindow):
679
641
  self.other_2.setPalette(palette)
680
642
  self.cw_entry.setPalette(palette)
681
643
  self.text_color = QColorConstants.Black
682
- light_button_style = (
683
- "QPushButton {"
684
- "background-color: rgb(245,245,245);"
685
- "color: rgb(52,52,52);"
686
- "border-style: outset;"
687
- "border-width: 2px;"
688
- "border-radius: 5px;"
689
- "border-color: rgb(150,150,150);"
690
- "padding: 6px;"
691
- "}"
692
- "QPushButton:pressed {"
693
- "background-color: rgb(127, 127, 127);"
694
- "border-style: inset;"
695
- "}"
696
- )
697
- self.F1.setStyleSheet(light_button_style)
698
- self.F2.setStyleSheet(light_button_style)
699
- self.F3.setStyleSheet(light_button_style)
700
- self.F4.setStyleSheet(light_button_style)
701
- self.F5.setStyleSheet(light_button_style)
702
- self.F6.setStyleSheet(light_button_style)
703
- self.F7.setStyleSheet(light_button_style)
704
- self.F8.setStyleSheet(light_button_style)
705
- self.F9.setStyleSheet(light_button_style)
706
- self.F10.setStyleSheet(light_button_style)
707
- self.F11.setStyleSheet(light_button_style)
708
- self.F12.setStyleSheet(light_button_style)
709
644
 
710
645
  def set_radio_icon(self, state: int) -> None:
711
646
  """
@@ -770,7 +705,9 @@ class MainWindow(QtWidgets.QMainWindow):
770
705
  # self.send_backspace()
771
706
  self.oldtext = newtext
772
707
  return
773
- if self.cw is not None:
708
+ if self.pref.get("cwtype") == 3 and self.rig_control is not None:
709
+ self.rig_control.sendcw(newtext[len(self.oldtext) :])
710
+ elif self.cw is not None:
774
711
  self.cw.sendcw(newtext[len(self.oldtext) :])
775
712
  self.oldtext = newtext
776
713
 
@@ -2375,6 +2312,9 @@ class MainWindow(QtWidgets.QMainWindow):
2375
2312
  self.voice_string(self.process_macro(function_key.toolTip()))
2376
2313
  return
2377
2314
  if self.cw:
2315
+ if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2316
+ self.rig_control.sendcw(self.process_macro(function_key.toolTip()))
2317
+ return
2378
2318
  self.cw.sendcw(self.process_macro(function_key.toolTip()))
2379
2319
 
2380
2320
  def run_sp_buttons_clicked(self) -> None:
not1mm/bandmap.py CHANGED
@@ -17,7 +17,7 @@ from decimal import Decimal
17
17
  from json import loads
18
18
 
19
19
  from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
20
- from PyQt6.QtGui import QColorConstants
20
+ from PyQt6.QtGui import QColorConstants, QPalette, QColor
21
21
  from PyQt6.QtWidgets import QDockWidget
22
22
 
23
23
  import not1mm.fsutils as fsutils
@@ -319,7 +319,7 @@ class BandMapWindow(QDockWidget):
319
319
  bandwidth_mark = []
320
320
  worked_list = {}
321
321
  multicast_interface = None
322
- text_color = QtGui.QColor(45, 45, 45)
322
+ text_color = QColor(45, 45, 45)
323
323
 
324
324
  def __init__(self):
325
325
  super().__init__()
@@ -366,101 +366,50 @@ class BandMapWindow(QDockWidget):
366
366
  return loads(file_descriptor.read())
367
367
 
368
368
  def setDarkMode(self, setdarkmode=False):
369
- """testing"""
370
-
369
+ """Set dark mode"""
371
370
  if setdarkmode:
372
- darkPalette = QtGui.QPalette()
373
- darkColor = QtGui.QColor(56, 56, 56)
371
+ darkPalette = QPalette()
372
+ darkColor = QColor(56, 56, 56)
374
373
  self.text_color = QColorConstants.White
375
- disabledColor = QtGui.QColor(127, 127, 127)
376
- darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
377
- darkPalette.setColor(
378
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
379
- )
374
+ disabledColor = QColor(127, 127, 127)
375
+ darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
376
+ darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
377
+ darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
378
+ darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
379
+ darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
380
+ darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
381
+ darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
382
+ darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
383
+ darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
384
+ darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
380
385
  darkPalette.setColor(
381
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
386
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
382
387
  )
383
- darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
384
- darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
385
388
  darkPalette.setColor(
386
- QtGui.QPalette.ColorGroup.Disabled,
387
- QtGui.QPalette.ColorRole.Text,
389
+ QPalette.ColorGroup.Disabled,
390
+ QPalette.ColorRole.ButtonText,
388
391
  disabledColor,
389
392
  )
390
- darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
391
- darkPalette.setColor(
392
- QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
393
- )
394
393
  darkPalette.setColor(
395
- QtGui.QPalette.ColorGroup.Disabled,
396
- QtGui.QPalette.ColorRole.ButtonText,
394
+ QPalette.ColorGroup.Disabled,
395
+ QPalette.ColorRole.HighlightedText,
397
396
  disabledColor,
398
397
  )
399
398
  darkPalette.setColor(
400
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
401
- )
402
- darkPalette.setColor(
403
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
404
- )
405
- darkPalette.setColor(
406
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
407
- )
408
- darkPalette.setColor(
409
- QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
410
- )
411
- darkPalette.setColor(
412
- QtGui.QPalette.ColorGroup.Disabled,
413
- QtGui.QPalette.ColorRole.HighlightedText,
399
+ QPalette.ColorGroup.Disabled,
400
+ QPalette.ColorRole.Text,
414
401
  disabledColor,
415
402
  )
416
403
 
417
404
  self.setPalette(darkPalette)
418
405
  self.callsignField.setPalette(darkPalette)
419
406
  self.update()
420
- dark_button_style = (
421
- "QPushButton {"
422
- "background-color: rgb(56,56,56);"
423
- "color: white;"
424
- "border-style: outset;"
425
- "border-width: 2px;"
426
- "border-radius: 5px;"
427
- "border-color: rgb(45,45,45);"
428
- "padding: 6px;"
429
- "}"
430
- "QPushButton:pressed {"
431
- "background-color: rgb(127, 127, 127);"
432
- "border-style: inset;"
433
- "}"
434
- )
435
- self.connectButton.setStyleSheet(dark_button_style)
436
- self.clearButton.setStyleSheet(dark_button_style)
437
- self.zoominButton.setStyleSheet(dark_button_style)
438
- self.zoomoutButton.setStyleSheet(dark_button_style)
439
407
  else:
440
408
  palette = self.style().standardPalette()
441
409
  self.setPalette(palette)
442
410
  self.callsignField.setPalette(palette)
443
411
  self.text_color = QColorConstants.Black
444
412
  self.update()
445
- light_button_style = (
446
- "QPushButton {"
447
- "background-color: rgb(245,245,245);"
448
- "color: rgb(52,52,52);"
449
- "border-style: outset;"
450
- "border-width: 2px;"
451
- "border-radius: 5px;"
452
- "border-color: rgb(150,150,150);"
453
- "padding: 6px;"
454
- "}"
455
- "QPushButton:pressed {"
456
- "background-color: rgb(127, 127, 127);"
457
- "border-style: inset;"
458
- "}"
459
- )
460
- self.connectButton.setStyleSheet(light_button_style)
461
- self.clearButton.setStyleSheet(light_button_style)
462
- self.zoominButton.setStyleSheet(light_button_style)
463
- self.zoomoutButton.setStyleSheet(light_button_style)
464
413
 
465
414
  def connect(self):
466
415
  """Connect to the cluster."""
@@ -686,11 +635,9 @@ class BandMapWindow(QDockWidget):
686
635
  self.clear_freq_mark(self.bandwidth_mark)
687
636
  self.clear_freq_mark(self.rxMark)
688
637
  self.draw_bandwidth(
689
- self.rx_freq, step, QtGui.QColor(30, 30, 180, 180), self.bandwidth_mark
690
- )
691
- self.drawfreqmark(
692
- self.rx_freq, step, QtGui.QColor(30, 180, 30, 180), self.rxMark
638
+ self.rx_freq, step, QColor(30, 30, 180, 180), self.bandwidth_mark
693
639
  )
640
+ self.drawfreqmark(self.rx_freq, step, QColor(30, 180, 30, 180), self.rxMark)
694
641
 
695
642
  def Freq2ScenePos(self, freq: float):
696
643
  """doc"""
@@ -751,7 +698,7 @@ class BandMapWindow(QDockWidget):
751
698
  if freq < self.currentBand.start or freq > self.currentBand.end:
752
699
  return
753
700
  if freq and self.bandwidth:
754
- # color = QtGui.QColor(30, 30, 180)
701
+ # color = QColor(30, 30, 180)
755
702
  bw_start = Decimal(str(freq)) - (
756
703
  (Decimal(str(self.bandwidth)) / 2) / 1000000
757
704
  )
@@ -786,11 +733,11 @@ class BandMapWindow(QDockWidget):
786
733
  for items in result:
787
734
  pen_color = self.text_color
788
735
  if items.get("comment") == "MARKED":
789
- pen_color = QtGui.QColor(47, 47, 255)
736
+ pen_color = QColor(47, 47, 255)
790
737
  if items.get("callsign") in self.worked_list:
791
738
  call_bandlist = self.worked_list.get(items.get("callsign"))
792
739
  if self.currentBand.altname in call_bandlist:
793
- pen_color = QtGui.QColor(255, 47, 47)
740
+ pen_color = QColor(255, 47, 47)
794
741
  freq_y = (
795
742
  (items.get("freq") - self.currentBand.start) / step
796
743
  ) * PIXELSPERSTEP
not1mm/checkwindow.py CHANGED
@@ -12,9 +12,9 @@ import queue
12
12
  from json import loads
13
13
  import Levenshtein
14
14
 
15
- from PyQt6 import QtGui, uic
15
+ from PyQt6 import uic
16
16
  from PyQt6.QtWidgets import QLabel, QVBoxLayout, QWidget, QDockWidget
17
- from PyQt6.QtGui import QMouseEvent, QColorConstants
17
+ from PyQt6.QtGui import QMouseEvent, QColorConstants, QPalette, QColor
18
18
 
19
19
  import not1mm.fsutils as fsutils
20
20
  from not1mm.lib.database import DataBase
@@ -70,51 +70,39 @@ class CheckWindow(QDockWidget):
70
70
  cmd["call"] = item
71
71
  self.multicast_interface.send_as_json(cmd)
72
72
 
73
- def setDarkMode(self, dark: bool):
73
+ def setDarkMode(self, dark: bool) -> None:
74
74
  """Forces a darkmode palette."""
75
75
 
76
76
  if dark:
77
- darkPalette = QtGui.QPalette()
78
- darkColor = QtGui.QColor(56, 56, 56)
79
- disabledColor = QtGui.QColor(127, 127, 127)
80
- darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
77
+ darkPalette = QPalette()
78
+ darkColor = QColor(56, 56, 56)
79
+ disabledColor = QColor(127, 127, 127)
80
+ darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
81
+ darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
82
+ darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
83
+ darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
84
+ darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
85
+ darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
86
+ darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
87
+ darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
88
+ darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
89
+ darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
81
90
  darkPalette.setColor(
82
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
91
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
83
92
  )
84
93
  darkPalette.setColor(
85
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
86
- )
87
- darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
88
- darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
89
- darkPalette.setColor(
90
- QtGui.QPalette.ColorGroup.Disabled,
91
- QtGui.QPalette.ColorRole.Text,
94
+ QPalette.ColorGroup.Disabled,
95
+ QPalette.ColorRole.ButtonText,
92
96
  disabledColor,
93
97
  )
94
- darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
95
- darkPalette.setColor(
96
- QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
97
- )
98
98
  darkPalette.setColor(
99
- QtGui.QPalette.ColorGroup.Disabled,
100
- QtGui.QPalette.ColorRole.ButtonText,
99
+ QPalette.ColorGroup.Disabled,
100
+ QPalette.ColorRole.HighlightedText,
101
101
  disabledColor,
102
102
  )
103
103
  darkPalette.setColor(
104
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
105
- )
106
- darkPalette.setColor(
107
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
108
- )
109
- darkPalette.setColor(
110
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
111
- )
112
- darkPalette.setColor(
113
- QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
114
- )
115
- darkPalette.setColor(
116
- QtGui.QPalette.ColorGroup.Disabled,
117
- QtGui.QPalette.ColorRole.HighlightedText,
104
+ QPalette.ColorGroup.Disabled,
105
+ QPalette.ColorRole.Text,
118
106
  disabledColor,
119
107
  )
120
108
 
@@ -726,7 +726,7 @@
726
726
  </widget>
727
727
  </item>
728
728
  <item row="2" column="3" alignment="Qt::AlignHCenter">
729
- <widget class="QRadioButton" name="radioButton_5">
729
+ <widget class="QRadioButton" name="usecwviacat_radioButton">
730
730
  <property name="font">
731
731
  <font>
732
732
  <family>JetBrains Mono</family>
@@ -735,13 +735,13 @@
735
735
  </font>
736
736
  </property>
737
737
  <property name="accessibleName">
738
- <string>none</string>
738
+ <string>CAT</string>
739
739
  </property>
740
740
  <property name="accessibleDescription">
741
- <string>none</string>
741
+ <string>use cat for c w</string>
742
742
  </property>
743
743
  <property name="text">
744
- <string>None</string>
744
+ <string>CAT</string>
745
745
  </property>
746
746
  </widget>
747
747
  </item>
@@ -1604,7 +1604,7 @@
1604
1604
  <tabstop>rigcontrolport_field</tabstop>
1605
1605
  <tabstop>cwport_field</tabstop>
1606
1606
  <tabstop>usepywinkeyer_radioButton</tabstop>
1607
- <tabstop>radioButton_5</tabstop>
1607
+ <tabstop>usecwviacat_radioButton</tabstop>
1608
1608
  <tabstop>cwip_field</tabstop>
1609
1609
  <tabstop>usecwdaemon_radioButton</tabstop>
1610
1610
  <tabstop>connect_to_server</tabstop>
@@ -90,6 +90,34 @@ class CAT:
90
90
  if self.interface == "rigctld":
91
91
  self.__initialize_rigctrld()
92
92
 
93
+ def sendcw(self, texttosend):
94
+ """..."""
95
+ logger.debug(f"{texttosend=} {self.interface=}")
96
+ if self.interface == "flrig":
97
+ ...
98
+ return
99
+ if self.interface == "rigctld":
100
+ self.sendcwrigctl(texttosend)
101
+
102
+ def sendcwrigctl(self, texttosend):
103
+ """..."""
104
+ if self.rigctrlsocket:
105
+ try:
106
+ self.online = True
107
+ self.rigctrlsocket.send(bytes(f"b{texttosend}\n", "utf-8"))
108
+ _ = self.rigctrlsocket.recv(1024).decode().strip()
109
+ return True
110
+ except socket.error as exception:
111
+ self.online = False
112
+ logger.debug("setvfo_rigctld: %s", f"{exception}")
113
+ self.rigctrlsocket = None
114
+ return False
115
+ self.__initialize_rigctrld()
116
+ return False
117
+
118
+ def sendcwxmlrpc(self, texttosend):
119
+ """..."""
120
+
93
121
  def get_vfo(self) -> str:
94
122
  """Poll the radio for current vfo using the interface"""
95
123
  vfo = ""
not1mm/lib/cwinterface.py CHANGED
@@ -15,10 +15,17 @@ logger = logging.getLogger("cwinterface")
15
15
 
16
16
 
17
17
  class CW:
18
- """An interface to cwdaemon and PyWinkeyerSerial"""
18
+ """
19
+
20
+ An interface to cwdaemon and PyWinkeyerSerial
21
+
22
+ servertype: int 1=cwdaemon, 2=pywinkeyer, 3=rigctld
23
+
24
+ """
19
25
 
20
26
  def __init__(self, servertype: int, host: str, port: int) -> None:
21
27
  self.servertype = servertype
28
+ self.cat = None
22
29
  self.host = host
23
30
  self.port = port
24
31
  self.speed = 20
@@ -42,35 +49,40 @@ class CW:
42
49
 
43
50
  def sendcw(self, texttosend):
44
51
  """sends cw to k1el"""
45
- logger.info("sendcw: %s", texttosend)
52
+ logger.debug(f"{texttosend=} {self.servertype=}")
46
53
  if self.servertype == 2:
47
54
  self._sendcw_xmlrpc(texttosend)
48
55
  if self.servertype == 1:
49
56
  self._sendcw_udp(texttosend)
57
+ if self.servertype == 3 and self.cw is not None:
58
+ self._sendcwcat(texttosend)
50
59
 
51
60
  def _sendcw_xmlrpc(self, texttosend):
52
61
  """sends cw to xmlrpc"""
53
- logger.info("xmlrpc: %s", texttosend)
62
+ logger.debug("xmlrpc: %s", texttosend)
54
63
  with ServerProxy(f"http://{self.host}:{self.port}") as proxy:
55
64
  try:
56
65
  proxy.k1elsendstring(texttosend)
57
66
  except Error as exception:
58
- logger.info(
67
+ logger.debug(
59
68
  "http://%s:%s, xmlrpc error: %s", self.host, self.port, exception
60
69
  )
61
70
  except ConnectionRefusedError:
62
- logger.info(
71
+ logger.debug(
63
72
  "http://%s:%s, xmlrpc Connection Refused", self.host, self.port
64
73
  )
65
74
 
66
75
  def _sendcw_udp(self, texttosend):
67
76
  """send cw to udp port"""
68
- logger.info("UDP: %s", texttosend)
77
+ logger.debug("UDP: %s", texttosend)
69
78
  server_address_port = (self.host, self.port)
70
79
  # bufferSize = 1024
71
80
  udp_client_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
72
81
  udp_client_socket.sendto(bytes(texttosend, "utf-8"), server_address_port)
73
82
 
83
+ def _sendcwcat(self, texttosend):
84
+ """..."""
85
+
74
86
  def set_winkeyer_speed(self, speed):
75
87
  """doc"""
76
88
  with ServerProxy(f"http://{self.host}:{self.port}") as proxy:
not1mm/lib/settings.py CHANGED
@@ -58,6 +58,9 @@ class Settings(QtWidgets.QDialog):
58
58
  self.usepywinkeyer_radioButton.setChecked(
59
59
  bool(self.preference.get("cwtype") == 2)
60
60
  )
61
+ self.usecwviacat_radioButton.setChecked(
62
+ bool(self.preference.get("cwtype") == 3)
63
+ )
61
64
  self.connect_to_server.setChecked(bool(self.preference.get("useserver")))
62
65
  self.multicast_group.setText(str(self.preference.get("multicast_group", "")))
63
66
  self.multicast_port.setText(str(self.preference.get("multicast_port", "")))
@@ -131,8 +134,10 @@ class Settings(QtWidgets.QDialog):
131
134
  self.preference["cwtype"] = 0
132
135
  if self.usecwdaemon_radioButton.isChecked():
133
136
  self.preference["cwtype"] = 1
134
- if self.usepywinkeyer_radioButton.isChecked():
137
+ elif self.usepywinkeyer_radioButton.isChecked():
135
138
  self.preference["cwtype"] = 2
139
+ elif self.usecwviacat_radioButton.isChecked():
140
+ self.preference["cwtype"] = 3
136
141
  self.preference["useserver"] = self.connect_to_server.isChecked()
137
142
  self.preference["multicast_group"] = self.multicast_group.text()
138
143
  self.preference["multicast_port"] = self.multicast_port.text()
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "24.4.26"
3
+ __version__ = "24.4.30"
not1mm/logwindow.py CHANGED
@@ -17,6 +17,7 @@ import math
17
17
  from PyQt6 import QtCore, QtGui, QtWidgets, uic
18
18
  from PyQt6.QtCore import QItemSelectionModel
19
19
  from PyQt6.QtWidgets import QDockWidget
20
+ from PyQt6.QtGui import QColorConstants, QPalette, QColor
20
21
 
21
22
  import not1mm.fsutils as fsutils
22
23
  from not1mm.lib.database import DataBase
@@ -167,58 +168,44 @@ class LogWindow(QDockWidget):
167
168
 
168
169
  self.multicast_interface.send_as_json(cmd)
169
170
 
170
- def set_dark_mode(self, dark: bool):
171
- """testing"""
171
+ def set_dark_mode(self, dark: bool) -> None:
172
+ """Forces a darkmode palette."""
172
173
 
173
174
  if dark:
174
- dark_palette = QtGui.QPalette()
175
- dark_color = QtGui.QColor(56, 56, 56)
176
- disabled_color = QtGui.QColor(127, 127, 127)
177
- dark_palette.setColor(QtGui.QPalette.ColorRole.Window, dark_color)
178
- dark_palette.setColor(
179
- QtGui.QPalette.ColorRole.WindowText, QtGui.QColorConstants.White
180
- )
181
- dark_palette.setColor(
182
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
183
- )
184
- dark_palette.setColor(QtGui.QPalette.ColorRole.AlternateBase, dark_color)
185
- dark_palette.setColor(
186
- QtGui.QPalette.ColorRole.Text, QtGui.QColorConstants.White
187
- )
188
- dark_palette.setColor(
189
- QtGui.QPalette.ColorGroup.Disabled,
190
- QtGui.QPalette.ColorRole.Text,
191
- disabled_color,
192
- )
193
- dark_palette.setColor(QtGui.QPalette.ColorRole.Button, dark_color)
194
- dark_palette.setColor(
195
- QtGui.QPalette.ColorRole.ButtonText, QtGui.QColorConstants.White
196
- )
197
- dark_palette.setColor(
198
- QtGui.QPalette.ColorGroup.Disabled,
199
- QtGui.QPalette.ColorRole.ButtonText,
200
- disabled_color,
201
- )
202
- dark_palette.setColor(
203
- QtGui.QPalette.ColorRole.BrightText, QtGui.QColorConstants.Red
204
- )
205
- dark_palette.setColor(
206
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
207
- )
208
- dark_palette.setColor(
209
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
210
- )
211
- dark_palette.setColor(
212
- QtGui.QPalette.ColorRole.HighlightedText, QtGui.QColorConstants.Black
213
- )
214
- dark_palette.setColor(
215
- QtGui.QPalette.ColorGroup.Disabled,
216
- QtGui.QPalette.ColorRole.HighlightedText,
217
- disabled_color,
218
- )
219
-
220
- self.setPalette(dark_palette)
221
- self.current_palette = dark_palette
175
+ darkPalette = QPalette()
176
+ darkColor = QColor(56, 56, 56)
177
+ disabledColor = QColor(127, 127, 127)
178
+ darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
179
+ darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
180
+ darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
181
+ darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
182
+ darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
183
+ darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
184
+ darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
185
+ darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
186
+ darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
187
+ darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
188
+ darkPalette.setColor(
189
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
190
+ )
191
+ darkPalette.setColor(
192
+ QPalette.ColorGroup.Disabled,
193
+ QPalette.ColorRole.ButtonText,
194
+ disabledColor,
195
+ )
196
+ darkPalette.setColor(
197
+ QPalette.ColorGroup.Disabled,
198
+ QPalette.ColorRole.HighlightedText,
199
+ disabledColor,
200
+ )
201
+ darkPalette.setColor(
202
+ QPalette.ColorGroup.Disabled,
203
+ QPalette.ColorRole.Text,
204
+ disabledColor,
205
+ )
206
+
207
+ self.setPalette(darkPalette)
208
+ self.current_palette = darkPalette
222
209
  else:
223
210
  palette = self.style().standardPalette()
224
211
  self.setPalette(palette)
not1mm/radio.py CHANGED
@@ -10,10 +10,13 @@ GPL V3
10
10
  # pylint: disable=logging-fstring-interpolation, line-too-long, no-name-in-module
11
11
 
12
12
  import datetime
13
+ import logging
13
14
 
14
15
  from PyQt6.QtCore import QObject, pyqtSignal, QThread
15
16
  from not1mm.lib.cat_interface import CAT
16
17
 
18
+ logger = logging.getLogger("cat_interface")
19
+
17
20
 
18
21
  class Radio(QObject):
19
22
  """Radio class"""
@@ -72,6 +75,12 @@ class Radio(QObject):
72
75
  )
73
76
  QThread.msleep(100)
74
77
 
78
+ def sendcw(self, texttosend):
79
+ """..."""
80
+ logger.debug(f"Send CW: {texttosend}")
81
+ if self.cat:
82
+ self.cat.sendcw(texttosend)
83
+
75
84
  def set_vfo(self, vfo):
76
85
  if self.cat:
77
86
  self.cat.set_vfo(vfo)
not1mm/vfo.py CHANGED
@@ -14,10 +14,10 @@ import platform
14
14
  from json import loads, JSONDecodeError
15
15
 
16
16
  import serial
17
- from PyQt6 import QtCore, QtGui, QtWidgets, uic
17
+ from PyQt6 import QtCore, QtWidgets, uic
18
18
  from PyQt6.QtCore import QTimer
19
19
  from PyQt6.QtWidgets import QDockWidget
20
- from PyQt6.QtGui import QColorConstants
20
+ from PyQt6.QtGui import QColorConstants, QPalette, QColor
21
21
 
22
22
  import not1mm.fsutils as fsutils
23
23
  from not1mm.lib.cat_interface import CAT
@@ -61,57 +61,45 @@ class VfoWindow(QDockWidget):
61
61
  self.poll_rig_timer.timeout.connect(self.poll_radio)
62
62
  self.poll_rig_timer.start(500)
63
63
 
64
- def setDarkMode(self, dark: bool):
65
- """testing"""
64
+ def setDarkMode(self, dark: bool) -> None:
65
+ """Forces a darkmode palette."""
66
66
 
67
67
  if dark:
68
- darkPalette = QtGui.QPalette()
69
- darkColor = QtGui.QColor(56, 56, 56)
70
- self.text_color = QColorConstants.White
71
- disabledColor = QtGui.QColor(127, 127, 127)
72
- darkPalette.setColor(QtGui.QPalette.ColorRole.Window, darkColor)
73
- darkPalette.setColor(
74
- QtGui.QPalette.ColorRole.WindowText, QColorConstants.White
75
- )
68
+ darkPalette = QPalette()
69
+ darkColor = QColor(56, 56, 56)
70
+ disabledColor = QColor(127, 127, 127)
71
+ darkPalette.setColor(QPalette.ColorRole.Window, darkColor)
72
+ darkPalette.setColor(QPalette.ColorRole.WindowText, QColorConstants.White)
73
+ darkPalette.setColor(QPalette.ColorRole.Base, QColor(45, 45, 45))
74
+ darkPalette.setColor(QPalette.ColorRole.AlternateBase, darkColor)
75
+ darkPalette.setColor(QPalette.ColorRole.Text, QColorConstants.White)
76
+ darkPalette.setColor(QPalette.ColorRole.Button, darkColor)
77
+ darkPalette.setColor(QPalette.ColorRole.ButtonText, QColorConstants.White)
78
+ darkPalette.setColor(QPalette.ColorRole.BrightText, QColorConstants.Red)
79
+ darkPalette.setColor(QPalette.ColorRole.Link, QColor(42, 130, 218))
80
+ darkPalette.setColor(QPalette.ColorRole.Highlight, QColor(42, 130, 218))
76
81
  darkPalette.setColor(
77
- QtGui.QPalette.ColorRole.Base, QtGui.QColor(45, 45, 45)
82
+ QPalette.ColorRole.HighlightedText, QColorConstants.Black
78
83
  )
79
- darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
80
- darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
81
84
  darkPalette.setColor(
82
- QtGui.QPalette.ColorGroup.Disabled,
83
- QtGui.QPalette.ColorRole.Text,
85
+ QPalette.ColorGroup.Disabled,
86
+ QPalette.ColorRole.ButtonText,
84
87
  disabledColor,
85
88
  )
86
- darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
87
- darkPalette.setColor(
88
- QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
89
- )
90
89
  darkPalette.setColor(
91
- QtGui.QPalette.ColorGroup.Disabled,
92
- QtGui.QPalette.ColorRole.ButtonText,
90
+ QPalette.ColorGroup.Disabled,
91
+ QPalette.ColorRole.HighlightedText,
93
92
  disabledColor,
94
93
  )
95
94
  darkPalette.setColor(
96
- QtGui.QPalette.ColorRole.BrightText, QColorConstants.Red
97
- )
98
- darkPalette.setColor(
99
- QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
100
- )
101
- darkPalette.setColor(
102
- QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
103
- )
104
- darkPalette.setColor(
105
- QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
106
- )
107
- darkPalette.setColor(
108
- QtGui.QPalette.ColorGroup.Disabled,
109
- QtGui.QPalette.ColorRole.HighlightedText,
95
+ QPalette.ColorGroup.Disabled,
96
+ QPalette.ColorRole.Text,
110
97
  disabledColor,
111
98
  )
112
99
 
113
- self.setPalette(darkPalette)
114
100
  self.current_palette = darkPalette
101
+ self.setPalette(darkPalette)
102
+ self.text_color = QColorConstants.White
115
103
  else:
116
104
  palette = self.style().standardPalette()
117
105
  self.current_palette = palette
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.4.26
3
+ Version: 24.4.30
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
@@ -31,6 +31,7 @@ Requires-Dist: appdata
31
31
  Requires-Dist: Levenshtein
32
32
 
33
33
  # Not1MM
34
+ <!-- markdownlint-disable MD001 MD033 -->
34
35
 
35
36
  ![logo](https://github.com/mbridak/not1mm/raw/master/not1mm/data/k6gte.not1mm.svg)
36
37
 
@@ -55,16 +56,16 @@ Requires-Dist: Levenshtein
55
56
  - [Common installation recipes for Ubuntu and Fedora](#common-installation-recipes-for-ubuntu-and-fedora)
56
57
  - [Ubuntu 22.04 LTS](#ubuntu-2204-lts)
57
58
  - [Ubuntu 23.04](#ubuntu-2304)
58
- - [Ubuntu 24.04](#ubuntu-2404)
59
+ - [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
59
60
  - [Fedora 38 \& 39](#fedora-38--39)
60
61
  - [Fedora 40](#fedora-40)
61
62
  - [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
62
63
  - [Bootstrapping pipx](#bootstrapping-pipx)
63
64
  - [Installing with pipx](#installing-with-pipx)
65
+ - [Installing from GitHub source](#installing-from-github-source)
64
66
  - [After the install](#after-the-install)
65
67
  - [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
66
68
  - [Or this fan favorite](#or-this-fan-favorite)
67
- - [Installing from GitHub source](#installing-from-github-source)
68
69
  - [Various data file locations](#various-data-file-locations)
69
70
  - [Data](#data)
70
71
  - [Config](#config)
@@ -179,6 +180,8 @@ I wish to thank those who've contributed to the project.
179
180
 
180
181
  ## Recent Changes
181
182
 
183
+ - [24-4-30] Allowsending CW via rigctld if your radio supports it.
184
+ - [24-4-27] Cleaned up dark mode code.
182
185
  - [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
183
186
  - [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
184
187
  - [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
@@ -217,6 +220,10 @@ through your distribution's package manager before continuing.
217
220
  I've taken the time to install some common Linux distributions into a VM and
218
221
  noted the minimum steps needed to install not1mm.
219
222
 
223
+ <details>
224
+
225
+ <summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
226
+
220
227
  #### Ubuntu 22.04 LTS
221
228
 
222
229
  ```bash
@@ -236,7 +243,7 @@ pipx install not1mm
236
243
  pipx ensurepath
237
244
  ```
238
245
 
239
- #### Ubuntu 24.04
246
+ #### Ubuntu 24.04 LTS
240
247
 
241
248
  ```bash
242
249
  sudo apt update
@@ -246,6 +253,12 @@ pip install --break-system-packages not1mm
246
253
  source .profile
247
254
  ```
248
255
 
256
+ </details>
257
+
258
+ <details>
259
+
260
+ <summary><b>Fedora 38, 39 and 40</b></summary>
261
+
249
262
  #### Fedora 38 & 39
250
263
 
251
264
  ```bash
@@ -262,6 +275,9 @@ sudo dnf install python3-pip python3-pyqt6 portaudio
262
275
  pip install not1mm
263
276
  ```
264
277
 
278
+ </details>
279
+ <br>
280
+
265
281
  You can now open a new terminal and type not1mm. On it's first run, it may or
266
282
  may not install a lovely non AI generated icon, which you can later click on to
267
283
  launch the application.
@@ -313,6 +329,40 @@ If you need to later update not1mm, you can do so with:
313
329
  pipx upgrade not1mm
314
330
  ```
315
331
 
332
+ <details>
333
+ <summary><b>Installing from GitHub source.</b></summary>
334
+
335
+ ### Installing from GitHub source
336
+
337
+ Since this is packaged for PyPI, if you want to work on your own source branch,
338
+ after cloning from github you would:
339
+
340
+ ```bash
341
+ pip install --upgrade pip
342
+ pip install setuptools
343
+ pip install build
344
+ source rebuild.sh
345
+ ```
346
+
347
+ from the root directory. This installs a build chain and a local editable copy
348
+ of not1mm.
349
+
350
+ There's two ways to launch the program from the local editable copy.
351
+
352
+ You can either be in the root of the source directory and type:
353
+
354
+ ```bash
355
+ python not1mm
356
+ ```
357
+
358
+ or be in some other directory and just type:
359
+
360
+ ```bash
361
+ not1mm
362
+ ```
363
+
364
+ </details>
365
+
316
366
  ## After the install
317
367
 
318
368
  You can now open a new terminal and type `not1mm`. On it's first run, it may or
@@ -344,35 +394,6 @@ For a more permanent solution you can place the line
344
394
  `export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
345
395
  after logging out and back in you should be able to launch it normally.
346
396
 
347
- ### Installing from GitHub source
348
-
349
- Since this is packaged for PyPI, if you want to work on your own source branch,
350
- after cloning from github you would:
351
-
352
- ```bash
353
- pip install --upgrade pip
354
- pip install setuptools
355
- pip install build
356
- source rebuild.sh
357
- ```
358
-
359
- from the root directory. This installs a build chain and a local editable copy
360
- of not1mm.
361
-
362
- There's two ways to launch the program from the local editable copy.
363
-
364
- You can either be in the root of the source directory and type:
365
-
366
- ```bash
367
- python not1mm
368
- ```
369
-
370
- or be in some other directory and just type:
371
-
372
- ```bash
373
- not1mm
374
- ```
375
-
376
397
  ## Various data file locations
377
398
 
378
399
  ### Data
@@ -482,7 +503,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
482
503
 
483
504
  Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
484
505
  `127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
485
- port `8000`. Or `None`, if you want to Morse it like it's 1899.
506
+ `CAT` which if your radio supports it, sends Morse characters via rigctld. As far
507
+ as I can tell rigctld does not support setting the radios internal keyer speed. So
508
+ the CW speed control widget will not be functional and you'd need to control the
509
+ keyer speed thru the radios interface.
486
510
 
487
511
  ### Cluster
488
512
 
@@ -1,11 +1,11 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=RTpa_ZR5UFaNmdna5xa8zHVUsXX7dSNJ-vvZjBW_08I,123544
3
- not1mm/bandmap.py,sha256=3kmRYItrBqpjudFb2NnkGNJpDWkwOpGPQbKwHmYnQ-o,34021
4
- not1mm/checkwindow.py,sha256=9ueFgYLM4RFmroMJBXXn98XWO9ZJ-Dop6MwZUXRNFF0,10577
2
+ not1mm/__main__.py,sha256=B2BSFagNTFJ6jWChOEj41TAtsWZ4rXo59sDiKp4rie0,121264
3
+ not1mm/bandmap.py,sha256=DyAIgEfV_Ceg_BuBwvV3a2aRHTG3M63ZokoULS0wTdk,32071
4
+ not1mm/checkwindow.py,sha256=PHQhyN-25ZugbxKKjSxs0wqD80GTHYdIs1IIBjCGVc8,10278
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
6
- not1mm/logwindow.py,sha256=UcO8mgs_E7ier2gg_1ESTaRxABEvcpCwKmSibm7hl74,44603
7
- not1mm/radio.py,sha256=im14hFLKu0NreymcYoeSE3gyFHoXygP8azY0nsfBLP0,2876
8
- not1mm/vfo.py,sha256=pRRj0XTbeTU9noo3nC1dbg26VYj6gHEw_srUDbyYqC0,12169
6
+ not1mm/logwindow.py,sha256=MpEVvnuQh9P5Z8kK2MozAaMCNSx1C4isAEYCETI7SjI,44285
7
+ not1mm/radio.py,sha256=R_RaxdiqcMzIQN2za7qBsStrT5X0AwZcz8xtiCwsYdE,3097
8
+ not1mm/vfo.py,sha256=7CMI0h9jCEhaonOIvN_7wSiEnsSSxsB1IvOYC9bML6w,11889
9
9
  not1mm/data/JetBrainsMono-Regular.ttf,sha256=UOHctAKY_PzCGh7zy-6f6egnCcSK0wzmF0csBqO9lDY,203952
10
10
  not1mm/data/MASTER.SCP,sha256=1vQRvEZ865brfmmajp-Lj-hgWejVGI992q8o971bUV8,366478
11
11
  not1mm/data/about.ui,sha256=7TqvtXFFm0Rmcu0bmLupwpO1CsK8MekfZ09_xn6kZrQ,2067
@@ -13,7 +13,7 @@ not1mm/data/alpha bravo charlie delta.txt,sha256=d5QMmSWEUAe4Rj1XbNjTPLa_5Be4Se6
13
13
  not1mm/data/bandmap.ui,sha256=NqVoAGyuf_Rsts_FnL0pYEtE08DJb6qm4KAQ_T01bM8,7125
14
14
  not1mm/data/check.png,sha256=UvFOLr8V-79qnjW8wUaGItXk_OSP8m8hqPevs8NDlFY,387
15
15
  not1mm/data/checkwindow.ui,sha256=aILeaBJB5Xium-JIFiJ39VEoGH6TIpK0lHVa2RcfeaQ,4614
16
- not1mm/data/configuration.ui,sha256=DJZxA4zZPb4sTdVn17j1fwaTw-5lJCNQ6PspQrsdMe4,51643
16
+ not1mm/data/configuration.ui,sha256=fRdyDusgQdUl76XC__RHwpkOlOERmnGFQ3DMCgkxh8U,51672
17
17
  not1mm/data/contests.sql,sha256=4hmJCDvrbxnA_Y5S4T5o52TZieeFk6QUwFerwlFePNA,89307
18
18
  not1mm/data/cty.json,sha256=xnLK-kNB5phKPef7R7PJZcSGGHegZ1AH2xw9ZWJwccM,4790698
19
19
  not1mm/data/cwmacros.txt,sha256=PvJ7TxGILq-ErHb6Gbrm-08x76BbCdXb8AY8a7st5mg,451
@@ -89,8 +89,8 @@ not1mm/data/phonetics/yourcall.wav,sha256=4kheHJmCiRDL2kjhlgXQ8_u_eEMgKxiNGu5UBk
89
89
  not1mm/data/phonetics/z.wav,sha256=arafCi7fwmBLdVDI-PRyaL4U-03PIQDhffwY5noJ_2c,51768
90
90
  not1mm/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
91
  not1mm/lib/about.py,sha256=sWycfGcruN3SaEe4JmaJ61K6D8Itq0WxpUYT-lEcmYM,416
92
- not1mm/lib/cat_interface.py,sha256=dr5bBcObNtRWVHr9A5kq9GCq0wQfOOfVhkrEAzJez90,15127
93
- not1mm/lib/cwinterface.py,sha256=Seupz7tMkCvJ80mgmyaNU_1AUADsvNPkAfwDSlwibF0,3126
92
+ not1mm/lib/cat_interface.py,sha256=GP06hWIFrM_6hFQCJEq6QuNF8HaZn4UojIOlt_iWLDA,16042
93
+ not1mm/lib/cwinterface.py,sha256=Q8p3pScOHczZ8ptICfH1Yu6rCEwQJLgrNwYMN76B2i8,3389
94
94
  not1mm/lib/database.py,sha256=RQoj3JsTejMiiFIN42lY3N4jrj80htftdoFeRqVKnKs,42480
95
95
  not1mm/lib/edit_contact.py,sha256=Ki9bGPpqyQQBB1cU8VIBDCal3lbXeQ6qxhzklmhE2_w,353
96
96
  not1mm/lib/edit_macro.py,sha256=raKWBwsHInj5EUKmvyLQ6gqc3ZFDlstsD3xqoM4PC8E,517
@@ -104,9 +104,9 @@ not1mm/lib/n1mm.py,sha256=V1NiNyOHaPNYKe_vRsq44O1R42N8uS5PlfRa5Db4Tv0,5712
104
104
  not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
105
105
  not1mm/lib/plugin_common.py,sha256=AAKBPCXzTWZJb-h08uPNnHVG7bSCg7kwukc211gFivY,8605
106
106
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
107
- not1mm/lib/settings.py,sha256=i4Za_BZDl9UotB10o8sjIkzRdR0493rMI5VaQltUZHA,9054
107
+ not1mm/lib/settings.py,sha256=MWiKXbasaFbzeHTjfzTaTqbCBrIijudP_-0a5jNmUAA,9265
108
108
  not1mm/lib/super_check_partial.py,sha256=p5l3u2ZOCBtlWgbvskC50FpuoaIpR07tfC6zTdRWbh4,2334
109
- not1mm/lib/version.py,sha256=lPQishm4hmFWwKk5ErP8Ktbyz8JmCVbtE3C3poObc-g,48
109
+ not1mm/lib/version.py,sha256=zA20U-5Ca6bsgBYAJw2MX5JgzAAvPdJ2B59giQAav24,48
110
110
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
111
111
  not1mm/plugins/10_10_fall_cw.py,sha256=fUjfwjuscDjicXIxsO0JHh7xTR9Vu0iPsrOLb896Qak,10873
112
112
  not1mm/plugins/10_10_spring_cw.py,sha256=WNaJP5mBQfaB6SxnFI0Vawt3AKDr94tKVtAK-EVhtUY,10878
@@ -140,9 +140,9 @@ not1mm/plugins/naqp_ssb.py,sha256=IWksulcb2_DxlkeW0h3048t8I-u00G_67KBVKkp-TV4,11
140
140
  not1mm/plugins/phone_weekly_test.py,sha256=gCX0ESUoiQzDp9puwibt9-dRembNsiuEeBdawCVvjHA,12316
141
141
  not1mm/plugins/stew_perry_topband.py,sha256=DIMI3mGMKokXXb9pPLqdhBI6JVnnIs7ZnAL23nFmshE,10588
142
142
  not1mm/plugins/winter_field_day.py,sha256=4rcfRtobwjHO6BNL3WOTHzBmyyeuX79BNGBG8PfjrI8,10238
143
- not1mm-24.4.26.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
144
- not1mm-24.4.26.dist-info/METADATA,sha256=wdO0q57c03NHGkJR8JKTiGHPHDpIdew_akMRy4tZBlc,28272
145
- not1mm-24.4.26.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
146
- not1mm-24.4.26.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
147
- not1mm-24.4.26.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
148
- not1mm-24.4.26.dist-info/RECORD,,
143
+ not1mm-24.4.30.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
144
+ not1mm-24.4.30.dist-info/METADATA,sha256=KBVE9BJ01q8RlE8BBesdoAtBiMt5m0z_tnkQnNGyZAY,28897
145
+ not1mm-24.4.30.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
146
+ not1mm-24.4.30.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
147
+ not1mm-24.4.30.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
148
+ not1mm-24.4.30.dist-info/RECORD,,