not1mm 25.4.9__py3-none-any.whl → 25.4.10.1__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 +31 -14
- not1mm/data/greendot.png +0 -0
- not1mm/data/new_contest.ui +5 -0
- not1mm/lib/version.py +1 -2
- not1mm/plugins/ari_40_80.py +482 -0
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/METADATA +11 -4
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/RECORD +11 -10
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/WHEEL +0 -0
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/entry_points.txt +0 -0
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/licenses/LICENSE +0 -0
- {not1mm-25.4.9.dist-info → not1mm-25.4.10.1.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -840,6 +840,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
840
840
|
if hasattr(self.contest, "process_esm"):
|
841
841
|
self.contest.process_esm(self, new_focused_widget=new)
|
842
842
|
|
843
|
+
def make_button_blue(self, the_button: QtWidgets.QPushButton) -> None:
|
844
|
+
"""Takes supplied QPushButton object and turns it blue."""
|
845
|
+
if the_button is not None:
|
846
|
+
pal = QPalette()
|
847
|
+
pal.isCopyOf(self.current_palette)
|
848
|
+
blueColor = QColor(0, 0, 128)
|
849
|
+
pal.setBrush(QPalette.ColorRole.Button, blueColor)
|
850
|
+
the_button.setPalette(pal)
|
851
|
+
|
843
852
|
def make_button_green(self, the_button: QtWidgets.QPushButton) -> None:
|
844
853
|
"""Takes supplied QPushButton object and turns it green."""
|
845
854
|
if the_button is not None:
|
@@ -1844,6 +1853,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
1844
1853
|
"[CTRL-SHIFT-K] Open CW text input field.\n"
|
1845
1854
|
"[CTRL-=]\tLog the contact without sending the ESM macros.\n"
|
1846
1855
|
"[CTRL-W]\tClears the input fields of any text.\n"
|
1856
|
+
"[CTRL-R]\tToggle the Run state.\n"
|
1847
1857
|
)
|
1848
1858
|
|
1849
1859
|
def filepicker(self, action: str) -> str:
|
@@ -2096,6 +2106,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2096
2106
|
def stop_cw(self):
|
2097
2107
|
""""""
|
2098
2108
|
self.auto_cq = False
|
2109
|
+
self.leftdot.hide()
|
2099
2110
|
if self.cw is not None:
|
2100
2111
|
if self.cw.servertype == 1:
|
2101
2112
|
self.cw.sendcw("\x1b4")
|
@@ -2202,6 +2213,12 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2202
2213
|
if self.bandmap_window:
|
2203
2214
|
self.bandmap_window.msg_from_main(cmd)
|
2204
2215
|
return
|
2216
|
+
if (
|
2217
|
+
event.key() == Qt.Key.Key_R
|
2218
|
+
and modifier == Qt.KeyboardModifier.ControlModifier
|
2219
|
+
): # pylint: disable=no-member
|
2220
|
+
self.toggle_run_sp()
|
2221
|
+
return
|
2205
2222
|
if (
|
2206
2223
|
event.key() == Qt.Key.Key_W
|
2207
2224
|
and modifier == Qt.KeyboardModifier.ControlModifier
|
@@ -2213,16 +2230,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2213
2230
|
and modifier != Qt.KeyboardModifier.ControlModifier
|
2214
2231
|
):
|
2215
2232
|
self.stop_cw()
|
2216
|
-
# if self.cw is not None:
|
2217
|
-
# if self.cw.servertype == 1:
|
2218
|
-
# self.cw.sendcw("\x1b4")
|
2219
|
-
# return
|
2220
|
-
# if self.rig_control:
|
2221
|
-
# if self.rig_control.online:
|
2222
|
-
# if self.pref.get("cwtype") == 3 and self.rig_control is not None:
|
2223
|
-
# if self.rig_control.interface == "flrig":
|
2224
|
-
# self.rig_control.cat.set_flrig_cw_send(False)
|
2225
|
-
# self.rig_control.cat.set_flrig_cw_send(True)
|
2226
2233
|
if event.key() == Qt.Key.Key_Up:
|
2227
2234
|
cmd = {}
|
2228
2235
|
cmd["cmd"] = "PREVSPOT"
|
@@ -2341,6 +2348,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2341
2348
|
if event.modifiers() == Qt.KeyboardModifier.ShiftModifier:
|
2342
2349
|
self.radioButton_run.setChecked(True)
|
2343
2350
|
self.run_sp_buttons_clicked()
|
2351
|
+
# self.make_button_blue(self.F1)
|
2352
|
+
self.leftdot.show()
|
2344
2353
|
self.auto_cq = True
|
2345
2354
|
self.auto_cq_time = datetime.datetime.now() + datetime.timedelta(
|
2346
2355
|
milliseconds=self.auto_cq_delay
|
@@ -2896,8 +2905,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2896
2905
|
|
2897
2906
|
logger.debug("PTT On")
|
2898
2907
|
if self.rig_control:
|
2899
|
-
self.leftdot.setPixmap(self.greendot)
|
2900
|
-
app.processEvents()
|
2908
|
+
# self.leftdot.setPixmap(self.greendot)
|
2909
|
+
# app.processEvents()
|
2901
2910
|
self.rig_control.ptt_on()
|
2902
2911
|
|
2903
2912
|
def ptt_off(self) -> None:
|
@@ -2915,8 +2924,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2915
2924
|
|
2916
2925
|
logger.debug("PTT Off")
|
2917
2926
|
if self.rig_control:
|
2918
|
-
self.leftdot.setPixmap(self.reddot)
|
2919
|
-
app.processEvents()
|
2927
|
+
# self.leftdot.setPixmap(self.reddot)
|
2928
|
+
# app.processEvents()
|
2920
2929
|
self.rig_control.ptt_off()
|
2921
2930
|
|
2922
2931
|
def process_function_key(self, function_key, rttysendrx=True) -> None:
|
@@ -2959,6 +2968,14 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
2959
2968
|
return
|
2960
2969
|
self.cw.sendcw(self.process_macro(function_key.toolTip()))
|
2961
2970
|
|
2971
|
+
def toggle_run_sp(self) -> None:
|
2972
|
+
"""Toggles the radioButton_run and radioButton_sp."""
|
2973
|
+
if self.radioButton_run.isChecked():
|
2974
|
+
self.radioButton_sp.setChecked(True)
|
2975
|
+
else:
|
2976
|
+
self.radioButton_run.setChecked(True)
|
2977
|
+
self.run_sp_buttons_clicked()
|
2978
|
+
|
2962
2979
|
def run_sp_buttons_clicked(self) -> None:
|
2963
2980
|
"""
|
2964
2981
|
Handle Run/S&P mode changes.
|
not1mm/data/greendot.png
CHANGED
Binary file
|
not1mm/data/new_contest.ui
CHANGED
not1mm/lib/version.py
CHANGED
@@ -0,0 +1,482 @@
|
|
1
|
+
"""CQ 160 CW plugin"""
|
2
|
+
|
3
|
+
# pylint: disable=invalid-name, c-extension-no-member, unused-import, line-too-long
|
4
|
+
|
5
|
+
import datetime
|
6
|
+
import logging
|
7
|
+
import platform
|
8
|
+
|
9
|
+
from pathlib import Path
|
10
|
+
|
11
|
+
from PyQt6 import QtWidgets
|
12
|
+
|
13
|
+
from not1mm.lib.plugin_common import gen_adif
|
14
|
+
from not1mm.lib.version import __version__
|
15
|
+
|
16
|
+
logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
EXCHANGE_HINT = "Automobile Code"
|
19
|
+
|
20
|
+
name = "ARI 40 80"
|
21
|
+
cabrillo_name = "40-80"
|
22
|
+
mode = "BOTH" # CW SSB BOTH RTTY
|
23
|
+
|
24
|
+
columns = [
|
25
|
+
"YYYY-MM-DD HH:MM:SS",
|
26
|
+
"Call",
|
27
|
+
"Freq",
|
28
|
+
"Mode",
|
29
|
+
"Snt",
|
30
|
+
"Rcv",
|
31
|
+
"Exchange1",
|
32
|
+
"PTS",
|
33
|
+
]
|
34
|
+
|
35
|
+
advance_on_space = [True, True, True, True, True]
|
36
|
+
|
37
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
38
|
+
dupe_type = 3
|
39
|
+
|
40
|
+
|
41
|
+
def init_contest(self):
|
42
|
+
"""setup plugin"""
|
43
|
+
set_tab_next(self)
|
44
|
+
set_tab_prev(self)
|
45
|
+
interface(self)
|
46
|
+
self.next_field = self.other_2
|
47
|
+
|
48
|
+
|
49
|
+
def interface(self):
|
50
|
+
"""Setup user interface"""
|
51
|
+
self.field1.show()
|
52
|
+
self.field2.show()
|
53
|
+
self.field3.hide()
|
54
|
+
self.field4.show()
|
55
|
+
self.snt_label.setText("SNT")
|
56
|
+
self.field1.setAccessibleName("RST Sent")
|
57
|
+
self.exch_label.setText("Automobile Code")
|
58
|
+
self.field4.setAccessibleName("Received Exchange")
|
59
|
+
|
60
|
+
|
61
|
+
def reset_label(self): # pylint: disable=unused-argument
|
62
|
+
"""reset label after field cleared"""
|
63
|
+
|
64
|
+
|
65
|
+
def set_tab_next(self):
|
66
|
+
"""Set TAB Advances"""
|
67
|
+
self.tab_next = {
|
68
|
+
self.callsign: self.sent,
|
69
|
+
self.sent: self.receive,
|
70
|
+
self.receive: self.other_2,
|
71
|
+
self.other_1: self.other_2,
|
72
|
+
self.other_2: self.callsign,
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
def set_tab_prev(self):
|
77
|
+
"""Set TAB Advances"""
|
78
|
+
self.tab_prev = {
|
79
|
+
self.callsign: self.other_2,
|
80
|
+
self.sent: self.callsign,
|
81
|
+
self.receive: self.sent,
|
82
|
+
self.other_1: self.receive,
|
83
|
+
self.other_2: self.receive,
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
def set_contact_vars(self):
|
88
|
+
"""Contest Specific"""
|
89
|
+
self.contact["SNT"] = self.sent.text()
|
90
|
+
self.contact["RCV"] = self.receive.text()
|
91
|
+
self.contact["SentNr"] = self.contest_settings.get("SentExchange", 0)
|
92
|
+
self.contact["Exchange1"] = self.other_2.text()
|
93
|
+
self.contact["IsMultiplier1"] = 0
|
94
|
+
|
95
|
+
|
96
|
+
def predupe(self): # pylint: disable=unused-argument
|
97
|
+
"""called after callsign entered"""
|
98
|
+
|
99
|
+
|
100
|
+
def prefill(self):
|
101
|
+
"""Fill SentNR"""
|
102
|
+
|
103
|
+
|
104
|
+
def points(self) -> int:
|
105
|
+
"""Calc point"""
|
106
|
+
|
107
|
+
# a . QSOs/HRDs in CW are worth 3 points;
|
108
|
+
# b. QSOs/HRDs in RTTY are worth 2 points;
|
109
|
+
# c. QSOs/HRDs in SSB are worth 1 point.
|
110
|
+
|
111
|
+
if self.contact_is_dupe > 0:
|
112
|
+
return 0
|
113
|
+
|
114
|
+
_mode = self.contact.get("Mode", "")
|
115
|
+
if _mode in "SSB, USB, LSB, FM, AM":
|
116
|
+
return 1
|
117
|
+
if _mode in "RTTY":
|
118
|
+
return 2
|
119
|
+
if _mode in "CW":
|
120
|
+
return 3
|
121
|
+
return 0
|
122
|
+
|
123
|
+
|
124
|
+
def show_mults(self):
|
125
|
+
"""Return display string for mults"""
|
126
|
+
query = f"select count(DISTINCT(Exchange1 || ':' || Mode || ':' || Band)) as mult_count from dxlog where ContestNR = {self.pref.get('contest', '1')};"
|
127
|
+
|
128
|
+
result = self.database.exec_sql(query)
|
129
|
+
if result:
|
130
|
+
return int(result.get("mult_count", 0))
|
131
|
+
return 0
|
132
|
+
|
133
|
+
|
134
|
+
def show_qso(self):
|
135
|
+
"""Return qso count"""
|
136
|
+
result = self.database.fetch_qso_count()
|
137
|
+
if result:
|
138
|
+
return int(result.get("qsos", 0))
|
139
|
+
return 0
|
140
|
+
|
141
|
+
|
142
|
+
def calc_score(self):
|
143
|
+
"""Return calculated score"""
|
144
|
+
result = self.database.fetch_points()
|
145
|
+
if result is not None:
|
146
|
+
score = result.get("Points", "0")
|
147
|
+
if score is None:
|
148
|
+
score = "0"
|
149
|
+
contest_points = int(score)
|
150
|
+
mults = int(show_mults(self))
|
151
|
+
return contest_points * mults
|
152
|
+
return 0
|
153
|
+
|
154
|
+
|
155
|
+
def adif(self):
|
156
|
+
"""Call the generate ADIF function"""
|
157
|
+
gen_adif(self, cabrillo_name, cabrillo_name)
|
158
|
+
|
159
|
+
|
160
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
161
|
+
""""""
|
162
|
+
print(
|
163
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
164
|
+
end=ending,
|
165
|
+
file=file_descriptor,
|
166
|
+
)
|
167
|
+
|
168
|
+
|
169
|
+
def cabrillo(self, file_encoding):
|
170
|
+
"""Generates Cabrillo file. Maybe."""
|
171
|
+
# https://www.cw160.com/cabrillo.htm
|
172
|
+
logger.debug("******Cabrillo*****")
|
173
|
+
logger.debug("Station: %s", f"{self.station}")
|
174
|
+
logger.debug("Contest: %s", f"{self.contest_settings}")
|
175
|
+
now = datetime.datetime.now()
|
176
|
+
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
177
|
+
filename = (
|
178
|
+
str(Path.home())
|
179
|
+
+ "/"
|
180
|
+
+ f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
|
181
|
+
)
|
182
|
+
logger.debug("%s", filename)
|
183
|
+
log = self.database.fetch_all_contacts_asc()
|
184
|
+
try:
|
185
|
+
with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
|
186
|
+
output_cabrillo_line(
|
187
|
+
"START-OF-LOG: 3.0",
|
188
|
+
"\r\n",
|
189
|
+
file_descriptor,
|
190
|
+
file_encoding,
|
191
|
+
)
|
192
|
+
output_cabrillo_line(
|
193
|
+
f"CREATED-BY: Not1MM v{__version__}",
|
194
|
+
"\r\n",
|
195
|
+
file_descriptor,
|
196
|
+
file_encoding,
|
197
|
+
)
|
198
|
+
output_cabrillo_line(
|
199
|
+
f"CONTEST: {cabrillo_name}",
|
200
|
+
"\r\n",
|
201
|
+
file_descriptor,
|
202
|
+
file_encoding,
|
203
|
+
)
|
204
|
+
if self.station.get("Club", ""):
|
205
|
+
output_cabrillo_line(
|
206
|
+
f"CLUB: {self.station.get('Club', '').upper()}",
|
207
|
+
"\r\n",
|
208
|
+
file_descriptor,
|
209
|
+
file_encoding,
|
210
|
+
)
|
211
|
+
output_cabrillo_line(
|
212
|
+
f"CALLSIGN: {self.station.get('Call','')}",
|
213
|
+
"\r\n",
|
214
|
+
file_descriptor,
|
215
|
+
file_encoding,
|
216
|
+
)
|
217
|
+
output_cabrillo_line(
|
218
|
+
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
219
|
+
"\r\n",
|
220
|
+
file_descriptor,
|
221
|
+
file_encoding,
|
222
|
+
)
|
223
|
+
output_cabrillo_line(
|
224
|
+
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
225
|
+
"\r\n",
|
226
|
+
file_descriptor,
|
227
|
+
file_encoding,
|
228
|
+
)
|
229
|
+
output_cabrillo_line(
|
230
|
+
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
231
|
+
"\r\n",
|
232
|
+
file_descriptor,
|
233
|
+
file_encoding,
|
234
|
+
)
|
235
|
+
output_cabrillo_line(
|
236
|
+
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
237
|
+
"\r\n",
|
238
|
+
file_descriptor,
|
239
|
+
file_encoding,
|
240
|
+
)
|
241
|
+
mode = self.contest_settings.get("ModeCategory", "")
|
242
|
+
if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
|
243
|
+
mode = "MIXED"
|
244
|
+
output_cabrillo_line(
|
245
|
+
f"CATEGORY-MODE: {mode}",
|
246
|
+
"\r\n",
|
247
|
+
file_descriptor,
|
248
|
+
file_encoding,
|
249
|
+
)
|
250
|
+
output_cabrillo_line(
|
251
|
+
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
252
|
+
"\r\n",
|
253
|
+
file_descriptor,
|
254
|
+
file_encoding,
|
255
|
+
)
|
256
|
+
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
257
|
+
output_cabrillo_line(
|
258
|
+
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
259
|
+
"\r\n",
|
260
|
+
file_descriptor,
|
261
|
+
file_encoding,
|
262
|
+
)
|
263
|
+
output_cabrillo_line(
|
264
|
+
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
265
|
+
"\r\n",
|
266
|
+
file_descriptor,
|
267
|
+
file_encoding,
|
268
|
+
)
|
269
|
+
output_cabrillo_line(
|
270
|
+
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
271
|
+
"\r\n",
|
272
|
+
file_descriptor,
|
273
|
+
file_encoding,
|
274
|
+
)
|
275
|
+
|
276
|
+
output_cabrillo_line(
|
277
|
+
f"CLAIMED-SCORE: {calc_score(self)}",
|
278
|
+
"\r\n",
|
279
|
+
file_descriptor,
|
280
|
+
file_encoding,
|
281
|
+
)
|
282
|
+
ops = f"@{self.station.get('Call','')}"
|
283
|
+
list_of_ops = self.database.get_ops()
|
284
|
+
for op in list_of_ops:
|
285
|
+
ops += f", {op.get('Operator', '')}"
|
286
|
+
output_cabrillo_line(
|
287
|
+
f"OPERATORS: {ops}",
|
288
|
+
"\r\n",
|
289
|
+
file_descriptor,
|
290
|
+
file_encoding,
|
291
|
+
)
|
292
|
+
output_cabrillo_line(
|
293
|
+
f"NAME: {self.station.get('Name', '')}",
|
294
|
+
"\r\n",
|
295
|
+
file_descriptor,
|
296
|
+
file_encoding,
|
297
|
+
)
|
298
|
+
output_cabrillo_line(
|
299
|
+
f"ADDRESS: {self.station.get('Street1', '')}",
|
300
|
+
"\r\n",
|
301
|
+
file_descriptor,
|
302
|
+
file_encoding,
|
303
|
+
)
|
304
|
+
output_cabrillo_line(
|
305
|
+
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
306
|
+
"\r\n",
|
307
|
+
file_descriptor,
|
308
|
+
file_encoding,
|
309
|
+
)
|
310
|
+
output_cabrillo_line(
|
311
|
+
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
312
|
+
"\r\n",
|
313
|
+
file_descriptor,
|
314
|
+
file_encoding,
|
315
|
+
)
|
316
|
+
output_cabrillo_line(
|
317
|
+
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
318
|
+
"\r\n",
|
319
|
+
file_descriptor,
|
320
|
+
file_encoding,
|
321
|
+
)
|
322
|
+
output_cabrillo_line(
|
323
|
+
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
324
|
+
"\r\n",
|
325
|
+
file_descriptor,
|
326
|
+
file_encoding,
|
327
|
+
)
|
328
|
+
output_cabrillo_line(
|
329
|
+
f"EMAIL: {self.station.get('Email', '')}",
|
330
|
+
"\r\n",
|
331
|
+
file_descriptor,
|
332
|
+
file_encoding,
|
333
|
+
)
|
334
|
+
for contact in log:
|
335
|
+
the_date_and_time = contact.get("TS", "")
|
336
|
+
themode = contact.get("Mode", "")
|
337
|
+
if themode == "LSB" or themode == "USB":
|
338
|
+
themode = "PH"
|
339
|
+
if themode == "RTTY":
|
340
|
+
themode = "RY"
|
341
|
+
frequency = str(int(contact.get("Freq", "0"))).rjust(5)
|
342
|
+
|
343
|
+
loggeddate = the_date_and_time[:10]
|
344
|
+
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
345
|
+
output_cabrillo_line(
|
346
|
+
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
347
|
+
f"{contact.get('StationPrefix', '').ljust(13)} "
|
348
|
+
f"{str(contact.get('SNT', '')).ljust(3)} "
|
349
|
+
f"{str(contact.get('SentNr', '')).upper().ljust(6)} "
|
350
|
+
f"{contact.get('Call', '').ljust(13)} "
|
351
|
+
f"{str(contact.get('RCV', '')).ljust(3)} "
|
352
|
+
f"{str(contact.get('Exchange1', '')).upper().ljust(6)}",
|
353
|
+
"\r\n",
|
354
|
+
file_descriptor,
|
355
|
+
file_encoding,
|
356
|
+
)
|
357
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
358
|
+
self.show_message_box(f"Cabrillo saved to: {filename}")
|
359
|
+
except IOError as exception:
|
360
|
+
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
361
|
+
self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
|
362
|
+
return
|
363
|
+
|
364
|
+
|
365
|
+
def trigger_update(self):
|
366
|
+
"""Triggers the log window to update."""
|
367
|
+
cmd = {}
|
368
|
+
cmd["cmd"] = "UPDATELOG"
|
369
|
+
if self.log_window:
|
370
|
+
self.log_window.msg_from_main(cmd)
|
371
|
+
|
372
|
+
|
373
|
+
def recalculate_mults(self):
|
374
|
+
"""Recalculates multipliers after change in logged qso."""
|
375
|
+
|
376
|
+
|
377
|
+
def process_esm(self, new_focused_widget=None, with_enter=False):
|
378
|
+
"""ESM State Machine"""
|
379
|
+
|
380
|
+
# self.pref["run_state"]
|
381
|
+
|
382
|
+
# -----===== Assigned F-Keys =====-----
|
383
|
+
# self.esm_dict["CQ"]
|
384
|
+
# self.esm_dict["EXCH"]
|
385
|
+
# self.esm_dict["QRZ"]
|
386
|
+
# self.esm_dict["AGN"]
|
387
|
+
# self.esm_dict["HISCALL"]
|
388
|
+
# self.esm_dict["MYCALL"]
|
389
|
+
# self.esm_dict["QSOB4"]
|
390
|
+
|
391
|
+
# ----==== text fields ====----
|
392
|
+
# self.callsign
|
393
|
+
# self.sent
|
394
|
+
# self.receive
|
395
|
+
# self.other_1
|
396
|
+
# self.other_2
|
397
|
+
|
398
|
+
if new_focused_widget is not None:
|
399
|
+
self.current_widget = self.inputs_dict.get(new_focused_widget)
|
400
|
+
|
401
|
+
# print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
|
402
|
+
|
403
|
+
for a_button in [
|
404
|
+
self.esm_dict["CQ"],
|
405
|
+
self.esm_dict["EXCH"],
|
406
|
+
self.esm_dict["QRZ"],
|
407
|
+
self.esm_dict["AGN"],
|
408
|
+
self.esm_dict["HISCALL"],
|
409
|
+
self.esm_dict["MYCALL"],
|
410
|
+
self.esm_dict["QSOB4"],
|
411
|
+
]:
|
412
|
+
if a_button is not None:
|
413
|
+
self.restore_button_color(a_button)
|
414
|
+
|
415
|
+
buttons_to_send = []
|
416
|
+
|
417
|
+
if self.pref.get("run_state"):
|
418
|
+
if self.current_widget == "callsign":
|
419
|
+
if len(self.callsign.text()) < 3:
|
420
|
+
self.make_button_green(self.esm_dict["CQ"])
|
421
|
+
buttons_to_send.append(self.esm_dict["CQ"])
|
422
|
+
elif len(self.callsign.text()) > 2:
|
423
|
+
self.make_button_green(self.esm_dict["HISCALL"])
|
424
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
425
|
+
buttons_to_send.append(self.esm_dict["HISCALL"])
|
426
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
427
|
+
|
428
|
+
elif self.current_widget in ["other_2"]:
|
429
|
+
if self.other_2.text() == "":
|
430
|
+
self.make_button_green(self.esm_dict["AGN"])
|
431
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
432
|
+
else:
|
433
|
+
self.make_button_green(self.esm_dict["QRZ"])
|
434
|
+
buttons_to_send.append(self.esm_dict["QRZ"])
|
435
|
+
buttons_to_send.append("LOGIT")
|
436
|
+
|
437
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
438
|
+
for button in buttons_to_send:
|
439
|
+
if button:
|
440
|
+
if button == "LOGIT":
|
441
|
+
self.save_contact()
|
442
|
+
continue
|
443
|
+
self.process_function_key(button)
|
444
|
+
else:
|
445
|
+
if self.current_widget == "callsign":
|
446
|
+
if len(self.callsign.text()) > 2:
|
447
|
+
self.make_button_green(self.esm_dict["MYCALL"])
|
448
|
+
buttons_to_send.append(self.esm_dict["MYCALL"])
|
449
|
+
|
450
|
+
elif self.current_widget in ["other_2"]:
|
451
|
+
if self.other_2.text() == "":
|
452
|
+
self.make_button_green(self.esm_dict["AGN"])
|
453
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
454
|
+
else:
|
455
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
456
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
457
|
+
buttons_to_send.append("LOGIT")
|
458
|
+
|
459
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
460
|
+
for button in buttons_to_send:
|
461
|
+
if button:
|
462
|
+
if button == "LOGIT":
|
463
|
+
self.save_contact()
|
464
|
+
continue
|
465
|
+
self.process_function_key(button)
|
466
|
+
|
467
|
+
|
468
|
+
def populate_history_info_line(self):
|
469
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
470
|
+
if result:
|
471
|
+
self.history_info.setText(f"{result.get('Call', '')}, {result.get('Sect', '')}")
|
472
|
+
else:
|
473
|
+
self.history_info.setText("")
|
474
|
+
|
475
|
+
|
476
|
+
def check_call_history(self):
|
477
|
+
""""""
|
478
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
479
|
+
if result:
|
480
|
+
self.history_info.setText(f"{result.get('UserText','')}")
|
481
|
+
if self.other_2.text() == "":
|
482
|
+
self.other_2.setText(f"{result.get('Sect', '')}")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: not1mm
|
3
|
-
Version: 25.4.
|
3
|
+
Version: 25.4.10.1
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
6
|
License: GPL-3.0-or-later
|
@@ -250,6 +250,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
250
250
|
|
251
251
|
## Recent Changes
|
252
252
|
|
253
|
+
- [25-4-10-1] Add ARI 40/80 contest. Add Auto CQ visual indicator. Add CTRL-R to toggle Run state.
|
254
|
+
- [25-4-10] Add Auto CQ visual indicator.
|
253
255
|
- [25-4-9] Added UKEI DX
|
254
256
|
- [25-4-8] Remove focus from statistics table widget.
|
255
257
|
- [25-4-7] Merge in changes from dj1yfk correcting SPDX Cabrillo name.
|
@@ -664,9 +666,13 @@ pressing F1 - F12. See next section on Editing macro keys.
|
|
664
666
|
### Auto CQ
|
665
667
|
|
666
668
|
If you press `SHIFT-F1` The Auto CQ mode will be activated and the F1 macro will be resent
|
667
|
-
after each Auto CQ Delay interval has passed.
|
668
|
-
|
669
|
-
|
669
|
+
after each Auto CQ Delay interval has passed. An indicator will appear to the upper left of
|
670
|
+
the F1 macro key as a visual reminder that your Auto CQ is active.
|
671
|
+
|
672
|
+

|
673
|
+
|
674
|
+
The delay can be changed by going to the `Options` TAB in the Configuration dialog. If you are in
|
675
|
+
S&P mode when you enable Auto CQ, you will be automatically switched into RUN mode.
|
670
676
|
|
671
677
|
The auto CQ can be cancelled by either typing in the call sign field, or by pressing ESC.
|
672
678
|
|
@@ -773,6 +779,7 @@ is this has happened, since the gridsquare will replace the word "Regional".
|
|
773
779
|
| [SPACE] | When in the callsign field, will move the input to the first field needed for the exchange. |
|
774
780
|
| [Enter] | Submits the fields to the log. Unless ESM is enabled. |
|
775
781
|
| [F1-F12] | Send (CW/RTTY/Voice) macros. |
|
782
|
+
| [CTRL-R] | Toggle between Run and S&P modes. |
|
776
783
|
| [CTRL-S] | Spot Callsign to the cluster. |
|
777
784
|
| [CTRL-M] | Mark Callsign to the bandmap window to work later. |
|
778
785
|
| [CTRL-G] | Tune to a spot matching partial text in the callsign entry field (CAT Required). |
|
@@ -1,5 +1,5 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
2
|
+
not1mm/__main__.py,sha256=M3AByjOQQN42Frgo-FHfXS1mkXpYpRbRW1LBmrMEJbM,152417
|
3
3
|
not1mm/bandmap.py,sha256=-zu5slsuAm2GmeW8g3yvURzsuQxemwIQfw1HEq8xKHM,29920
|
4
4
|
not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
|
5
5
|
not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
|
@@ -26,7 +26,7 @@ not1mm/data/cwmacros.txt,sha256=NztufsX6R52gAO7VyJ2AHr7wOh41pJTwHKh5Lcs32ds,468
|
|
26
26
|
not1mm/data/donors.html,sha256=0NEh7eu9Dsfv1Gy0_f6UMp4ZjVjm7OgoQJEQd-4whoU,267
|
27
27
|
not1mm/data/editcontact.ui,sha256=TNOsXETYfDaON4wj6AkzCJ-n2SmbNRO2-g2SLl5m8s0,27437
|
28
28
|
not1mm/data/editmacro.ui,sha256=Vg-S62ogKYcWlDDlza_JYyZkCQfa8mCfF-cFqpBej-w,2700
|
29
|
-
not1mm/data/greendot.png,sha256=
|
29
|
+
not1mm/data/greendot.png,sha256=El9TomJcGtViRcHOR7kMxGzjzvYs0TSAqOb3tZv0JDA,368
|
30
30
|
not1mm/data/k6gte-not1mm.desktop,sha256=dUi-YbHbavOsL3A29eglDQ0p1_cSKzJeEGQ52Qv_eKo,243
|
31
31
|
not1mm/data/k6gte.not1mm-128.png,sha256=ZP93MfRqr4WwsFCwg1m5MZjLs8bG895vDW9DDDn1B_Q,6076
|
32
32
|
not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcCac,1526
|
@@ -34,7 +34,7 @@ not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N
|
|
34
34
|
not1mm/data/logwindow.ui,sha256=f7vULj96tHIQuR1nJMyvPHHcmVgzkhv9D1isyojsnFU,1458
|
35
35
|
not1mm/data/logwindowx.ui,sha256=CwpI-h7cI1yqyldH9quKftsdHL5lTyL9ABOcf80nfqc,1632
|
36
36
|
not1mm/data/main.ui,sha256=DNJ7jK_1Dd9SDiiGbdwvXDA0WEKjApdRKqBPYFt7S3c,63737
|
37
|
-
not1mm/data/new_contest.ui,sha256
|
37
|
+
not1mm/data/new_contest.ui,sha256=U_6Ig7aKpnU8aivuw48kWG6CRn6s4Kcf652154WlMBg,24912
|
38
38
|
not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
|
39
39
|
not1mm/data/opon.ui,sha256=QDicqAk2lORG2UWsHa6jHlsGn6uzrrI2R4HSAocpPes,2258
|
40
40
|
not1mm/data/pickcontest.ui,sha256=4hPBszCglObThx_eIWtmK9CEcbr7WBjbB1rKZdI-o3I,1707
|
@@ -118,13 +118,14 @@ not1mm/lib/plugin_common.py,sha256=D1OBjyLmX7zuSPqgTCmHwXzAKA12J_zTQItvyIem-4Y,1
|
|
118
118
|
not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
|
119
119
|
not1mm/lib/settings.py,sha256=mXffn8Xaj5KATPQinNBR0V5DbHWQPsRfh24_axWGYuk,15254
|
120
120
|
not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
|
121
|
-
not1mm/lib/version.py,sha256=
|
121
|
+
not1mm/lib/version.py,sha256=zqvGkzvASjvvdsqMsiERQLKrRomu4JV0biAowKaXgMk,50
|
122
122
|
not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
|
123
123
|
not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
|
124
124
|
not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
|
125
125
|
not1mm/plugins/10_10_summer_phone.py,sha256=NWWT5YTZN6CkPl5Jy4lCuTqHd1R_JodhsOLqCoGOzdU,14896
|
126
126
|
not1mm/plugins/10_10_winter_phone.py,sha256=4xoWLbnE2di5XnUUlhsvTR__E0Z4kbhu-rcUitPMR0U,14795
|
127
127
|
not1mm/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
128
|
+
not1mm/plugins/ari_40_80.py,sha256=_CaUWEo0zJONXvxPqJKyqmStJezqxEsNxOnEdSLmxzY,15333
|
128
129
|
not1mm/plugins/arrl_10m.py,sha256=9p7EX2vAXVilF8y6AYHG4fXczU6g9QuMA2Pvj64pSXE,18389
|
129
130
|
not1mm/plugins/arrl_160m.py,sha256=rdWDhmPN0h9ADTlYaRLk-5j8KVye0rUEs1tyD-kfHV0,20300
|
130
131
|
not1mm/plugins/arrl_dx_cw.py,sha256=Bx6_PBmTHKf4l52XwLFVeR2y6F134kXbGTfEXC_1agk,18890
|
@@ -175,9 +176,9 @@ not1mm/plugins/stew_perry_topband.py,sha256=3U-Dr28haBTqTaZWLiC1qHQBmLsLENDL-ihy
|
|
175
176
|
not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,19105
|
176
177
|
not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
|
177
178
|
not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
|
178
|
-
not1mm-25.4.
|
179
|
-
not1mm-25.4.
|
180
|
-
not1mm-25.4.
|
181
|
-
not1mm-25.4.
|
182
|
-
not1mm-25.4.
|
183
|
-
not1mm-25.4.
|
179
|
+
not1mm-25.4.10.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
180
|
+
not1mm-25.4.10.1.dist-info/METADATA,sha256=llXLhCzn7vFSrIvs2gIBBQ2VQ7oIPCJiz1LzP5wGP1A,37982
|
181
|
+
not1mm-25.4.10.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
182
|
+
not1mm-25.4.10.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
183
|
+
not1mm-25.4.10.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
184
|
+
not1mm-25.4.10.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|