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 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
- if self.cw is not None:
2153
- if self.cw.servertype == 1:
2154
- self.cw.sendcw("\x1b4")
2155
- return
2156
- if self.rig_control:
2157
- if self.rig_control.online:
2158
- if self.pref.get("cwtype") == 3 and self.rig_control is not None:
2159
- if self.rig_control.interface == "flrig":
2160
- self.rig_control.cat.set_flrig_cw_send(False)
2161
- self.rig_control.cat.set_flrig_cw_send(True)
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
@@ -2244,24 +2244,68 @@
2244
2244
  </widget>
2245
2245
  </item>
2246
2246
  <item>
2247
- <widget class="QLabel" name="label_28">
2248
- <property name="text">
2249
- <string>Score posting interval (minutes)</string>
2247
+ <layout class="QFormLayout" name="formLayout_3">
2248
+ <property name="bottomMargin">
2249
+ <number>0</number>
2250
2250
  </property>
2251
- <property name="alignment">
2252
- <set>Qt::AlignCenter</set>
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
- <widget class="QLineEdit" name="rtc_interval">
2258
- <property name="text">
2259
- <string>2</string>
2281
+ <layout class="QFormLayout" name="formLayout_2">
2282
+ <property name="horizontalSpacing">
2283
+ <number>6</number>
2260
2284
  </property>
2261
- <property name="alignment">
2262
- <set>Qt::AlignCenter</set>
2285
+ <property name="verticalSpacing">
2286
+ <number>6</number>
2263
2287
  </property>
2264
- </widget>
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">
@@ -397,6 +397,11 @@
397
397
  <string>RAEM</string>
398
398
  </property>
399
399
  </item>
400
+ <item>
401
+ <property name="text">
402
+ <string>RANDOMGRAM</string>
403
+ </property>
404
+ </item>
400
405
  <item>
401
406
  <property name="text">
402
407
  <string>REF CW</string>
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
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.2.6"
3
+ __version__ = "25.2.22"
@@ -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
@@ -25,7 +25,7 @@ import soundfile as sf
25
25
 
26
26
  from PyQt6.QtCore import QObject, pyqtSignal, QThread
27
27
 
28
- logger = logging.getLogger("cat_interface")
28
+ logger = logging.getLogger("voice_keying")
29
29
 
30
30
 
31
31
  class Voice(QObject):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: not1mm
3
- Version: 25.2.6
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
- - [Editing macro keys](#editing-macro-keys)
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
- ## Editing macro keys
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 9, 3.
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 grographic center. This information then displayed at the
715
+ your gridsquare to the geographic center. This information then displayed at the
698
716
  bottom left.
699
717
 
700
718
  ![snapshot of heading and distance](https://github.com/mbridak/not1mm/raw/master/pic/heading_distance.png)
@@ -1,5 +1,5 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=g0o9K_koq2alfJffLvSYAEB_jjRetCfy1ZyjsSe6-vw,147224
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=sA3gw5_k7kShTg2qhG7HkKDM5M6KheJVRkAc_C7mxDk,3006
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=IvE0IkNdqznfo94qQHvJHQFwrYVxp-5aSbkvKnEesOQ,73234
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=CYHxO2GyI9fHvspEW4dZbd4HGnmTnDyWYn9PK8KxU9E,62454
36
- not1mm/data/new_contest.ui,sha256=UQNSl28_PrtVA6to2uKBCZTa7LCOh5peGOmuxIWHBw8,24063
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=9xsf5MbjiPdELq7QtWTpkY-qPH442K3Uc8NVao57fSI,14964
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=xjB_j_wxcV0WtJ797s4uZWfU3qvp8jdC97cMR-rOdLo,47
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.6.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
170
- not1mm-25.2.6.dist-info/METADATA,sha256=HOCng7KaBsEiQ6SkBjjzxyFZfLK2BHlMkHk44MYuVTA,35526
171
- not1mm-25.2.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
172
- not1mm-25.2.6.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
173
- not1mm-25.2.6.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
174
- not1mm-25.2.6.dist-info/RECORD,,
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,,