not1mm 24.4.25.1__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 +37 -96
- 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.25.1.dist-info → not1mm-24.4.30.dist-info}/METADATA +76 -32
- {not1mm-24.4.25.1.dist-info → not1mm-24.4.30.dist-info}/RECORD +17 -17
- {not1mm-24.4.25.1.dist-info → not1mm-24.4.30.dist-info}/LICENSE +0 -0
- {not1mm-24.4.25.1.dist-info → not1mm-24.4.30.dist-info}/WHEEL +0 -0
- {not1mm-24.4.25.1.dist-info → not1mm-24.4.30.dist-info}/entry_points.txt +0 -0
- {not1mm-24.4.25.1.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
|
@@ -150,10 +150,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
150
150
|
"cluster_port": 7373,
|
151
151
|
"cluster_filter": "Set DX Filter SpotterCont=NA",
|
152
152
|
"cluster_mode": "OPEN",
|
153
|
-
"logwindow":
|
154
|
-
"bandmapwindow":
|
155
|
-
"checkwindow":
|
153
|
+
"logwindow": False,
|
154
|
+
"bandmapwindow": False,
|
155
|
+
"checkwindow": False,
|
156
156
|
"vfowindow": False,
|
157
|
+
"darkmode": True,
|
157
158
|
}
|
158
159
|
appstarted = False
|
159
160
|
contact = {}
|
@@ -566,76 +567,50 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
566
567
|
"""
|
567
568
|
print(f"{result=}")
|
568
569
|
|
569
|
-
def setDarkMode(self,
|
570
|
-
"""
|
570
|
+
def setDarkMode(self, setdarkmode=False) -> None:
|
571
|
+
"""Forces a darkmode palette."""
|
571
572
|
|
572
|
-
logger.debug(f"Dark mode set to: {
|
573
|
+
logger.debug(f"Dark mode set to: {setdarkmode}")
|
573
574
|
|
574
575
|
cmd = {}
|
575
576
|
cmd["cmd"] = "DARKMODE"
|
576
|
-
cmd["state"] =
|
577
|
+
cmd["state"] = setdarkmode
|
577
578
|
cmd["station"] = platform.node()
|
578
579
|
self.multicast_interface.send_as_json(cmd)
|
579
580
|
|
580
|
-
if
|
581
|
-
darkPalette =
|
582
|
-
darkColor =
|
583
|
-
disabledColor =
|
584
|
-
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))
|
585
595
|
darkPalette.setColor(
|
586
|
-
|
596
|
+
QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
587
597
|
)
|
588
598
|
darkPalette.setColor(
|
589
|
-
|
590
|
-
|
591
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.AlternateBase, darkColor)
|
592
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.Text, QColorConstants.White)
|
593
|
-
darkPalette.setColor(
|
594
|
-
QtGui.QPalette.ColorGroup.Disabled,
|
595
|
-
QtGui.QPalette.ColorRole.Text,
|
599
|
+
QPalette.ColorGroup.Disabled,
|
600
|
+
QPalette.ColorRole.ButtonText,
|
596
601
|
disabledColor,
|
597
602
|
)
|
598
|
-
darkPalette.setColor(QtGui.QPalette.ColorRole.Button, darkColor)
|
599
|
-
darkPalette.setColor(
|
600
|
-
QtGui.QPalette.ColorRole.ButtonText, QColorConstants.White
|
601
|
-
)
|
602
603
|
darkPalette.setColor(
|
603
|
-
|
604
|
-
|
604
|
+
QPalette.ColorGroup.Disabled,
|
605
|
+
QPalette.ColorRole.HighlightedText,
|
605
606
|
disabledColor,
|
606
607
|
)
|
607
608
|
darkPalette.setColor(
|
608
|
-
|
609
|
-
|
610
|
-
darkPalette.setColor(
|
611
|
-
QtGui.QPalette.ColorRole.Link, QtGui.QColor(42, 130, 218)
|
612
|
-
)
|
613
|
-
darkPalette.setColor(
|
614
|
-
QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(42, 130, 218)
|
615
|
-
)
|
616
|
-
darkPalette.setColor(
|
617
|
-
QtGui.QPalette.ColorRole.HighlightedText, QColorConstants.Black
|
618
|
-
)
|
619
|
-
darkPalette.setColor(
|
620
|
-
QtGui.QPalette.ColorGroup.Disabled,
|
621
|
-
QtGui.QPalette.ColorRole.HighlightedText,
|
609
|
+
QPalette.ColorGroup.Disabled,
|
610
|
+
QPalette.ColorRole.Text,
|
622
611
|
disabledColor,
|
623
612
|
)
|
624
|
-
|
625
|
-
"QPushButton {"
|
626
|
-
"background-color: rgb(56,56,56);"
|
627
|
-
"color: white;"
|
628
|
-
"border-style: outset;"
|
629
|
-
"border-width: 2px;"
|
630
|
-
"border-radius: 5px;"
|
631
|
-
"border-color: rgb(45,45,45);"
|
632
|
-
"padding: 6px;"
|
633
|
-
"}"
|
634
|
-
"QPushButton:pressed {"
|
635
|
-
"background-color: rgb(127, 127, 127);"
|
636
|
-
"border-style: inset;"
|
637
|
-
"}"
|
638
|
-
)
|
613
|
+
|
639
614
|
self.current_palette = darkPalette
|
640
615
|
self.setPalette(darkPalette)
|
641
616
|
self.text_color = QColorConstants.White
|
@@ -650,18 +625,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
650
625
|
self.other_1.setPalette(darkPalette)
|
651
626
|
self.other_2.setPalette(darkPalette)
|
652
627
|
self.cw_entry.setPalette(darkPalette)
|
653
|
-
self.F1.setStyleSheet(dark_button_style)
|
654
|
-
self.F2.setStyleSheet(dark_button_style)
|
655
|
-
self.F3.setStyleSheet(dark_button_style)
|
656
|
-
self.F4.setStyleSheet(dark_button_style)
|
657
|
-
self.F5.setStyleSheet(dark_button_style)
|
658
|
-
self.F6.setStyleSheet(dark_button_style)
|
659
|
-
self.F7.setStyleSheet(dark_button_style)
|
660
|
-
self.F8.setStyleSheet(dark_button_style)
|
661
|
-
self.F9.setStyleSheet(dark_button_style)
|
662
|
-
self.F10.setStyleSheet(dark_button_style)
|
663
|
-
self.F11.setStyleSheet(dark_button_style)
|
664
|
-
self.F12.setStyleSheet(dark_button_style)
|
665
628
|
else:
|
666
629
|
palette = self.style().standardPalette()
|
667
630
|
self.current_palette = palette
|
@@ -678,33 +641,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
678
641
|
self.other_2.setPalette(palette)
|
679
642
|
self.cw_entry.setPalette(palette)
|
680
643
|
self.text_color = QColorConstants.Black
|
681
|
-
light_button_style = (
|
682
|
-
"QPushButton {"
|
683
|
-
"background-color: rgb(245,245,245);"
|
684
|
-
"color: rgb(52,52,52);"
|
685
|
-
"border-style: outset;"
|
686
|
-
"border-width: 2px;"
|
687
|
-
"border-radius: 5px;"
|
688
|
-
"border-color: rgb(150,150,150);"
|
689
|
-
"padding: 6px;"
|
690
|
-
"}"
|
691
|
-
"QPushButton:pressed {"
|
692
|
-
"background-color: rgb(127, 127, 127);"
|
693
|
-
"border-style: inset;"
|
694
|
-
"}"
|
695
|
-
)
|
696
|
-
self.F1.setStyleSheet(light_button_style)
|
697
|
-
self.F2.setStyleSheet(light_button_style)
|
698
|
-
self.F3.setStyleSheet(light_button_style)
|
699
|
-
self.F4.setStyleSheet(light_button_style)
|
700
|
-
self.F5.setStyleSheet(light_button_style)
|
701
|
-
self.F6.setStyleSheet(light_button_style)
|
702
|
-
self.F7.setStyleSheet(light_button_style)
|
703
|
-
self.F8.setStyleSheet(light_button_style)
|
704
|
-
self.F9.setStyleSheet(light_button_style)
|
705
|
-
self.F10.setStyleSheet(light_button_style)
|
706
|
-
self.F11.setStyleSheet(light_button_style)
|
707
|
-
self.F12.setStyleSheet(light_button_style)
|
708
644
|
|
709
645
|
def set_radio_icon(self, state: int) -> None:
|
710
646
|
"""
|
@@ -769,7 +705,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
769
705
|
# self.send_backspace()
|
770
706
|
self.oldtext = newtext
|
771
707
|
return
|
772
|
-
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:
|
773
711
|
self.cw.sendcw(newtext[len(self.oldtext) :])
|
774
712
|
self.oldtext = newtext
|
775
713
|
|
@@ -2374,6 +2312,9 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2374
2312
|
self.voice_string(self.process_macro(function_key.toolTip()))
|
2375
2313
|
return
|
2376
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
|
2377
2318
|
self.cw.sendcw(self.process_macro(function_key.toolTip()))
|
2378
2319
|
|
2379
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,14 +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)
|
59
|
+
- [Ubuntu 24.04 LTS](#ubuntu-2404-lts)
|
58
60
|
- [Fedora 38 \& 39](#fedora-38--39)
|
61
|
+
- [Fedora 40](#fedora-40)
|
59
62
|
- [Python, PyPI, pip and pipx](#python-pypi-pip-and-pipx)
|
60
63
|
- [Bootstrapping pipx](#bootstrapping-pipx)
|
61
64
|
- [Installing with pipx](#installing-with-pipx)
|
65
|
+
- [Installing from GitHub source](#installing-from-github-source)
|
62
66
|
- [After the install](#after-the-install)
|
63
67
|
- [You may or may not get a warning message like](#you-may-or-may-not-get-a-warning-message-like)
|
64
68
|
- [Or this fan favorite](#or-this-fan-favorite)
|
65
|
-
- [Installing from GitHub source](#installing-from-github-source)
|
66
69
|
- [Various data file locations](#various-data-file-locations)
|
67
70
|
- [Data](#data)
|
68
71
|
- [Config](#config)
|
@@ -177,6 +180,8 @@ I wish to thank those who've contributed to the project.
|
|
177
180
|
|
178
181
|
## Recent Changes
|
179
182
|
|
183
|
+
- [24-4-30] Allowsending CW via rigctld if your radio supports it.
|
184
|
+
- [24-4-27] Cleaned up dark mode code.
|
180
185
|
- [24-4-25-1] Reduce delta time to poll. Reorder poll_radio callback. Remove unused CAT lib from main.
|
181
186
|
- [24-4-25] Limited loop in radio.py, reducing clock cycles used. Moved Log window to the top of the logger.
|
182
187
|
- [24-4-24] Placed CAT control into a thread so disconnecting the radio wouldn't lock up the interface.
|
@@ -215,6 +220,10 @@ through your distribution's package manager before continuing.
|
|
215
220
|
I've taken the time to install some common Linux distributions into a VM and
|
216
221
|
noted the minimum steps needed to install not1mm.
|
217
222
|
|
223
|
+
<details>
|
224
|
+
|
225
|
+
<summary><b>Ubuntu 22.04 LTS, 23.04 and 24.04 LTS</b></summary>
|
226
|
+
|
218
227
|
#### Ubuntu 22.04 LTS
|
219
228
|
|
220
229
|
```bash
|
@@ -234,6 +243,22 @@ pipx install not1mm
|
|
234
243
|
pipx ensurepath
|
235
244
|
```
|
236
245
|
|
246
|
+
#### Ubuntu 24.04 LTS
|
247
|
+
|
248
|
+
```bash
|
249
|
+
sudo apt update
|
250
|
+
sudo apt upgrade
|
251
|
+
sudo apt install -y libportaudio2 pyqt6-dev-tools python3-pip
|
252
|
+
pip install --break-system-packages not1mm
|
253
|
+
source .profile
|
254
|
+
```
|
255
|
+
|
256
|
+
</details>
|
257
|
+
|
258
|
+
<details>
|
259
|
+
|
260
|
+
<summary><b>Fedora 38, 39 and 40</b></summary>
|
261
|
+
|
237
262
|
#### Fedora 38 & 39
|
238
263
|
|
239
264
|
```bash
|
@@ -242,6 +267,17 @@ sudo dnf install python3-pip portaudio
|
|
242
267
|
pip install not1mm
|
243
268
|
```
|
244
269
|
|
270
|
+
#### Fedora 40
|
271
|
+
|
272
|
+
```bash
|
273
|
+
sudo dnf upgrade --refresh
|
274
|
+
sudo dnf install python3-pip python3-pyqt6 portaudio
|
275
|
+
pip install not1mm
|
276
|
+
```
|
277
|
+
|
278
|
+
</details>
|
279
|
+
<br>
|
280
|
+
|
245
281
|
You can now open a new terminal and type not1mm. On it's first run, it may or
|
246
282
|
may not install a lovely non AI generated icon, which you can later click on to
|
247
283
|
launch the application.
|
@@ -293,6 +329,40 @@ If you need to later update not1mm, you can do so with:
|
|
293
329
|
pipx upgrade not1mm
|
294
330
|
```
|
295
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
|
+
|
296
366
|
## After the install
|
297
367
|
|
298
368
|
You can now open a new terminal and type `not1mm`. On it's first run, it may or
|
@@ -324,35 +394,6 @@ For a more permanent solution you can place the line
|
|
324
394
|
`export QT_QPA_PLATFORM=wayland` in your home directories .bashrc file. Then
|
325
395
|
after logging out and back in you should be able to launch it normally.
|
326
396
|
|
327
|
-
### Installing from GitHub source
|
328
|
-
|
329
|
-
Since this is packaged for PyPI, if you want to work on your own source branch,
|
330
|
-
after cloning from github you would:
|
331
|
-
|
332
|
-
```bash
|
333
|
-
pip install --upgrade pip
|
334
|
-
pip install setuptools
|
335
|
-
pip install build
|
336
|
-
source rebuild.sh
|
337
|
-
```
|
338
|
-
|
339
|
-
from the root directory. This installs a build chain and a local editable copy
|
340
|
-
of not1mm.
|
341
|
-
|
342
|
-
There's two ways to launch the program from the local editable copy.
|
343
|
-
|
344
|
-
You can either be in the root of the source directory and type:
|
345
|
-
|
346
|
-
```bash
|
347
|
-
python not1mm
|
348
|
-
```
|
349
|
-
|
350
|
-
or be in some other directory and just type:
|
351
|
-
|
352
|
-
```bash
|
353
|
-
not1mm
|
354
|
-
```
|
355
|
-
|
356
397
|
## Various data file locations
|
357
398
|
|
358
399
|
### Data
|
@@ -462,7 +503,10 @@ onscreen icon for CAT status. Green good, Red bad, Grey neither.
|
|
462
503
|
|
463
504
|
Under the `CW` TAB, There are three options. `cwdaemon`, which normally uses IP
|
464
505
|
`127.0.0.1` and port `6789`. `pywinkeyer` which normally uses IP `127.0.0.1` and
|
465
|
-
|
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.
|
466
510
|
|
467
511
|
### Cluster
|
468
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
|