not1mm 25.2.6__py3-none-any.whl → 25.2.22__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 +45 -22
- not1mm/data/configuration.ui +56 -12
- not1mm/data/main.ui +15 -0
- not1mm/data/new_contest.ui +5 -0
- not1mm/lib/settings.py +9 -2
- not1mm/lib/version.py +1 -1
- not1mm/plugins/randomgram.py +262 -0
- not1mm/voice_keying.py +1 -1
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/METADATA +24 -6
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/RECORD +14 -13
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/LICENSE +0 -0
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/WHEEL +0 -0
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/entry_points.txt +0 -0
- {not1mm-25.2.6.dist-info → not1mm-25.2.22.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -27,12 +27,6 @@ from shutil import copyfile
|
|
27
27
|
|
28
28
|
import notctyparser
|
29
29
|
|
30
|
-
try:
|
31
|
-
import sounddevice as sd
|
32
|
-
except OSError as exception:
|
33
|
-
print(exception)
|
34
|
-
print("portaudio is not installed")
|
35
|
-
sd = None
|
36
30
|
from PyQt6 import QtCore, QtGui, QtWidgets, uic, QtNetwork
|
37
31
|
from PyQt6.QtCore import QDir, Qt, QThread, QSettings, QCoreApplication
|
38
32
|
from PyQt6.QtGui import QFontDatabase, QColorConstants, QPalette, QColor, QPixmap
|
@@ -189,6 +183,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
189
183
|
|
190
184
|
current_widget = None
|
191
185
|
|
186
|
+
auto_cq = False
|
187
|
+
auto_cq_time = datetime.datetime.now()
|
188
|
+
auto_cq_delay = 15000
|
189
|
+
|
192
190
|
def __init__(self, splash):
|
193
191
|
super().__init__()
|
194
192
|
logger.info("MainWindow: __init__")
|
@@ -779,8 +777,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
779
777
|
group[item] = ""
|
780
778
|
count += 1
|
781
779
|
group_list.append(group)
|
782
|
-
# database.add_callhistory_item(group)
|
783
|
-
# print(f"{group=}")
|
784
780
|
except IndexError:
|
785
781
|
...
|
786
782
|
self.database.add_callhistory_items(group_list)
|
@@ -2030,6 +2026,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2030
2026
|
|
2031
2027
|
def stop_cw(self):
|
2032
2028
|
""""""
|
2029
|
+
self.auto_cq = False
|
2033
2030
|
if self.cw is not None:
|
2034
2031
|
if self.cw.servertype == 1:
|
2035
2032
|
self.cw.sendcw("\x1b4")
|
@@ -2086,9 +2083,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2086
2083
|
ABCDEFGHIJKLMNOPQRSTUVWXY
|
2087
2084
|
"""
|
2088
2085
|
modifier = event.modifiers()
|
2089
|
-
# the_key = event.key()
|
2090
|
-
|
2091
|
-
# print(f"Modifier is {modifier=} Key is {the_key=}")
|
2092
2086
|
|
2093
2087
|
if (
|
2094
2088
|
event.key() == Qt.Key.Key_Equal
|
@@ -2149,16 +2143,17 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2149
2143
|
event.key() == Qt.Key.Key_Escape
|
2150
2144
|
and modifier != Qt.KeyboardModifier.ControlModifier
|
2151
2145
|
):
|
2152
|
-
|
2153
|
-
|
2154
|
-
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2159
|
-
|
2160
|
-
|
2161
|
-
|
2146
|
+
self.stop_cw()
|
2147
|
+
# if self.cw is not None:
|
2148
|
+
# if self.cw.servertype == 1:
|
2149
|
+
# self.cw.sendcw("\x1b4")
|
2150
|
+
# return
|
2151
|
+
# if self.rig_control:
|
2152
|
+
# if self.rig_control.online:
|
2153
|
+
# if self.pref.get("cwtype") == 3 and self.rig_control is not None:
|
2154
|
+
# if self.rig_control.interface == "flrig":
|
2155
|
+
# self.rig_control.cat.set_flrig_cw_send(False)
|
2156
|
+
# self.rig_control.cat.set_flrig_cw_send(True)
|
2162
2157
|
if event.key() == Qt.Key.Key_Up:
|
2163
2158
|
cmd = {}
|
2164
2159
|
cmd["cmd"] = "PREVSPOT"
|
@@ -2274,27 +2269,43 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2274
2269
|
next_tab.end(False)
|
2275
2270
|
return
|
2276
2271
|
if event.key() == Qt.Key.Key_F1:
|
2272
|
+
if event.modifiers() == Qt.KeyboardModifier.ShiftModifier:
|
2273
|
+
self.auto_cq = True
|
2274
|
+
self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
|
2275
|
+
milliseconds=self.auto_cq_delay
|
2276
|
+
)
|
2277
2277
|
self.process_function_key(self.F1)
|
2278
|
+
return
|
2278
2279
|
if event.key() == Qt.Key.Key_F2:
|
2279
2280
|
self.process_function_key(self.F2)
|
2281
|
+
return
|
2280
2282
|
if event.key() == Qt.Key.Key_F3:
|
2281
2283
|
self.process_function_key(self.F3)
|
2284
|
+
return
|
2282
2285
|
if event.key() == Qt.Key.Key_F4:
|
2283
2286
|
self.process_function_key(self.F4)
|
2287
|
+
return
|
2284
2288
|
if event.key() == Qt.Key.Key_F5:
|
2285
2289
|
self.process_function_key(self.F5)
|
2290
|
+
return
|
2286
2291
|
if event.key() == Qt.Key.Key_F6:
|
2287
2292
|
self.process_function_key(self.F6)
|
2293
|
+
return
|
2288
2294
|
if event.key() == Qt.Key.Key_F7:
|
2289
2295
|
self.process_function_key(self.F7)
|
2296
|
+
return
|
2290
2297
|
if event.key() == Qt.Key.Key_F8:
|
2291
2298
|
self.process_function_key(self.F8)
|
2299
|
+
return
|
2292
2300
|
if event.key() == Qt.Key.Key_F9:
|
2293
2301
|
self.process_function_key(self.F9)
|
2302
|
+
return
|
2294
2303
|
if event.key() == Qt.Key.Key_F10:
|
2295
2304
|
self.process_function_key(self.F10)
|
2305
|
+
return
|
2296
2306
|
if event.key() == Qt.Key.Key_F11:
|
2297
2307
|
self.process_function_key(self.F11)
|
2308
|
+
return
|
2298
2309
|
if event.key() == Qt.Key.Key_F12:
|
2299
2310
|
self.process_function_key(self.F12)
|
2300
2311
|
|
@@ -2997,12 +3008,16 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2997
3008
|
self.rtc_pass = self.pref.get("rtc_pass", "")
|
2998
3009
|
self.rtc_interval = self.pref.get("rtc_interval", 2)
|
2999
3010
|
|
3011
|
+
try:
|
3012
|
+
self.auto_cq_delay = int(self.pref.get("auto_cq_interval", 15)) * 1000
|
3013
|
+
except ValueError:
|
3014
|
+
self.auto_cq_delay = 15000
|
3015
|
+
|
3000
3016
|
if self.pref.get("send_rtc_scores", False):
|
3001
3017
|
self.rtc_service = RTCService()
|
3002
3018
|
self.rtc_service.moveToThread(self.rtc_thread)
|
3003
3019
|
self.rtc_thread.started.connect(self.rtc_service.run)
|
3004
3020
|
self.rtc_thread.finished.connect(self.rtc_service.deleteLater)
|
3005
|
-
# self.rtc_service.poll_callback.connect(self.rtc_result)
|
3006
3021
|
self.rtc_thread.start()
|
3007
3022
|
self.rtc_service.rtc_callback.connect(self.rtc_response)
|
3008
3023
|
|
@@ -3336,6 +3351,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3336
3351
|
-------
|
3337
3352
|
None
|
3338
3353
|
"""
|
3354
|
+
if self.auto_cq is True:
|
3355
|
+
self.stop_cw()
|
3339
3356
|
text = self.callsign.text()
|
3340
3357
|
text = text.upper()
|
3341
3358
|
position = self.callsign.cursorPosition()
|
@@ -3696,6 +3713,12 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3696
3713
|
Passing in a dictionary object with the
|
3697
3714
|
vfo freq, mode, bandwidth, and online state of the radio.
|
3698
3715
|
"""
|
3716
|
+
if self.auto_cq is True:
|
3717
|
+
if datetime.datetime.now() > self.auto_cq_time:
|
3718
|
+
self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
|
3719
|
+
milliseconds=self.auto_cq_delay
|
3720
|
+
)
|
3721
|
+
self.process_function_key(self.F1)
|
3699
3722
|
logger.debug(f"{the_dict=}")
|
3700
3723
|
self.set_radio_icon(0)
|
3701
3724
|
info_dirty = False
|
not1mm/data/configuration.ui
CHANGED
@@ -2244,24 +2244,68 @@
|
|
2244
2244
|
</widget>
|
2245
2245
|
</item>
|
2246
2246
|
<item>
|
2247
|
-
<
|
2248
|
-
<property name="
|
2249
|
-
<
|
2247
|
+
<layout class="QFormLayout" name="formLayout_3">
|
2248
|
+
<property name="bottomMargin">
|
2249
|
+
<number>0</number>
|
2250
2250
|
</property>
|
2251
|
-
<
|
2252
|
-
<
|
2251
|
+
<item row="0" column="0">
|
2252
|
+
<widget class="QLabel" name="label_28">
|
2253
|
+
<property name="text">
|
2254
|
+
<string>Post Interval (minutes)</string>
|
2255
|
+
</property>
|
2256
|
+
<property name="alignment">
|
2257
|
+
<set>Qt::AlignCenter</set>
|
2258
|
+
</property>
|
2259
|
+
</widget>
|
2260
|
+
</item>
|
2261
|
+
<item row="0" column="1">
|
2262
|
+
<widget class="QLineEdit" name="rtc_interval">
|
2263
|
+
<property name="text">
|
2264
|
+
<string>2</string>
|
2265
|
+
</property>
|
2266
|
+
<property name="alignment">
|
2267
|
+
<set>Qt::AlignCenter</set>
|
2268
|
+
</property>
|
2269
|
+
</widget>
|
2270
|
+
</item>
|
2271
|
+
</layout>
|
2272
|
+
</item>
|
2273
|
+
<item>
|
2274
|
+
<widget class="Line" name="line_3">
|
2275
|
+
<property name="orientation">
|
2276
|
+
<enum>Qt::Horizontal</enum>
|
2253
2277
|
</property>
|
2254
2278
|
</widget>
|
2255
2279
|
</item>
|
2256
2280
|
<item>
|
2257
|
-
<
|
2258
|
-
<property name="
|
2259
|
-
<
|
2281
|
+
<layout class="QFormLayout" name="formLayout_2">
|
2282
|
+
<property name="horizontalSpacing">
|
2283
|
+
<number>6</number>
|
2260
2284
|
</property>
|
2261
|
-
<property name="
|
2262
|
-
<
|
2285
|
+
<property name="verticalSpacing">
|
2286
|
+
<number>6</number>
|
2263
2287
|
</property>
|
2264
|
-
|
2288
|
+
<property name="bottomMargin">
|
2289
|
+
<number>0</number>
|
2290
|
+
</property>
|
2291
|
+
<item row="0" column="0">
|
2292
|
+
<widget class="QLabel" name="label_30">
|
2293
|
+
<property name="text">
|
2294
|
+
<string>Auto CQ Delay (Seconds)</string>
|
2295
|
+
</property>
|
2296
|
+
</widget>
|
2297
|
+
</item>
|
2298
|
+
<item row="0" column="1">
|
2299
|
+
<widget class="QLineEdit" name="auto_cq_delay">
|
2300
|
+
<property name="text">
|
2301
|
+
<string>15</string>
|
2302
|
+
</property>
|
2303
|
+
<property name="alignment">
|
2304
|
+
<set>Qt::AlignCenter</set>
|
2305
|
+
</property>
|
2306
|
+
</widget>
|
2307
|
+
</item>
|
2308
|
+
</layout>
|
2265
2309
|
</item>
|
2266
2310
|
<item>
|
2267
2311
|
<spacer name="verticalSpacer_8">
|
@@ -2397,7 +2441,7 @@
|
|
2397
2441
|
</property>
|
2398
2442
|
</designerdata>
|
2399
2443
|
<buttongroups>
|
2400
|
-
<buttongroup name="buttonGroup"/>
|
2401
2444
|
<buttongroup name="buttonGroup_2"/>
|
2445
|
+
<buttongroup name="buttonGroup"/>
|
2402
2446
|
</buttongroups>
|
2403
2447
|
</ui>
|
not1mm/data/main.ui
CHANGED
@@ -1745,6 +1745,9 @@
|
|
1745
1745
|
<family>JetBrains Mono ExtraLight</family>
|
1746
1746
|
</font>
|
1747
1747
|
</property>
|
1748
|
+
<property name="shortcut">
|
1749
|
+
<string>Alt+L</string>
|
1750
|
+
</property>
|
1748
1751
|
<property name="autoRepeat">
|
1749
1752
|
<bool>false</bool>
|
1750
1753
|
</property>
|
@@ -1913,6 +1916,9 @@
|
|
1913
1916
|
<family>JetBrains Mono ExtraLight</family>
|
1914
1917
|
</font>
|
1915
1918
|
</property>
|
1919
|
+
<property name="shortcut">
|
1920
|
+
<string>Alt+B</string>
|
1921
|
+
</property>
|
1916
1922
|
</action>
|
1917
1923
|
<action name="actionQuit">
|
1918
1924
|
<property name="text">
|
@@ -1961,6 +1967,9 @@
|
|
1961
1967
|
<family>JetBrains Mono ExtraLight</family>
|
1962
1968
|
</font>
|
1963
1969
|
</property>
|
1970
|
+
<property name="shortcut">
|
1971
|
+
<string>Alt+C</string>
|
1972
|
+
</property>
|
1964
1973
|
</action>
|
1965
1974
|
<action name="actionRate_Window">
|
1966
1975
|
<property name="checkable">
|
@@ -1974,6 +1983,9 @@
|
|
1974
1983
|
<family>JetBrains Mono ExtraLight</family>
|
1975
1984
|
</font>
|
1976
1985
|
</property>
|
1986
|
+
<property name="shortcut">
|
1987
|
+
<string>Alt+R</string>
|
1988
|
+
</property>
|
1977
1989
|
</action>
|
1978
1990
|
<action name="actionVFO">
|
1979
1991
|
<property name="checkable">
|
@@ -1987,6 +1999,9 @@
|
|
1987
1999
|
<family>JetBrains Mono ExtraLight</family>
|
1988
2000
|
</font>
|
1989
2001
|
</property>
|
2002
|
+
<property name="shortcut">
|
2003
|
+
<string>Alt+V</string>
|
2004
|
+
</property>
|
1990
2005
|
</action>
|
1991
2006
|
<action name="actionDark_Mode_2">
|
1992
2007
|
<property name="checkable">
|
not1mm/data/new_contest.ui
CHANGED
not1mm/lib/settings.py
CHANGED
@@ -6,8 +6,6 @@ from PyQt6 import QtWidgets, uic
|
|
6
6
|
try:
|
7
7
|
import sounddevice as sd
|
8
8
|
except OSError as exception:
|
9
|
-
print(exception)
|
10
|
-
print("portaudio is not installed")
|
11
9
|
sd = None
|
12
10
|
|
13
11
|
|
@@ -54,6 +52,8 @@ class Settings(QtWidgets.QDialog):
|
|
54
52
|
self.rtc_pass.setText(str(self.preference.get("rtc_pass", "")))
|
55
53
|
self.rtc_interval.setText(str(self.preference.get("rtc_interval", "2")))
|
56
54
|
|
55
|
+
self.auto_cq_delay.setText(str(self.preference.get("auto_cq_interval", "15")))
|
56
|
+
|
57
57
|
self.use_call_history.setChecked(
|
58
58
|
bool(self.preference.get("use_call_history", False))
|
59
59
|
)
|
@@ -221,6 +221,13 @@ class Settings(QtWidgets.QDialog):
|
|
221
221
|
except ValueError:
|
222
222
|
self.preference["rtc_interval"] = 2
|
223
223
|
|
224
|
+
try:
|
225
|
+
self.preference["auto_cq_interval"] = int(self.auto_cq_delay.text())
|
226
|
+
except ValueError:
|
227
|
+
self.preference["auto_cq_interval"] = 15
|
228
|
+
|
229
|
+
self.auto_cq_delay.setText(str(self.preference.get("auto_cq_interval", "15")))
|
230
|
+
|
224
231
|
self.preference["use_call_history"] = self.use_call_history.isChecked()
|
225
232
|
self.preference["use_esm"] = self.use_esm.isChecked()
|
226
233
|
self.preference["esm_cq"] = self.esm_cq.currentText()
|
not1mm/lib/version.py
CHANGED
@@ -0,0 +1,262 @@
|
|
1
|
+
"""RandomGram plugin"""
|
2
|
+
|
3
|
+
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
|
4
|
+
|
5
|
+
import logging
|
6
|
+
import os
|
7
|
+
|
8
|
+
from PyQt6 import QtWidgets
|
9
|
+
|
10
|
+
from not1mm.lib.plugin_common import gen_adif
|
11
|
+
from not1mm.lib.version import __version__
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
EXCHANGE_HINT = ""
|
15
|
+
name = "RandomGram"
|
16
|
+
cabrillo_name = "RANDOMGRAM"
|
17
|
+
mode = "CW" # CW SSB BOTH RTTY
|
18
|
+
columns = [
|
19
|
+
"YYYY-MM-DD HH:MM:SS",
|
20
|
+
"Call",
|
21
|
+
"Freq",
|
22
|
+
"Snt",
|
23
|
+
"Rcv",
|
24
|
+
"SentNr",
|
25
|
+
"RcvNr",
|
26
|
+
]
|
27
|
+
|
28
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
29
|
+
dupe_type = 4
|
30
|
+
|
31
|
+
rgGroupsPath = os.path.join(os.path.expanduser("~"), "rg.txt")
|
32
|
+
try:
|
33
|
+
with open(rgGroupsPath, "r") as f:
|
34
|
+
rgGroups = f.readlines()
|
35
|
+
except:
|
36
|
+
rgGroups = []
|
37
|
+
|
38
|
+
def init_contest(self):
|
39
|
+
"""setup plugin"""
|
40
|
+
set_tab_next(self)
|
41
|
+
set_tab_prev(self)
|
42
|
+
interface(self)
|
43
|
+
self.next_field = self.other_2
|
44
|
+
|
45
|
+
|
46
|
+
def interface(self):
|
47
|
+
"""Setup user interface"""
|
48
|
+
self.field1.show()
|
49
|
+
self.field2.show()
|
50
|
+
self.field3.show()
|
51
|
+
self.field4.show()
|
52
|
+
self.snt_label.setText("SNT")
|
53
|
+
self.field1.setAccessibleName("RST Sent")
|
54
|
+
self.other_label.setText("SentRG")
|
55
|
+
self.field3.setAccessibleName("Sent RandomGram")
|
56
|
+
self.exch_label.setText("RcvRG")
|
57
|
+
self.field4.setAccessibleName("Received RandomGram")
|
58
|
+
|
59
|
+
|
60
|
+
def reset_label(self):
|
61
|
+
"""reset label after field cleared"""
|
62
|
+
|
63
|
+
|
64
|
+
def set_tab_next(self):
|
65
|
+
"""Set TAB Advances"""
|
66
|
+
self.tab_next = {
|
67
|
+
self.callsign: self.sent,
|
68
|
+
self.sent: self.receive,
|
69
|
+
self.receive: self.other_1,
|
70
|
+
self.other_1: self.other_2,
|
71
|
+
self.other_2: self.callsign,
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
def set_tab_prev(self):
|
76
|
+
"""Set TAB Advances"""
|
77
|
+
self.tab_prev = {
|
78
|
+
self.callsign: self.other_2,
|
79
|
+
self.sent: self.callsign,
|
80
|
+
self.receive: self.sent,
|
81
|
+
self.other_1: self.receive,
|
82
|
+
self.other_2: self.other_1,
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
def set_contact_vars(self):
|
87
|
+
"""Contest Specific"""
|
88
|
+
self.contact["SNT"] = self.sent.text()
|
89
|
+
self.contact["RCV"] = self.receive.text()
|
90
|
+
self.contact["Comment"] = self.other_2.text()
|
91
|
+
self.contact["SentNr"] = self.other_1.text()
|
92
|
+
self.contact["NR"] = self.other_2.text()
|
93
|
+
|
94
|
+
|
95
|
+
def predupe(self):
|
96
|
+
"""called after callsign entered"""
|
97
|
+
|
98
|
+
|
99
|
+
def prefill(self):
|
100
|
+
"""Fill SentNR"""
|
101
|
+
qso_count = show_qso(self)
|
102
|
+
if len(rgGroups) <= qso_count:
|
103
|
+
return
|
104
|
+
|
105
|
+
nextRG = rgGroups[qso_count]
|
106
|
+
if len(nextRG) > 0:
|
107
|
+
self.other_1.setText(nextRG)
|
108
|
+
|
109
|
+
|
110
|
+
def points(self):
|
111
|
+
"""Calc point"""
|
112
|
+
return 2
|
113
|
+
|
114
|
+
|
115
|
+
def show_mults(self):
|
116
|
+
"""Return display string for mults"""
|
117
|
+
|
118
|
+
|
119
|
+
def show_qso(self):
|
120
|
+
"""Return qso count"""
|
121
|
+
result = self.database.fetch_qso_count()
|
122
|
+
if result:
|
123
|
+
return int(result.get("qsos", 0))
|
124
|
+
return 0
|
125
|
+
|
126
|
+
|
127
|
+
def calc_score(self):
|
128
|
+
"""Return calculated score"""
|
129
|
+
result = self.database.fetch_points()
|
130
|
+
|
131
|
+
|
132
|
+
def adif(self):
|
133
|
+
"""Call the generate ADIF function"""
|
134
|
+
gen_adif(self, cabrillo_name)
|
135
|
+
|
136
|
+
|
137
|
+
def cabrillo(self, file_encoding):
|
138
|
+
"""Generates Cabrillo file. Maybe."""
|
139
|
+
|
140
|
+
|
141
|
+
def recalculate_mults(self):
|
142
|
+
"""Recalculates multipliers after change in logged qso."""
|
143
|
+
|
144
|
+
|
145
|
+
def process_esm(self, new_focused_widget=None, with_enter=False):
|
146
|
+
"""ESM State Machine"""
|
147
|
+
|
148
|
+
# self.pref["run_state"]
|
149
|
+
|
150
|
+
# -----===== Assigned F-Keys =====-----
|
151
|
+
# self.esm_dict["CQ"]
|
152
|
+
# self.esm_dict["EXCH"]
|
153
|
+
# self.esm_dict["QRZ"]
|
154
|
+
# self.esm_dict["AGN"]
|
155
|
+
# self.esm_dict["HISCALL"]
|
156
|
+
# self.esm_dict["MYCALL"]
|
157
|
+
# self.esm_dict["QSOB4"]
|
158
|
+
|
159
|
+
# ----==== text fields ====----
|
160
|
+
# self.callsign
|
161
|
+
# self.sent
|
162
|
+
# self.receive
|
163
|
+
# self.other_1
|
164
|
+
# self.other_2
|
165
|
+
|
166
|
+
if new_focused_widget is not None:
|
167
|
+
self.current_widget = self.inputs_dict.get(new_focused_widget)
|
168
|
+
|
169
|
+
# print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
|
170
|
+
|
171
|
+
for a_button in [
|
172
|
+
self.F1,
|
173
|
+
self.F2,
|
174
|
+
self.F3,
|
175
|
+
self.F4,
|
176
|
+
self.F5,
|
177
|
+
self.F6,
|
178
|
+
self.F7,
|
179
|
+
self.F8,
|
180
|
+
self.F9,
|
181
|
+
self.F10,
|
182
|
+
self.F11,
|
183
|
+
self.F12,
|
184
|
+
]:
|
185
|
+
self.restore_button_color(a_button)
|
186
|
+
|
187
|
+
buttons_to_send = []
|
188
|
+
|
189
|
+
if self.pref.get("run_state"):
|
190
|
+
if self.current_widget == "callsign":
|
191
|
+
if len(self.callsign.text()) < 3:
|
192
|
+
self.make_button_green(self.esm_dict["CQ"])
|
193
|
+
buttons_to_send.append(self.esm_dict["CQ"])
|
194
|
+
elif len(self.callsign.text()) > 2:
|
195
|
+
self.make_button_green(self.esm_dict["HISCALL"])
|
196
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
197
|
+
buttons_to_send.append(self.esm_dict["HISCALL"])
|
198
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
199
|
+
|
200
|
+
# elif self.current_widget in ["other_1", "other_2"]:
|
201
|
+
# if self.other_2.text() == "" and self.other_1.text() == "":
|
202
|
+
# self.make_button_green(self.esm_dict["AGN"])
|
203
|
+
# buttons_to_send.append(self.esm_dict["AGN"])
|
204
|
+
# else:
|
205
|
+
# self.make_button_green(self.esm_dict["QRZ"])
|
206
|
+
# buttons_to_send.append(self.esm_dict["QRZ"])
|
207
|
+
# buttons_to_send.append("LOGIT")
|
208
|
+
|
209
|
+
elif self.current_widget in ["other_1", "other_2"]:
|
210
|
+
buttons_to_send.append("LOGIT")
|
211
|
+
|
212
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
213
|
+
for button in buttons_to_send:
|
214
|
+
if button:
|
215
|
+
if button == "LOGIT":
|
216
|
+
self.save_contact()
|
217
|
+
continue
|
218
|
+
self.process_function_key(button)
|
219
|
+
else:
|
220
|
+
if self.current_widget == "callsign":
|
221
|
+
if len(self.callsign.text()) > 2:
|
222
|
+
self.make_button_green(self.esm_dict["MYCALL"])
|
223
|
+
buttons_to_send.append(self.esm_dict["MYCALL"])
|
224
|
+
|
225
|
+
# elif self.current_widget in ["other_1", "other_2"]:
|
226
|
+
# if self.other_2.text() == "" and self.other_1.text() == "":
|
227
|
+
# self.make_button_green(self.esm_dict["AGN"])
|
228
|
+
# buttons_to_send.append(self.esm_dict["AGN"])
|
229
|
+
# else:
|
230
|
+
# self.make_button_green(self.esm_dict["EXCH"])
|
231
|
+
# buttons_to_send.append(self.esm_dict["EXCH"])
|
232
|
+
# buttons_to_send.append("LOGIT")
|
233
|
+
|
234
|
+
elif self.current_widget in ["other_1", "other_2"]:
|
235
|
+
buttons_to_send.append("LOGIT")
|
236
|
+
|
237
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
238
|
+
for button in buttons_to_send:
|
239
|
+
if button:
|
240
|
+
if button == "LOGIT":
|
241
|
+
self.save_contact()
|
242
|
+
continue
|
243
|
+
self.process_function_key(button)
|
244
|
+
|
245
|
+
|
246
|
+
def populate_history_info_line(self):
|
247
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
248
|
+
if result:
|
249
|
+
self.history_info.setText(
|
250
|
+
f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('UserText','...')}"
|
251
|
+
)
|
252
|
+
else:
|
253
|
+
self.history_info.setText("")
|
254
|
+
|
255
|
+
|
256
|
+
def check_call_history(self):
|
257
|
+
""""""
|
258
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
259
|
+
if result:
|
260
|
+
self.history_info.setText(f"{result.get('UserText','')}")
|
261
|
+
if self.other_1.text() == "":
|
262
|
+
self.other_1.setText(f"{result.get('Name', '')}")
|
not1mm/voice_keying.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: not1mm
|
3
|
-
Version: 25.2.
|
3
|
+
Version: 25.2.22
|
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
|
@@ -102,7 +102,10 @@ Requires-Dist: Levenshtein
|
|
102
102
|
- [Options](#options)
|
103
103
|
- [Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts](#logging-wsjt-x-ft8ft4etc-and-fldigi-rtty-contacts)
|
104
104
|
- [Sending CW](#sending-cw)
|
105
|
-
|
105
|
+
- [Sending CW Macros](#sending-cw-macros)
|
106
|
+
- [Auto CQ](#auto-cq)
|
107
|
+
- [Sending CW Free Form](#sending-cw-free-form)
|
108
|
+
- [Editing macro keys](#editing-macro-keys)
|
106
109
|
- [Macro substitutions](#macro-substitutions)
|
107
110
|
- [Macro use with voice](#macro-use-with-voice)
|
108
111
|
- [cty.dat and QRZ lookups for distance and bearing](#ctydat-and-qrz-lookups-for-distance-and-bearing)
|
@@ -228,6 +231,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
228
231
|
- NAQP CW, RTTY, SSB
|
229
232
|
- Phone Weekly Test
|
230
233
|
- RAEM
|
234
|
+
- RandomGram
|
231
235
|
- RAC Canada Day
|
232
236
|
- REF CW, SSB
|
233
237
|
- Stew Perry Topband
|
@@ -236,6 +240,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
236
240
|
|
237
241
|
## Recent Changes
|
238
242
|
|
243
|
+
- [25-2-22] Add Auto CQ.
|
244
|
+
- [25-2-12] Merged PR from @alduhoo Adding RandomGram event.
|
239
245
|
- [25-2-6] Trimmed out newer tags from UI files, 'cause stuff be old sometimes.
|
240
246
|
|
241
247
|
See [CHANGELOG.md](CHANGELOG.md) for prior changes.
|
@@ -631,15 +637,27 @@ Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
|
|
631
637
|
|
632
638
|
## Sending CW
|
633
639
|
|
640
|
+
### Sending CW Macros
|
641
|
+
|
634
642
|
Other than sending CW by hand, you can also send predefined CW text messages by
|
635
|
-
pressing F1 - F12. See next section on Editing macro keys.
|
643
|
+
pressing F1 - F12. See next section on Editing macro keys.
|
644
|
+
|
645
|
+
### Auto CQ
|
646
|
+
|
647
|
+
If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
|
648
|
+
after each Auto CQ Delay interval has passed. The delay can be changed by going to the
|
649
|
+
`Options` TAB in the Configuration dialog.
|
650
|
+
|
651
|
+
The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
|
652
|
+
|
653
|
+
### Sending CW Free Form
|
636
654
|
|
637
655
|
If you need to send something freeform, you can press `CTRL-SHIFT-K`, this will
|
638
656
|
expose an entry field at the bottom of the window which you can type directly into.
|
639
657
|
When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
|
640
658
|
close the field.
|
641
659
|
|
642
|
-
|
660
|
+
### Editing macro keys
|
643
661
|
|
644
662
|
To edit the macros, choose `File` > `Edit Macros`. This will open your systems
|
645
663
|
registered text editor with current macros loaded. When your done just save the
|
@@ -686,7 +704,7 @@ files in your own voice.
|
|
686
704
|
Aside from the `[filename]` wav files, there are also NATO phonetic wav files
|
687
705
|
for each letter and number. So if your macro key holds
|
688
706
|
`{HISCALL} {SNT} {SENTNR}` and you have entered K5TUX in callsign field during
|
689
|
-
CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9
|
707
|
+
CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9, 3.
|
690
708
|
Hopefully not in an idiots voice.
|
691
709
|
|
692
710
|
## cty.dat and QRZ lookups for distance and bearing
|
@@ -694,7 +712,7 @@ Hopefully not in an idiots voice.
|
|
694
712
|
When a callsign is entered, a look up is first done in a cty.dat file to
|
695
713
|
determin the country of origin, geographic center, cq zone and ITU region.
|
696
714
|
Great circle calculations are done to determin the heading and distance from
|
697
|
-
your gridsquare to the
|
715
|
+
your gridsquare to the geographic center. This information then displayed at the
|
698
716
|
bottom left.
|
699
717
|
|
700
718
|

|
@@ -1,5 +1,5 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=4Jv9ksSCUlh92_wpUW3eGRPAYwv5jN_7WzE_ayW_33A,147950
|
3
3
|
not1mm/bandmap.py,sha256=vaOeqv_gW0-K0P3xA9JYcuiFILiKw601tjHQCwuoV-s,31260
|
4
4
|
not1mm/checkwindow.py,sha256=VFAcKYTcoWhmIf91chwY6tyao9FQMWPiUkgDDkkWaog,9670
|
5
5
|
not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
|
@@ -10,7 +10,7 @@ not1mm/ratewindow.py,sha256=UVkQt0nSB2COQlJQV6tFtsz4mP7d-Wj9jcjqvZw934Q,9891
|
|
10
10
|
not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
|
11
11
|
not1mm/test.py,sha256=RN71m2S9MPIOJMaoCi0wZhwEhpEZunvtosZxaKahRB4,101
|
12
12
|
not1mm/vfo.py,sha256=ggPyWtxMbdSE5RwdK0nDRwDNqOxdpb_pvnzZdbzZVQE,11136
|
13
|
-
not1mm/voice_keying.py,sha256=
|
13
|
+
not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
|
14
14
|
not1mm/data/JetBrainsMono-ExtraLight.ttf,sha256=g5Hn7BPounWMGDj1a8zZcyKMz03HSqW__pUluRR7Evg,274144
|
15
15
|
not1mm/data/MASTER.SCP,sha256=FWKs4Xw3w7FNUt2npA6VzsLME7NAbHRugxaL6TnsvzU,364234
|
16
16
|
not1mm/data/about.ui,sha256=IzbwKQZ_Ea06qGEjJgsa7g8-oYk549f-MEpLtChiLvw,2078
|
@@ -18,7 +18,7 @@ not1mm/data/alpha bravo charlie delta.txt,sha256=d5QMmSWEUAe4Rj1XbNjTPLa_5Be4Se6
|
|
18
18
|
not1mm/data/bandmap.ui,sha256=rh9GHdBOIfrOmamR6zUZ15aJ4VDsX5mQoVuZs8bV8TI,8034
|
19
19
|
not1mm/data/check.png,sha256=UvFOLr8V-79qnjW8wUaGItXk_OSP8m8hqPevs8NDlFY,387
|
20
20
|
not1mm/data/checkwindow.ui,sha256=PRD98K0julJ9EfWqoE89dT8UPuPKQzGiWBk_efAko3o,5141
|
21
|
-
not1mm/data/configuration.ui,sha256=
|
21
|
+
not1mm/data/configuration.ui,sha256=mqhEvxD9lQGeoEkUrvbO9uNrOG62z6EIUUMa_b_SG-o,74752
|
22
22
|
not1mm/data/contests.sql,sha256=4hmJCDvrbxnA_Y5S4T5o52TZieeFk6QUwFerwlFePNA,89307
|
23
23
|
not1mm/data/cty.json,sha256=dPG9K1Pm4Rxd4uJom_gQ8y-sbqiZfILpl4kBAFnOveU,4877142
|
24
24
|
not1mm/data/cwmacros.txt,sha256=NztufsX6R52gAO7VyJ2AHr7wOh41pJTwHKh5Lcs32ds,468
|
@@ -32,8 +32,8 @@ not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcC
|
|
32
32
|
not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N90,2925
|
33
33
|
not1mm/data/logwindow.ui,sha256=f7vULj96tHIQuR1nJMyvPHHcmVgzkhv9D1isyojsnFU,1458
|
34
34
|
not1mm/data/logwindowx.ui,sha256=CwpI-h7cI1yqyldH9quKftsdHL5lTyL9ABOcf80nfqc,1632
|
35
|
-
not1mm/data/main.ui,sha256=
|
36
|
-
not1mm/data/new_contest.ui,sha256=
|
35
|
+
not1mm/data/main.ui,sha256=cYy2Zk0bDNK2cJOANivXheML4_y27CAmO7DR_yscNT0,62814
|
36
|
+
not1mm/data/new_contest.ui,sha256=WVTVQ69vnQNKOIi88KPPLgY5hvW3DdgX-pkQtHdaovY,24170
|
37
37
|
not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
|
38
38
|
not1mm/data/opon.ui,sha256=QDicqAk2lORG2UWsHa6jHlsGn6uzrrI2R4HSAocpPes,2258
|
39
39
|
not1mm/data/pickcontest.ui,sha256=4hPBszCglObThx_eIWtmK9CEcbr7WBjbB1rKZdI-o3I,1707
|
@@ -114,9 +114,9 @@ not1mm/lib/n1mm.py,sha256=H54mpgJF0GAmKavM-nb5OAq2SJFWYkux4eMWWiSRxJc,6288
|
|
114
114
|
not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
|
115
115
|
not1mm/lib/plugin_common.py,sha256=M5reDYM-v5IjAa2yTROvZTeTDkXYHb3U52W9mc9GxwA,13213
|
116
116
|
not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
|
117
|
-
not1mm/lib/settings.py,sha256=
|
117
|
+
not1mm/lib/settings.py,sha256=mXffn8Xaj5KATPQinNBR0V5DbHWQPsRfh24_axWGYuk,15254
|
118
118
|
not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
|
119
|
-
not1mm/lib/version.py,sha256=
|
119
|
+
not1mm/lib/version.py,sha256=YyHhlv86HqZt-y6-w0bTg49_FZBc1moC-gosWfGb0HA,48
|
120
120
|
not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
|
121
121
|
not1mm/plugins/10_10_fall_cw.py,sha256=5QUyGMvGBC-HxcY_z9QbfuxSg3f7p6C9K4qhTxgZE7k,14719
|
122
122
|
not1mm/plugins/10_10_spring_cw.py,sha256=XjYFM263WYyG6nVQzPObW4YC7Z9L93rixSOcVsxPvH4,14722
|
@@ -161,14 +161,15 @@ not1mm/plugins/naqp_rtty.py,sha256=JbjsY9DvVexXdzoPE4k9zSmcYNEMQpB9lrxdRxl_ldc,2
|
|
161
161
|
not1mm/plugins/naqp_ssb.py,sha256=4ZnlvCwvuX53dvqQdsdj6ipE8U7MZBPKPkMgxdDuzF8,17814
|
162
162
|
not1mm/plugins/phone_weekly_test.py,sha256=9Ue-n4VnZoFOc47ubaegT6ky0-38flMnm5VeieAk_UA,16308
|
163
163
|
not1mm/plugins/raem.py,sha256=yF4WK-T8aPDxSI3pxVwYW-Q7eW9n5gvuaslEBoTYcsI,19562
|
164
|
+
not1mm/plugins/randomgram.py,sha256=h68Ul57maCRhZOou7jU4_B1Dfd3d4n5r-Qzex80yJOk,7401
|
164
165
|
not1mm/plugins/ref_cw.py,sha256=R5W2rooxjsKvbLvEm-kr6kFLrzB6T60fVUl2ETei7ws,21319
|
165
166
|
not1mm/plugins/ref_ssb.py,sha256=Z_XmMpYKcI5dZh4TQqvQDcz-cLpMzpDEKBnb5iHeBLQ,21530
|
166
167
|
not1mm/plugins/stew_perry_topband.py,sha256=D1hekmMbx-i4BhaP2uzOK3OzaVVMMdgcN3RmfweNqHo,15341
|
167
168
|
not1mm/plugins/weekly_rtty.py,sha256=rdlIrsxBeuj-RQc5OStVNF7sGCtBK5t6inN5Z7DI4tw,20066
|
168
169
|
not1mm/plugins/winter_field_day.py,sha256=JK4r1vfxs7aADR7ZYbjZniz3f5s3_ipSQDZ0GRNWC7I,15222
|
169
|
-
not1mm-25.2.
|
170
|
-
not1mm-25.2.
|
171
|
-
not1mm-25.2.
|
172
|
-
not1mm-25.2.
|
173
|
-
not1mm-25.2.
|
174
|
-
not1mm-25.2.
|
170
|
+
not1mm-25.2.22.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
171
|
+
not1mm-25.2.22.dist-info/METADATA,sha256=SRA1jtgHVpebHddRFUlRAP8Vdbg70-TS3glCQIFqCA4,36125
|
172
|
+
not1mm-25.2.22.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
173
|
+
not1mm-25.2.22.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
174
|
+
not1mm-25.2.22.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
175
|
+
not1mm-25.2.22.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|