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 +33 -93
- not1mm/bandmap.py +28 -81
- not1mm/checkwindow.py +23 -35
- not1mm/data/configuration.ui +5 -5
- not1mm/lib/cat_interface.py +28 -0
- not1mm/lib/cwinterface.py +18 -6
- not1mm/lib/settings.py +6 -1
- not1mm/lib/version.py +1 -1
- not1mm/logwindow.py +37 -50
- not1mm/radio.py +9 -0
- not1mm/vfo.py +26 -38
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/METADATA +58 -34
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/RECORD +17 -17
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/LICENSE +0 -0
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/WHEEL +0 -0
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/entry_points.txt +0 -0
- {not1mm-24.4.26.dist-info → not1mm-24.4.30.dist-info}/top_level.txt +0 -0
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,
|
571
|
-
"""
|
570
|
+
def setDarkMode(self, setdarkmode=False) -> None:
|
571
|
+
"""Forces a darkmode palette."""
|
572
572
|
|
573
|
-
logger.debug(f"Dark mode set to: {
|
573
|
+
logger.debug(f"Dark mode set to: {setdarkmode}")
|
574
574
|
|
575
575
|
cmd = {}
|
576
576
|
cmd["cmd"] = "DARKMODE"
|
577
|
-
cmd["state"] =
|
577
|
+
cmd["state"] = setdarkmode
|
578
578
|
cmd["station"] = platform.node()
|
579
579
|
self.multicast_interface.send_as_json(cmd)
|
580
580
|
|
581
|
-
if
|
582
|
-
darkPalette =
|
583
|
-
darkColor =
|
584
|
-
disabledColor =
|
585
|
-
darkPalette.setColor(
|
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
|
-
|
596
|
+
QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
588
597
|
)
|
589
598
|
darkPalette.setColor(
|
590
|
-
|
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
|
-
|
605
|
-
|
604
|
+
QPalette.ColorGroup.Disabled,
|
605
|
+
QPalette.ColorRole.HighlightedText,
|
606
606
|
disabledColor,
|
607
607
|
)
|
608
608
|
darkPalette.setColor(
|
609
|
-
|
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
|
-
|
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.
|
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 =
|
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
|
-
"""
|
370
|
-
|
369
|
+
"""Set dark mode"""
|
371
370
|
if setdarkmode:
|
372
|
-
darkPalette =
|
373
|
-
darkColor =
|
371
|
+
darkPalette = QPalette()
|
372
|
+
darkColor = QColor(56, 56, 56)
|
374
373
|
self.text_color = QColorConstants.White
|
375
|
-
disabledColor =
|
376
|
-
darkPalette.setColor(
|
377
|
-
darkPalette.setColor(
|
378
|
-
|
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
|
-
|
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
|
-
|
387
|
-
|
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
|
-
|
396
|
-
|
394
|
+
QPalette.ColorGroup.Disabled,
|
395
|
+
QPalette.ColorRole.HighlightedText,
|
397
396
|
disabledColor,
|
398
397
|
)
|
399
398
|
darkPalette.setColor(
|
400
|
-
|
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,
|
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 =
|
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 =
|
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 =
|
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
|
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 =
|
78
|
-
darkColor =
|
79
|
-
disabledColor =
|
80
|
-
darkPalette.setColor(
|
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
|
-
|
91
|
+
QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
83
92
|
)
|
84
93
|
darkPalette.setColor(
|
85
|
-
|
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
|
-
|
100
|
-
|
99
|
+
QPalette.ColorGroup.Disabled,
|
100
|
+
QPalette.ColorRole.HighlightedText,
|
101
101
|
disabledColor,
|
102
102
|
)
|
103
103
|
darkPalette.setColor(
|
104
|
-
|
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
|
|
not1mm/data/configuration.ui
CHANGED
@@ -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="
|
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>
|
738
|
+
<string>CAT</string>
|
739
739
|
</property>
|
740
740
|
<property name="accessibleDescription">
|
741
|
-
<string>
|
741
|
+
<string>use cat for c w</string>
|
742
742
|
</property>
|
743
743
|
<property name="text">
|
744
|
-
<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>
|
1607
|
+
<tabstop>usecwviacat_radioButton</tabstop>
|
1608
1608
|
<tabstop>cwip_field</tabstop>
|
1609
1609
|
<tabstop>usecwdaemon_radioButton</tabstop>
|
1610
1610
|
<tabstop>connect_to_server</tabstop>
|
not1mm/lib/cat_interface.py
CHANGED
@@ -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
|
-
"""
|
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.
|
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.
|
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.
|
67
|
+
logger.debug(
|
59
68
|
"http://%s:%s, xmlrpc error: %s", self.host, self.port, exception
|
60
69
|
)
|
61
70
|
except ConnectionRefusedError:
|
62
|
-
logger.
|
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.
|
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
|
-
|
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
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
|
-
"""
|
171
|
+
def set_dark_mode(self, dark: bool) -> None:
|
172
|
+
"""Forces a darkmode palette."""
|
172
173
|
|
173
174
|
if dark:
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
)
|
181
|
-
|
182
|
-
|
183
|
-
)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
)
|
205
|
-
|
206
|
-
|
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,
|
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
|
-
"""
|
64
|
+
def setDarkMode(self, dark: bool) -> None:
|
65
|
+
"""Forces a darkmode palette."""
|
66
66
|
|
67
67
|
if dark:
|
68
|
-
darkPalette =
|
69
|
-
darkColor =
|
70
|
-
|
71
|
-
|
72
|
-
darkPalette.setColor(
|
73
|
-
darkPalette.setColor(
|
74
|
-
|
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
|
-
|
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
|
-
|
83
|
-
|
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
|
-
|
92
|
-
|
90
|
+
QPalette.ColorGroup.Disabled,
|
91
|
+
QPalette.ColorRole.HighlightedText,
|
93
92
|
disabledColor,
|
94
93
|
)
|
95
94
|
darkPalette.setColor(
|
96
|
-
|
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.
|
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
|

|
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
|
-
|
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=
|
3
|
-
not1mm/bandmap.py,sha256=
|
4
|
-
not1mm/checkwindow.py,sha256=
|
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=
|
7
|
-
not1mm/radio.py,sha256=
|
8
|
-
not1mm/vfo.py,sha256=
|
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=
|
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=
|
93
|
-
not1mm/lib/cwinterface.py,sha256=
|
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=
|
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=
|
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.
|
144
|
-
not1mm-24.4.
|
145
|
-
not1mm-24.4.
|
146
|
-
not1mm-24.4.
|
147
|
-
not1mm-24.4.
|
148
|
-
not1mm-24.4.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|