not1mm 25.4.21__py3-none-any.whl → 25.4.25__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 +34 -37
- not1mm/bandmap.py +2 -2
- not1mm/data/new_contest.ui +5 -0
- not1mm/lib/cat_interface.py +52 -36
- not1mm/lib/version.py +1 -1
- not1mm/plugins/arrl_vhf_jan.py +5 -9
- not1mm/plugins/arrl_vhf_jun.py +5 -9
- not1mm/plugins/arrl_vhf_sep.py +5 -9
- not1mm/plugins/cwt.py +11 -14
- not1mm/plugins/vhf_sprint.py +624 -0
- not1mm/radio.py +2 -2
- not1mm/ratewindow.py +1 -2
- not1mm/vfo.py +2 -0
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/METADATA +3 -1
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/RECORD +19 -18
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/WHEEL +1 -1
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/entry_points.txt +0 -0
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/licenses/LICENSE +0 -0
- {not1mm-25.4.21.dist-info → not1mm-25.4.25.dist-info}/top_level.txt +0 -0
not1mm/__main__.py
CHANGED
@@ -3192,12 +3192,12 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3192
3192
|
self.pref.get("CAT_ip", "127.0.0.1"),
|
3193
3193
|
int(self.pref.get("CAT_port", 12345)),
|
3194
3194
|
)
|
3195
|
-
self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
|
3196
|
-
self.rig_control.moveToThread(self.radio_thread)
|
3197
|
-
self.radio_thread.started.connect(self.rig_control.run)
|
3198
|
-
self.radio_thread.finished.connect(self.rig_control.deleteLater)
|
3199
|
-
self.rig_control.poll_callback.connect(self.poll_radio)
|
3200
|
-
self.radio_thread.start()
|
3195
|
+
# self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
|
3196
|
+
# self.rig_control.moveToThread(self.radio_thread)
|
3197
|
+
# self.radio_thread.started.connect(self.rig_control.run)
|
3198
|
+
# self.radio_thread.finished.connect(self.rig_control.deleteLater)
|
3199
|
+
# self.rig_control.poll_callback.connect(self.poll_radio)
|
3200
|
+
# self.radio_thread.start()
|
3201
3201
|
|
3202
3202
|
elif self.pref.get("userigctld", False) is True:
|
3203
3203
|
logger.debug(
|
@@ -3209,24 +3209,24 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3209
3209
|
self.pref.get("CAT_ip", "127.0.0.1"),
|
3210
3210
|
int(self.pref.get("CAT_port", 4532)),
|
3211
3211
|
)
|
3212
|
-
self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
|
3213
|
-
self.rig_control.moveToThread(self.radio_thread)
|
3214
|
-
self.radio_thread.started.connect(self.rig_control.run)
|
3215
|
-
self.radio_thread.finished.connect(self.rig_control.deleteLater)
|
3216
|
-
self.rig_control.poll_callback.connect(self.poll_radio)
|
3217
|
-
self.radio_thread.start()
|
3212
|
+
# self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
|
3213
|
+
# self.rig_control.moveToThread(self.radio_thread)
|
3214
|
+
# self.radio_thread.started.connect(self.rig_control.run)
|
3215
|
+
# self.radio_thread.finished.connect(self.rig_control.deleteLater)
|
3216
|
+
# self.rig_control.poll_callback.connect(self.poll_radio)
|
3217
|
+
# self.radio_thread.start()
|
3218
3218
|
else:
|
3219
3219
|
self.rig_control = Radio(
|
3220
3220
|
"fake",
|
3221
3221
|
self.pref.get("CAT_ip", "127.0.0.1"),
|
3222
3222
|
int(self.pref.get("CAT_port", 0000)),
|
3223
3223
|
)
|
3224
|
-
|
3225
|
-
|
3226
|
-
|
3227
|
-
|
3228
|
-
|
3229
|
-
|
3224
|
+
self.rig_control.delta = int(self.pref.get("CAT_polldelta", 555))
|
3225
|
+
self.rig_control.moveToThread(self.radio_thread)
|
3226
|
+
self.radio_thread.started.connect(self.rig_control.run)
|
3227
|
+
self.radio_thread.finished.connect(self.rig_control.deleteLater)
|
3228
|
+
self.rig_control.poll_callback.connect(self.poll_radio)
|
3229
|
+
self.radio_thread.start()
|
3230
3230
|
|
3231
3231
|
self.cw = None
|
3232
3232
|
if (
|
@@ -3925,13 +3925,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3925
3925
|
self.contact["Band"] = get_logged_band(str(vfo))
|
3926
3926
|
self.set_band_indicator(band)
|
3927
3927
|
|
3928
|
-
if self.rig_control:
|
3929
|
-
if self.rig_control.online:
|
3930
|
-
self.rig_control.get_modes()
|
3931
|
-
|
3932
3928
|
if self.radio_state.get("mode") != mode:
|
3933
3929
|
info_dirty = True
|
3934
|
-
|
3930
|
+
if "set_freq:" not in mode:
|
3931
|
+
self.radio_state["mode"] = mode
|
3935
3932
|
|
3936
3933
|
if self.radio_state.get("bw") != bw:
|
3937
3934
|
info_dirty = True
|
@@ -3959,26 +3956,26 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
3959
3956
|
):
|
3960
3957
|
self.setmode("RTTY")
|
3961
3958
|
|
3962
|
-
cmd = {}
|
3963
|
-
cmd["cmd"] = "RADIO_STATE"
|
3964
|
-
cmd["band"] = band
|
3965
|
-
cmd["vfoa"] = vfo
|
3966
|
-
cmd["mode"] = mode
|
3967
|
-
cmd["bw"] = bw
|
3968
3959
|
if self.bandmap_window:
|
3960
|
+
cmd = {}
|
3961
|
+
cmd["cmd"] = "RADIO_STATE"
|
3962
|
+
cmd["band"] = band
|
3963
|
+
cmd["vfoa"] = vfo
|
3964
|
+
cmd["mode"] = mode
|
3965
|
+
cmd["bw"] = bw
|
3969
3966
|
self.bandmap_window.msg_from_main(cmd)
|
3970
3967
|
if info_dirty:
|
3971
3968
|
try:
|
3972
3969
|
logger.debug("VFO: %s MODE: %s BW: %s", vfo, mode, bw)
|
3973
3970
|
self.set_window_title()
|
3974
|
-
cmd = {}
|
3975
|
-
cmd["cmd"] = "RADIO_STATE"
|
3976
|
-
cmd["band"] = band
|
3977
|
-
cmd["vfoa"] = vfo
|
3978
|
-
cmd["mode"] = mode
|
3979
|
-
cmd["bw"] = bw
|
3980
|
-
if self.bandmap_window:
|
3981
|
-
|
3971
|
+
# cmd = {}
|
3972
|
+
# cmd["cmd"] = "RADIO_STATE"
|
3973
|
+
# cmd["band"] = band
|
3974
|
+
# cmd["vfoa"] = vfo
|
3975
|
+
# cmd["mode"] = mode
|
3976
|
+
# cmd["bw"] = bw
|
3977
|
+
# if self.bandmap_window:
|
3978
|
+
# self.bandmap_window.msg_from_main(cmd)
|
3982
3979
|
if self.n1mm:
|
3983
3980
|
self.n1mm.radio_info["Freq"] = vfo[:-1]
|
3984
3981
|
self.n1mm.radio_info["TXFreq"] = vfo[:-1]
|
not1mm/bandmap.py
CHANGED
@@ -385,7 +385,7 @@ class BandMapWindow(QDockWidget):
|
|
385
385
|
|
386
386
|
def msg_from_main(self, packet):
|
387
387
|
""""""
|
388
|
-
if self.active is False:
|
388
|
+
if self.active is False or not self.isVisible():
|
389
389
|
return
|
390
390
|
if packet.get("cmd", "") == "RADIO_STATE":
|
391
391
|
self.set_band(packet.get("band") + "m", False)
|
@@ -688,7 +688,7 @@ class BandMapWindow(QDockWidget):
|
|
688
688
|
def update_stations(self):
|
689
689
|
"""doc"""
|
690
690
|
self.update_timer.setInterval(UPDATE_INTERVAL)
|
691
|
-
if self.active is False:
|
691
|
+
if self.active is False or not self.isVisible():
|
692
692
|
return
|
693
693
|
self.clear_all_callsign_from_scene()
|
694
694
|
self.spot_aging()
|
not1mm/data/new_contest.ui
CHANGED
not1mm/lib/cat_interface.py
CHANGED
@@ -71,6 +71,7 @@ class CAT:
|
|
71
71
|
self.host = host
|
72
72
|
self.port = port
|
73
73
|
self.online = False
|
74
|
+
self.rigctld_bw = "0"
|
74
75
|
self.fake_radio = {
|
75
76
|
"vfo": "14032000",
|
76
77
|
"mode": "CW",
|
@@ -121,6 +122,7 @@ class CAT:
|
|
121
122
|
|
122
123
|
def __initialize_rigctrld(self):
|
123
124
|
try:
|
125
|
+
logger.debug("Connecting to rigctrld")
|
124
126
|
self.rigctrlsocket = socket.socket()
|
125
127
|
self.rigctrlsocket.settimeout(0.5)
|
126
128
|
self.rigctrlsocket.connect((self.host, self.port))
|
@@ -154,7 +156,7 @@ class CAT:
|
|
154
156
|
except (socket.error, UnicodeDecodeError):
|
155
157
|
...
|
156
158
|
self.rigctrlsocket.settimeout(0.5)
|
157
|
-
logger.debug("%s", dump)
|
159
|
+
# logger.debug("%s", dump)
|
158
160
|
return dump
|
159
161
|
|
160
162
|
def sendvoicememory(self, memoryspot=1):
|
@@ -167,7 +169,8 @@ class CAT:
|
|
167
169
|
try:
|
168
170
|
self.online = True
|
169
171
|
self.rigctrlsocket.send(bytes(f"+\\send_voice_mem {memoryspot}\n", "utf-8"))
|
170
|
-
|
172
|
+
info = self.__get_serial_string()
|
173
|
+
logger.debug("%s", info)
|
171
174
|
return
|
172
175
|
except socket.error as exception:
|
173
176
|
self.online = False
|
@@ -189,7 +192,8 @@ class CAT:
|
|
189
192
|
try:
|
190
193
|
self.online = True
|
191
194
|
self.rigctrlsocket.send(bytes(f"b{texttosend}\n", "utf-8"))
|
192
|
-
|
195
|
+
info = self.__get_serial_string()
|
196
|
+
logger.debug("%s", info)
|
193
197
|
return True
|
194
198
|
except socket.error as exception:
|
195
199
|
self.online = False
|
@@ -205,7 +209,8 @@ class CAT:
|
|
205
209
|
try:
|
206
210
|
self.online = True
|
207
211
|
self.rigctrlsocket.send(bytes(f"L KEYSPD {speed}\n", "utf-8"))
|
208
|
-
|
212
|
+
info = self.__get_serial_string()
|
213
|
+
logger.debug("%s", info)
|
209
214
|
return
|
210
215
|
except socket.error as exception:
|
211
216
|
self.online = False
|
@@ -307,6 +312,7 @@ class CAT:
|
|
307
312
|
self.online = True
|
308
313
|
self.rigctrlsocket.send(b"|f\n")
|
309
314
|
report = self.__get_serial_string().strip()
|
315
|
+
logger.debug("%s", report)
|
310
316
|
if "get_freq:|" in report and "RPRT 0" in report:
|
311
317
|
seg_rpt = report.split("|")
|
312
318
|
return seg_rpt[1].split(" ")[1]
|
@@ -361,8 +367,10 @@ class CAT:
|
|
361
367
|
self.rigctrlsocket.send(b"|m\n")
|
362
368
|
# get_mode:|Mode: CW|Passband: 500|RPRT 0
|
363
369
|
report = self.__get_serial_string().strip()
|
370
|
+
logger.debug("%s", report)
|
364
371
|
if "get_mode:|" in report and "RPRT 0" in report:
|
365
372
|
seg_rpt = report.split("|")
|
373
|
+
self.rigctld_bw = seg_rpt[2].split(" ")[1]
|
366
374
|
return seg_rpt[1].split(" ")[1]
|
367
375
|
except IndexError as exception:
|
368
376
|
logger.debug("%s", f"{exception}")
|
@@ -404,25 +412,27 @@ class CAT:
|
|
404
412
|
|
405
413
|
def __getbw_rigctld(self):
|
406
414
|
"""return bandwidth"""
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
self.
|
425
|
-
return ""
|
415
|
+
return self.rigctld_bw
|
416
|
+
# if self.rigctrlsocket:
|
417
|
+
# try:
|
418
|
+
# self.online = True
|
419
|
+
# self.rigctrlsocket.send(b"|m\n")
|
420
|
+
# # get_mode:|Mode: CW|Passband: 500|RPRT 0
|
421
|
+
# report = self.__get_serial_string().strip()
|
422
|
+
# logger.debug("%s", report)
|
423
|
+
# if "get_mode:|" in report and "RPRT 0" in report:
|
424
|
+
# seg_rpt = report.split("|")
|
425
|
+
# return seg_rpt[2].split(" ")[1]
|
426
|
+
|
427
|
+
# except IndexError as exception:
|
428
|
+
# logger.debug("%s", f"{exception}")
|
429
|
+
# except socket.error as exception:
|
430
|
+
# self.online = False
|
431
|
+
# logger.debug("%s", f"{exception}")
|
432
|
+
# self.rigctrlsocket = None
|
433
|
+
# return ""
|
434
|
+
# self.__initialize_rigctrld()
|
435
|
+
# return ""
|
426
436
|
|
427
437
|
def get_power(self):
|
428
438
|
"""Get power level from rig"""
|
@@ -455,6 +465,7 @@ class CAT:
|
|
455
465
|
self.rigctrlsocket.send(b"|l RFPOWER\n")
|
456
466
|
# get_level: RFPOWER|0.000000|RPRT 0
|
457
467
|
report = self.__get_serial_string().strip()
|
468
|
+
logger.debug("%s", report)
|
458
469
|
if "get_level: RFPOWER|" in report and "RPRT 0" in report:
|
459
470
|
seg_rpt = report.split("|")
|
460
471
|
return int(float(seg_rpt[1]) * 100)
|
@@ -588,8 +599,9 @@ class CAT:
|
|
588
599
|
if self.rigctrlsocket:
|
589
600
|
try:
|
590
601
|
self.online = True
|
591
|
-
self.rigctrlsocket.send(bytes(f"F {freq}\n", "utf-8"))
|
592
|
-
|
602
|
+
self.rigctrlsocket.send(bytes(f"|F {freq}\n", "utf-8"))
|
603
|
+
info = self.__get_serial_string()
|
604
|
+
logger.debug("%s", info)
|
593
605
|
return True
|
594
606
|
except socket.error as exception:
|
595
607
|
self.online = False
|
@@ -634,11 +646,12 @@ class CAT:
|
|
634
646
|
if self.rigctrlsocket:
|
635
647
|
try:
|
636
648
|
self.online = True
|
637
|
-
logger.debug(f"\nM {mode} 0\n")
|
638
|
-
self.rigctrlsocket.send(bytes(f"\
|
639
|
-
if self.__get_serial_string() != "RPRT 0\n":
|
640
|
-
|
641
|
-
|
649
|
+
# logger.debug(f"\nM {mode} 0\n")
|
650
|
+
self.rigctrlsocket.send(bytes(f"\n|M {mode} 0\n", "utf-8"))
|
651
|
+
# if self.__get_serial_string() != "RPRT 0\n":
|
652
|
+
# self.rigctrlsocket.send(bytes(f"\n|M {mode} 0\n", "utf-8"))
|
653
|
+
info = self.__get_serial_string()
|
654
|
+
logger.debug("%s", info)
|
642
655
|
return True
|
643
656
|
except socket.error as exception:
|
644
657
|
self.online = False
|
@@ -676,11 +689,12 @@ class CAT:
|
|
676
689
|
|
677
690
|
def __setpower_rigctld(self, power):
|
678
691
|
if power.isnumeric() and int(power) >= 1 and int(power) <= 100:
|
679
|
-
rig_cmd = bytes(f"L RFPOWER {str(float(power) / 100)}\n", "utf-8")
|
692
|
+
rig_cmd = bytes(f"|L RFPOWER {str(float(power) / 100)}\n", "utf-8")
|
680
693
|
try:
|
681
694
|
self.online = True
|
682
695
|
self.rigctrlsocket.send(rig_cmd)
|
683
|
-
|
696
|
+
info = self.__get_serial_string()
|
697
|
+
logger.debug("%s", info)
|
684
698
|
except socket.error:
|
685
699
|
self.online = False
|
686
700
|
self.rigctrlsocket = None
|
@@ -706,12 +720,13 @@ class CAT:
|
|
706
720
|
# Get 'PTT' status.
|
707
721
|
# Returns PTT as a value in set_ptt above.
|
708
722
|
|
709
|
-
rig_cmd = bytes("T 1\n", "utf-8")
|
723
|
+
rig_cmd = bytes("|T 1\n", "utf-8")
|
710
724
|
logger.debug("%s", f"{rig_cmd}")
|
711
725
|
try:
|
712
726
|
self.online = True
|
713
727
|
self.rigctrlsocket.send(rig_cmd)
|
714
|
-
|
728
|
+
info = self.__get_serial_string()
|
729
|
+
logger.debug("%s", info)
|
715
730
|
except socket.error:
|
716
731
|
self.online = False
|
717
732
|
self.rigctrlsocket = None
|
@@ -745,12 +760,13 @@ class CAT:
|
|
745
760
|
|
746
761
|
def __ptt_off_rigctld(self):
|
747
762
|
"""Toggle PTT state off"""
|
748
|
-
rig_cmd = bytes("T 0\n", "utf-8")
|
763
|
+
rig_cmd = bytes("|T 0\n", "utf-8")
|
749
764
|
logger.debug("%s", f"{rig_cmd}")
|
750
765
|
try:
|
751
766
|
self.online = True
|
752
767
|
self.rigctrlsocket.send(rig_cmd)
|
753
|
-
|
768
|
+
into = self.__get_serial_string()
|
769
|
+
logger.debug("%s", into)
|
754
770
|
except socket.error:
|
755
771
|
self.online = False
|
756
772
|
self.rigctrlsocket = None
|
not1mm/lib/version.py
CHANGED
not1mm/plugins/arrl_vhf_jan.py
CHANGED
@@ -82,13 +82,13 @@ def init_contest(self):
|
|
82
82
|
|
83
83
|
def interface(self):
|
84
84
|
"""Setup user interface"""
|
85
|
-
self.field1.
|
86
|
-
self.field2.
|
85
|
+
self.field1.hide()
|
86
|
+
self.field2.hide()
|
87
87
|
self.field3.show()
|
88
88
|
self.field4.show()
|
89
89
|
self.snt_label.setText("SNT")
|
90
90
|
self.field1.setAccessibleName("RST Sent")
|
91
|
-
self.other_label.setText("
|
91
|
+
self.other_label.setText("Sent Grid")
|
92
92
|
self.field3.setAccessibleName("Sent Grid")
|
93
93
|
self.exch_label.setText("Grid")
|
94
94
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -101,9 +101,7 @@ def reset_label(self):
|
|
101
101
|
def set_tab_next(self):
|
102
102
|
"""Set TAB Advances"""
|
103
103
|
self.tab_next = {
|
104
|
-
self.callsign: self.
|
105
|
-
self.sent: self.receive,
|
106
|
-
self.receive: self.other_1,
|
104
|
+
self.callsign: self.other_1,
|
107
105
|
self.other_1: self.other_2,
|
108
106
|
self.other_2: self.callsign,
|
109
107
|
}
|
@@ -113,10 +111,8 @@ def set_tab_prev(self):
|
|
113
111
|
"""Set TAB Advances"""
|
114
112
|
self.tab_prev = {
|
115
113
|
self.callsign: self.other_2,
|
116
|
-
self.sent: self.callsign,
|
117
|
-
self.receive: self.sent,
|
118
|
-
self.other_1: self.receive,
|
119
114
|
self.other_2: self.other_1,
|
115
|
+
self.other_1: self.callsign,
|
120
116
|
}
|
121
117
|
|
122
118
|
|
not1mm/plugins/arrl_vhf_jun.py
CHANGED
@@ -50,13 +50,13 @@ def init_contest(self):
|
|
50
50
|
|
51
51
|
def interface(self):
|
52
52
|
"""Setup user interface"""
|
53
|
-
self.field1.
|
54
|
-
self.field2.
|
53
|
+
self.field1.hide()
|
54
|
+
self.field2.hide()
|
55
55
|
self.field3.show()
|
56
56
|
self.field4.show()
|
57
57
|
self.snt_label.setText("SNT")
|
58
58
|
self.field1.setAccessibleName("RST Sent")
|
59
|
-
self.other_label.setText("
|
59
|
+
self.other_label.setText("Sent Grid")
|
60
60
|
self.field3.setAccessibleName("Sent Grid")
|
61
61
|
self.exch_label.setText("Grid")
|
62
62
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -69,9 +69,7 @@ def reset_label(self):
|
|
69
69
|
def set_tab_next(self):
|
70
70
|
"""Set TAB Advances"""
|
71
71
|
self.tab_next = {
|
72
|
-
self.callsign: self.
|
73
|
-
self.sent: self.receive,
|
74
|
-
self.receive: self.other_1,
|
72
|
+
self.callsign: self.other_1,
|
75
73
|
self.other_1: self.other_2,
|
76
74
|
self.other_2: self.callsign,
|
77
75
|
}
|
@@ -81,10 +79,8 @@ def set_tab_prev(self):
|
|
81
79
|
"""Set TAB Advances"""
|
82
80
|
self.tab_prev = {
|
83
81
|
self.callsign: self.other_2,
|
84
|
-
self.sent: self.callsign,
|
85
|
-
self.receive: self.sent,
|
86
|
-
self.other_1: self.receive,
|
87
82
|
self.other_2: self.other_1,
|
83
|
+
self.other_1: self.callsign,
|
88
84
|
}
|
89
85
|
|
90
86
|
|
not1mm/plugins/arrl_vhf_sep.py
CHANGED
@@ -50,13 +50,13 @@ def init_contest(self):
|
|
50
50
|
|
51
51
|
def interface(self):
|
52
52
|
"""Setup user interface"""
|
53
|
-
self.field1.
|
54
|
-
self.field2.
|
53
|
+
self.field1.hide()
|
54
|
+
self.field2.hide()
|
55
55
|
self.field3.show()
|
56
56
|
self.field4.show()
|
57
57
|
self.snt_label.setText("SNT")
|
58
58
|
self.field1.setAccessibleName("RST Sent")
|
59
|
-
self.other_label.setText("
|
59
|
+
self.other_label.setText("Sent Grid")
|
60
60
|
self.field3.setAccessibleName("Sent Grid")
|
61
61
|
self.exch_label.setText("Grid")
|
62
62
|
self.field4.setAccessibleName("Gridsquare")
|
@@ -69,9 +69,7 @@ def reset_label(self):
|
|
69
69
|
def set_tab_next(self):
|
70
70
|
"""Set TAB Advances"""
|
71
71
|
self.tab_next = {
|
72
|
-
self.callsign: self.
|
73
|
-
self.sent: self.receive,
|
74
|
-
self.receive: self.other_1,
|
72
|
+
self.callsign: self.other_1,
|
75
73
|
self.other_1: self.other_2,
|
76
74
|
self.other_2: self.callsign,
|
77
75
|
}
|
@@ -81,10 +79,8 @@ def set_tab_prev(self):
|
|
81
79
|
"""Set TAB Advances"""
|
82
80
|
self.tab_prev = {
|
83
81
|
self.callsign: self.other_2,
|
84
|
-
self.sent: self.callsign,
|
85
|
-
self.receive: self.sent,
|
86
|
-
self.other_1: self.receive,
|
87
82
|
self.other_2: self.other_1,
|
83
|
+
self.other_1: self.callsign,
|
88
84
|
}
|
89
85
|
|
90
86
|
|
not1mm/plugins/cwt.py
CHANGED
@@ -11,10 +11,11 @@
|
|
11
11
|
# Bands: 160, 80, 40, 20, 15, 10m
|
12
12
|
# Classes: Single Op (QRP/Low/High)
|
13
13
|
# Max power: HP: >100 watts
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# Exchange:
|
17
|
-
#
|
14
|
+
# LP: 100 watts
|
15
|
+
# QRP: 5 watts
|
16
|
+
# Exchange:
|
17
|
+
# Member: Name + Member No./"CWA"
|
18
|
+
# Non-Member: Name + (state/province/country)
|
18
19
|
# Work stations: Once per band
|
19
20
|
# QSO Points: 1 point per QSO
|
20
21
|
# Multipliers: Each call once
|
@@ -72,16 +73,16 @@ def init_contest(self):
|
|
72
73
|
|
73
74
|
def interface(self):
|
74
75
|
"""Setup user interface"""
|
75
|
-
self.field1.
|
76
|
-
self.field2.
|
76
|
+
self.field1.hide()
|
77
|
+
self.field2.hide()
|
77
78
|
self.field3.show()
|
78
79
|
self.field4.show()
|
79
80
|
self.snt_label.setText("SNT")
|
80
81
|
self.field1.setAccessibleName("RST Sent")
|
81
82
|
self.other_label.setText("Name")
|
82
83
|
self.field3.setAccessibleName("Name")
|
83
|
-
self.exch_label.setText("
|
84
|
-
self.field4.setAccessibleName("
|
84
|
+
self.exch_label.setText("Number or State")
|
85
|
+
self.field4.setAccessibleName("Number or State")
|
85
86
|
|
86
87
|
|
87
88
|
def reset_label(self):
|
@@ -91,9 +92,7 @@ def reset_label(self):
|
|
91
92
|
def set_tab_next(self):
|
92
93
|
"""Set TAB Advances"""
|
93
94
|
self.tab_next = {
|
94
|
-
self.callsign: self.
|
95
|
-
self.sent: self.field2.findChild(QtWidgets.QLineEdit),
|
96
|
-
self.receive: self.other_1,
|
95
|
+
self.callsign: self.other_1,
|
97
96
|
self.other_1: self.other_2,
|
98
97
|
self.other_2: self.callsign,
|
99
98
|
}
|
@@ -103,9 +102,7 @@ def set_tab_prev(self):
|
|
103
102
|
"""Set TAB Advances"""
|
104
103
|
self.tab_prev = {
|
105
104
|
self.callsign: self.other_2,
|
106
|
-
self.
|
107
|
-
self.receive: self.sent,
|
108
|
-
self.other_1: self.receive,
|
105
|
+
self.other_1: self.callsign,
|
109
106
|
self.other_2: self.other_1,
|
110
107
|
}
|
111
108
|
|
@@ -0,0 +1,624 @@
|
|
1
|
+
"""VHF SPRINT"""
|
2
|
+
|
3
|
+
# Single band VHF Sprint. Exchange is 4-digit grid square.
|
4
|
+
# 1 point per each valid QSO multiplied by number of grid squares worked.
|
5
|
+
# Cabrillo name: VHF-SPRINT
|
6
|
+
|
7
|
+
# pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member
|
8
|
+
|
9
|
+
import datetime
|
10
|
+
import logging
|
11
|
+
|
12
|
+
from pathlib import Path
|
13
|
+
from PyQt6 import QtWidgets
|
14
|
+
|
15
|
+
from not1mm.lib.ham_utility import get_logged_band
|
16
|
+
from not1mm.lib.plugin_common import gen_adif, get_points, online_score_xml
|
17
|
+
from not1mm.lib.version import __version__
|
18
|
+
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
|
21
|
+
ALTEREGO = None
|
22
|
+
EXCHANGE_HINT = "4-character grid square"
|
23
|
+
|
24
|
+
name = "VHF SPRINT"
|
25
|
+
mode = "BOTH" # CW SSB BOTH RTTY
|
26
|
+
cabrillo_name = "VHF-SPRINT"
|
27
|
+
|
28
|
+
columns = [
|
29
|
+
"YYYY-MM-DD HH:MM:SS",
|
30
|
+
"Call",
|
31
|
+
"Freq",
|
32
|
+
"Mode",
|
33
|
+
"SentNr",
|
34
|
+
"RcvNr",
|
35
|
+
"PTS",
|
36
|
+
]
|
37
|
+
|
38
|
+
advance_on_space = [True, True, True, True, True]
|
39
|
+
|
40
|
+
# 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
|
41
|
+
dupe_type = 3
|
42
|
+
|
43
|
+
|
44
|
+
def init_contest(self):
|
45
|
+
"""setup plugin"""
|
46
|
+
set_tab_next(self)
|
47
|
+
set_tab_prev(self)
|
48
|
+
interface(self)
|
49
|
+
self.next_field = self.other_2
|
50
|
+
|
51
|
+
|
52
|
+
def interface(self):
|
53
|
+
"""Setup user interface"""
|
54
|
+
self.field1.hide()
|
55
|
+
self.field2.hide()
|
56
|
+
self.field3.show()
|
57
|
+
self.field4.show()
|
58
|
+
self.snt_label.setText("SNT")
|
59
|
+
self.field1.setAccessibleName("RST Sent")
|
60
|
+
self.other_label.setText("Sent Grid")
|
61
|
+
self.field3.setAccessibleName("Sent Grid")
|
62
|
+
self.exch_label.setText("Grid")
|
63
|
+
self.field4.setAccessibleName("Gridsquare")
|
64
|
+
|
65
|
+
|
66
|
+
modifying
|
67
|
+
|
68
|
+
|
69
|
+
def reset_label(self):
|
70
|
+
"""reset label after field cleared"""
|
71
|
+
|
72
|
+
|
73
|
+
def set_tab_next(self):
|
74
|
+
"""Set TAB Advances"""
|
75
|
+
self.tab_next = {
|
76
|
+
self.callsign: self.other_1,
|
77
|
+
self.other_1: self.other_2,
|
78
|
+
self.other_2: self.callsign,
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
def set_tab_prev(self):
|
83
|
+
"""Set TAB Advances"""
|
84
|
+
self.tab_prev = {
|
85
|
+
self.callsign: self.other_2,
|
86
|
+
self.other_2: self.other_1,
|
87
|
+
self.other_1: self.callsign,
|
88
|
+
}
|
89
|
+
|
90
|
+
|
91
|
+
def validate(self):
|
92
|
+
"""doc"""
|
93
|
+
# exchange = self.other_2.text().upper().split()
|
94
|
+
# if len(exchange) == 3:
|
95
|
+
# if exchange[0].isalpha() and exchange[1].isdigit() and exchange[2].isalpha():
|
96
|
+
# return True
|
97
|
+
# return False
|
98
|
+
return True
|
99
|
+
|
100
|
+
|
101
|
+
def set_contact_vars(self):
|
102
|
+
"""Contest Specific"""
|
103
|
+
self.contact["SNT"] = self.sent.text()
|
104
|
+
self.contact["RCV"] = self.receive.text()
|
105
|
+
self.contact["NR"] = self.other_2.text().upper()
|
106
|
+
self.contact["SentNr"] = self.other_1.text()
|
107
|
+
|
108
|
+
|
109
|
+
def predupe(self):
|
110
|
+
"""called after callsign entered"""
|
111
|
+
|
112
|
+
|
113
|
+
def prefill(self):
|
114
|
+
"""Fill sentnr"""
|
115
|
+
result = self.database.get_serial()
|
116
|
+
serial_nr = str(result.get("serial_nr", "1")).zfill(3)
|
117
|
+
if serial_nr == "None":
|
118
|
+
serial_nr = "001"
|
119
|
+
|
120
|
+
exchange = self.contest_settings.get("SentExchange", "").replace("#", serial_nr)
|
121
|
+
if len(self.other_1.text()) == 0:
|
122
|
+
self.other_1.setText(exchange)
|
123
|
+
|
124
|
+
|
125
|
+
def points(self):
|
126
|
+
"""Calc point"""
|
127
|
+
|
128
|
+
# QSO Points: 1 point per QSO
|
129
|
+
|
130
|
+
if self.contact_is_dupe > 0:
|
131
|
+
return 0
|
132
|
+
|
133
|
+
_band = self.contact.get("Band", "")
|
134
|
+
if _band in ["50", "144"]:
|
135
|
+
return 1
|
136
|
+
if _band in ["222", "432"]:
|
137
|
+
return 1
|
138
|
+
if _band in ["902", "1296"]:
|
139
|
+
return 1
|
140
|
+
if _band in ["2300+"]:
|
141
|
+
return 1
|
142
|
+
return 0
|
143
|
+
|
144
|
+
|
145
|
+
def show_mults(self):
|
146
|
+
"""Return display string for mults"""
|
147
|
+
# Multipliers: Grid squares once per band
|
148
|
+
|
149
|
+
dx = 0
|
150
|
+
|
151
|
+
sql = (
|
152
|
+
"select count(DISTINCT(NR || ':' || Band)) as mult_count "
|
153
|
+
f"from dxlog where ContestNR = {self.database.current_contest} and typeof(NR) = 'text';"
|
154
|
+
)
|
155
|
+
result = self.database.exec_sql(sql)
|
156
|
+
|
157
|
+
if result:
|
158
|
+
dx = result.get("mult_count", 0)
|
159
|
+
|
160
|
+
return dx
|
161
|
+
|
162
|
+
|
163
|
+
def show_qso(self):
|
164
|
+
"""Return qso count"""
|
165
|
+
result = self.database.fetch_qso_count()
|
166
|
+
if result:
|
167
|
+
return int(result.get("qsos", 0))
|
168
|
+
return 0
|
169
|
+
|
170
|
+
|
171
|
+
def calc_score(self):
|
172
|
+
"""Return calculated score"""
|
173
|
+
# Multipliers: Each US State + DC once per mode
|
174
|
+
_points = get_points(self)
|
175
|
+
_mults = show_mults(self)
|
176
|
+
_power_mult = 1
|
177
|
+
# if self.contest_settings.get("PowerCategory", "") == "QRP":
|
178
|
+
# _power_mult = 2
|
179
|
+
return _points * _power_mult * _mults
|
180
|
+
|
181
|
+
|
182
|
+
def adif(self):
|
183
|
+
"""Call the generate ADIF function"""
|
184
|
+
gen_adif(self, cabrillo_name)
|
185
|
+
|
186
|
+
|
187
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
188
|
+
""""""
|
189
|
+
print(
|
190
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
191
|
+
end=ending,
|
192
|
+
file=file_descriptor,
|
193
|
+
)
|
194
|
+
|
195
|
+
|
196
|
+
def cabrillo(self, file_encoding):
|
197
|
+
"""Generates Cabrillo file. Maybe."""
|
198
|
+
# https://www.cqwpx.com/cabrillo.htm
|
199
|
+
logger.debug("******Cabrillo*****")
|
200
|
+
logger.debug("Station: %s", f"{self.station}")
|
201
|
+
logger.debug("Contest: %s", f"{self.contest_settings}")
|
202
|
+
now = datetime.datetime.now()
|
203
|
+
date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
|
204
|
+
filename = (
|
205
|
+
str(Path.home())
|
206
|
+
+ "/"
|
207
|
+
+ f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
|
208
|
+
)
|
209
|
+
logger.debug("%s", filename)
|
210
|
+
log = self.database.fetch_all_contacts_asc()
|
211
|
+
try:
|
212
|
+
with open(filename, "w", encoding=file_encoding, newline="") as file_descriptor:
|
213
|
+
output_cabrillo_line(
|
214
|
+
"START-OF-LOG: 3.0",
|
215
|
+
"\r\n",
|
216
|
+
file_descriptor,
|
217
|
+
file_encoding,
|
218
|
+
)
|
219
|
+
output_cabrillo_line(
|
220
|
+
f"CREATED-BY: Not1MM v{__version__}",
|
221
|
+
"\r\n",
|
222
|
+
file_descriptor,
|
223
|
+
file_encoding,
|
224
|
+
)
|
225
|
+
output_cabrillo_line(
|
226
|
+
f"CONTEST: {cabrillo_name}",
|
227
|
+
"\r\n",
|
228
|
+
file_descriptor,
|
229
|
+
file_encoding,
|
230
|
+
)
|
231
|
+
if self.station.get("Club", ""):
|
232
|
+
output_cabrillo_line(
|
233
|
+
f"CLUB: {self.station.get('Club', '').upper()}",
|
234
|
+
"\r\n",
|
235
|
+
file_descriptor,
|
236
|
+
file_encoding,
|
237
|
+
)
|
238
|
+
output_cabrillo_line(
|
239
|
+
f"CALLSIGN: {self.station.get('Call','')}",
|
240
|
+
"\r\n",
|
241
|
+
file_descriptor,
|
242
|
+
file_encoding,
|
243
|
+
)
|
244
|
+
output_cabrillo_line(
|
245
|
+
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
246
|
+
"\r\n",
|
247
|
+
file_descriptor,
|
248
|
+
file_encoding,
|
249
|
+
)
|
250
|
+
output_cabrillo_line(
|
251
|
+
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
252
|
+
"\r\n",
|
253
|
+
file_descriptor,
|
254
|
+
file_encoding,
|
255
|
+
)
|
256
|
+
output_cabrillo_line(
|
257
|
+
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
258
|
+
"\r\n",
|
259
|
+
file_descriptor,
|
260
|
+
file_encoding,
|
261
|
+
)
|
262
|
+
output_cabrillo_line(
|
263
|
+
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
264
|
+
"\r\n",
|
265
|
+
file_descriptor,
|
266
|
+
file_encoding,
|
267
|
+
)
|
268
|
+
mode = self.contest_settings.get("ModeCategory", "")
|
269
|
+
if mode in ["SSB+CW", "SSB+CW+DIGITAL"]:
|
270
|
+
mode = "MIXED"
|
271
|
+
output_cabrillo_line(
|
272
|
+
f"CATEGORY-MODE: {mode}",
|
273
|
+
"\r\n",
|
274
|
+
file_descriptor,
|
275
|
+
file_encoding,
|
276
|
+
)
|
277
|
+
output_cabrillo_line(
|
278
|
+
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
279
|
+
"\r\n",
|
280
|
+
file_descriptor,
|
281
|
+
file_encoding,
|
282
|
+
)
|
283
|
+
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
284
|
+
output_cabrillo_line(
|
285
|
+
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
286
|
+
"\r\n",
|
287
|
+
file_descriptor,
|
288
|
+
file_encoding,
|
289
|
+
)
|
290
|
+
output_cabrillo_line(
|
291
|
+
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
292
|
+
"\r\n",
|
293
|
+
file_descriptor,
|
294
|
+
file_encoding,
|
295
|
+
)
|
296
|
+
output_cabrillo_line(
|
297
|
+
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
298
|
+
"\r\n",
|
299
|
+
file_descriptor,
|
300
|
+
file_encoding,
|
301
|
+
)
|
302
|
+
|
303
|
+
output_cabrillo_line(
|
304
|
+
f"CLAIMED-SCORE: {calc_score(self)}",
|
305
|
+
"\r\n",
|
306
|
+
file_descriptor,
|
307
|
+
file_encoding,
|
308
|
+
)
|
309
|
+
ops = f"@{self.station.get('Call','')}"
|
310
|
+
list_of_ops = self.database.get_ops()
|
311
|
+
for op in list_of_ops:
|
312
|
+
ops += f", {op.get('Operator', '')}"
|
313
|
+
output_cabrillo_line(
|
314
|
+
f"OPERATORS: {ops}",
|
315
|
+
"\r\n",
|
316
|
+
file_descriptor,
|
317
|
+
file_encoding,
|
318
|
+
)
|
319
|
+
output_cabrillo_line(
|
320
|
+
f"NAME: {self.station.get('Name', '')}",
|
321
|
+
"\r\n",
|
322
|
+
file_descriptor,
|
323
|
+
file_encoding,
|
324
|
+
)
|
325
|
+
output_cabrillo_line(
|
326
|
+
f"ADDRESS: {self.station.get('Street1', '')}",
|
327
|
+
"\r\n",
|
328
|
+
file_descriptor,
|
329
|
+
file_encoding,
|
330
|
+
)
|
331
|
+
output_cabrillo_line(
|
332
|
+
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
333
|
+
"\r\n",
|
334
|
+
file_descriptor,
|
335
|
+
file_encoding,
|
336
|
+
)
|
337
|
+
output_cabrillo_line(
|
338
|
+
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
339
|
+
"\r\n",
|
340
|
+
file_descriptor,
|
341
|
+
file_encoding,
|
342
|
+
)
|
343
|
+
output_cabrillo_line(
|
344
|
+
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
345
|
+
"\r\n",
|
346
|
+
file_descriptor,
|
347
|
+
file_encoding,
|
348
|
+
)
|
349
|
+
output_cabrillo_line(
|
350
|
+
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
351
|
+
"\r\n",
|
352
|
+
file_descriptor,
|
353
|
+
file_encoding,
|
354
|
+
)
|
355
|
+
output_cabrillo_line(
|
356
|
+
f"EMAIL: {self.station.get('Email', '')}",
|
357
|
+
"\r\n",
|
358
|
+
file_descriptor,
|
359
|
+
file_encoding,
|
360
|
+
)
|
361
|
+
for contact in log:
|
362
|
+
the_date_and_time = contact.get("TS", "")
|
363
|
+
themode = contact.get("Mode", "")
|
364
|
+
if themode in ("LSB", "USB", "AM"):
|
365
|
+
themode = "PH"
|
366
|
+
if themode in (
|
367
|
+
"FT8",
|
368
|
+
"FT4",
|
369
|
+
"RTTY",
|
370
|
+
"PSK31",
|
371
|
+
"FSK441",
|
372
|
+
"MSK144",
|
373
|
+
"JT65",
|
374
|
+
"JT9",
|
375
|
+
"Q65",
|
376
|
+
):
|
377
|
+
themode = "DG"
|
378
|
+
freq = int(contact.get("Freq", "0")) / 1000
|
379
|
+
|
380
|
+
frequency = str(int(freq)).rjust(4)
|
381
|
+
|
382
|
+
loggeddate = the_date_and_time[:10]
|
383
|
+
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
384
|
+
output_cabrillo_line(
|
385
|
+
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
386
|
+
f"{contact.get('StationPrefix', '').ljust(13)} "
|
387
|
+
# f"{str(contact.get('SNT', '')).ljust(3)} "
|
388
|
+
f"{str(contact.get('SentNr', '')).ljust(6)} "
|
389
|
+
f"{contact.get('Call', '').ljust(13)} "
|
390
|
+
# f"{str(contact.get('RCV', '')).ljust(3)} "
|
391
|
+
f"{str(contact.get('NR', '')).ljust(6)}",
|
392
|
+
"\r\n",
|
393
|
+
file_descriptor,
|
394
|
+
file_encoding,
|
395
|
+
)
|
396
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
397
|
+
self.show_message_box(f"Cabrillo saved to: {filename}")
|
398
|
+
except IOError as exception:
|
399
|
+
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
400
|
+
self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
|
401
|
+
return
|
402
|
+
|
403
|
+
|
404
|
+
def recalculate_mults(self):
|
405
|
+
"""Recalculates multipliers after change in logged qso."""
|
406
|
+
|
407
|
+
|
408
|
+
def set_self(the_outie):
|
409
|
+
"""..."""
|
410
|
+
globals()["ALTEREGO"] = the_outie
|
411
|
+
|
412
|
+
|
413
|
+
def ft8_handler(the_packet: dict):
|
414
|
+
"""Process FT8 QSO packets
|
415
|
+
FT8
|
416
|
+
{
|
417
|
+
'CALL': 'KE0OG',
|
418
|
+
'GRIDSQUARE': 'DM10AT',
|
419
|
+
'MODE': 'FT8',
|
420
|
+
'RST_SENT': '',
|
421
|
+
'RST_RCVD': '',
|
422
|
+
'QSO_DATE': '20210329',
|
423
|
+
'TIME_ON': '183213',
|
424
|
+
'QSO_DATE_OFF': '20210329',
|
425
|
+
'TIME_OFF': '183213',
|
426
|
+
'BAND': '20M',
|
427
|
+
'FREQ': '14.074754',
|
428
|
+
'STATION_CALLSIGN': 'K6GTE',
|
429
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
430
|
+
'CONTEST_ID': 'ARRL-FIELD-DAY',
|
431
|
+
'SRX_STRING': '1D UT',
|
432
|
+
'CLASS': '1D',
|
433
|
+
'ARRL_SECT': 'UT'
|
434
|
+
}
|
435
|
+
FlDigi
|
436
|
+
{
|
437
|
+
'FREQ': '7.029500',
|
438
|
+
'CALL': 'DL2DSL',
|
439
|
+
'MODE': 'RTTY',
|
440
|
+
'NAME': 'BOB',
|
441
|
+
'QSO_DATE': '20240904',
|
442
|
+
'QSO_DATE_OFF': '20240904',
|
443
|
+
'TIME_OFF': '212825',
|
444
|
+
'TIME_ON': '212800',
|
445
|
+
'RST_RCVD': '599',
|
446
|
+
'RST_SENT': '599',
|
447
|
+
'BAND': '40M',
|
448
|
+
'COUNTRY': 'FED. REP. OF GERMANY',
|
449
|
+
'CQZ': '14',
|
450
|
+
'STX': '000',
|
451
|
+
'STX_STRING': '1D ORG',
|
452
|
+
'CLASS': '1D',
|
453
|
+
'ARRL_SECT': 'DX',
|
454
|
+
'TX_PWR': '0',
|
455
|
+
'OPERATOR': 'K6GTE',
|
456
|
+
'STATION_CALLSIGN': 'K6GTE',
|
457
|
+
'MY_GRIDSQUARE': 'DM13AT',
|
458
|
+
'MY_CITY': 'ANAHEIM, CA',
|
459
|
+
'MY_STATE': 'CA'
|
460
|
+
}
|
461
|
+
|
462
|
+
"""
|
463
|
+
logger.debug(f"{the_packet=}")
|
464
|
+
if ALTEREGO is not None:
|
465
|
+
ALTEREGO.callsign.setText(the_packet.get("CALL"))
|
466
|
+
ALTEREGO.contact["Call"] = the_packet.get("CALL", "")
|
467
|
+
ALTEREGO.contact["SNT"] = ALTEREGO.sent.text()
|
468
|
+
ALTEREGO.contact["RCV"] = ALTEREGO.receive.text()
|
469
|
+
my_grid = the_packet.get("MY_GRIDSQUARE", "")
|
470
|
+
if my_grid:
|
471
|
+
if len(my_grid) > 4:
|
472
|
+
my_grid = my_grid[:4]
|
473
|
+
their_grid = the_packet.get("GRIDSQUARE", "")
|
474
|
+
if their_grid:
|
475
|
+
if len(their_grid) > 4:
|
476
|
+
their_grid = their_grid[:4]
|
477
|
+
ALTEREGO.contact["NR"] = their_grid
|
478
|
+
# ALTEREGO.contact["Sect"] = the_packet.get("ARRL_SECT", "ERR")
|
479
|
+
if the_packet.get("SUBMODE"):
|
480
|
+
ALTEREGO.contact["Mode"] = the_packet.get("SUBMODE", "ERR")
|
481
|
+
else:
|
482
|
+
ALTEREGO.contact["Mode"] = the_packet.get("MODE", "ERR")
|
483
|
+
ALTEREGO.contact["Freq"] = round(float(the_packet.get("FREQ", "0.0")) * 1000, 2)
|
484
|
+
ALTEREGO.contact["QSXFreq"] = round(
|
485
|
+
float(the_packet.get("FREQ", "0.0")) * 1000, 2
|
486
|
+
)
|
487
|
+
ALTEREGO.contact["Band"] = get_logged_band(
|
488
|
+
str(int(float(the_packet.get("FREQ", "0.0")) * 1000000))
|
489
|
+
)
|
490
|
+
logger.debug(f"{ALTEREGO.contact=}")
|
491
|
+
ALTEREGO.other_1.setText(my_grid)
|
492
|
+
ALTEREGO.other_2.setText(their_grid)
|
493
|
+
ALTEREGO.save_contact()
|
494
|
+
|
495
|
+
|
496
|
+
def process_esm(self, new_focused_widget=None, with_enter=False):
|
497
|
+
"""ESM State Machine"""
|
498
|
+
|
499
|
+
# self.pref["run_state"]
|
500
|
+
|
501
|
+
# -----===== Assigned F-Keys =====-----
|
502
|
+
# self.esm_dict["CQ"]
|
503
|
+
# self.esm_dict["EXCH"]
|
504
|
+
# self.esm_dict["QRZ"]
|
505
|
+
# self.esm_dict["AGN"]
|
506
|
+
# self.esm_dict["HISCALL"]
|
507
|
+
# self.esm_dict["MYCALL"]
|
508
|
+
# self.esm_dict["QSOB4"]
|
509
|
+
|
510
|
+
# ----==== text fields ====----
|
511
|
+
# self.callsign
|
512
|
+
# self.sent
|
513
|
+
# self.receive
|
514
|
+
# self.other_1
|
515
|
+
# self.other_2
|
516
|
+
|
517
|
+
if new_focused_widget is not None:
|
518
|
+
self.current_widget = self.inputs_dict.get(new_focused_widget)
|
519
|
+
|
520
|
+
# print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
|
521
|
+
|
522
|
+
for a_button in [
|
523
|
+
self.esm_dict["CQ"],
|
524
|
+
self.esm_dict["EXCH"],
|
525
|
+
self.esm_dict["QRZ"],
|
526
|
+
self.esm_dict["AGN"],
|
527
|
+
self.esm_dict["HISCALL"],
|
528
|
+
self.esm_dict["MYCALL"],
|
529
|
+
self.esm_dict["QSOB4"],
|
530
|
+
]:
|
531
|
+
if a_button is not None:
|
532
|
+
self.restore_button_color(a_button)
|
533
|
+
|
534
|
+
buttons_to_send = []
|
535
|
+
|
536
|
+
if self.pref.get("run_state"):
|
537
|
+
if self.current_widget == "callsign":
|
538
|
+
if len(self.callsign.text()) < 3:
|
539
|
+
self.make_button_green(self.esm_dict["CQ"])
|
540
|
+
buttons_to_send.append(self.esm_dict["CQ"])
|
541
|
+
elif len(self.callsign.text()) > 2:
|
542
|
+
self.make_button_green(self.esm_dict["HISCALL"])
|
543
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
544
|
+
buttons_to_send.append(self.esm_dict["HISCALL"])
|
545
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
546
|
+
|
547
|
+
elif self.current_widget in ["other_2"]:
|
548
|
+
if self.other_2.text() == "":
|
549
|
+
self.make_button_green(self.esm_dict["AGN"])
|
550
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
551
|
+
else:
|
552
|
+
self.make_button_green(self.esm_dict["QRZ"])
|
553
|
+
buttons_to_send.append(self.esm_dict["QRZ"])
|
554
|
+
buttons_to_send.append("LOGIT")
|
555
|
+
|
556
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
557
|
+
for button in buttons_to_send:
|
558
|
+
if button:
|
559
|
+
if button == "LOGIT":
|
560
|
+
self.save_contact()
|
561
|
+
continue
|
562
|
+
self.process_function_key(button)
|
563
|
+
else:
|
564
|
+
if self.current_widget == "callsign":
|
565
|
+
if len(self.callsign.text()) > 2:
|
566
|
+
self.make_button_green(self.esm_dict["MYCALL"])
|
567
|
+
buttons_to_send.append(self.esm_dict["MYCALL"])
|
568
|
+
|
569
|
+
elif self.current_widget in ["other_2"]:
|
570
|
+
if self.other_2.text() == "":
|
571
|
+
self.make_button_green(self.esm_dict["AGN"])
|
572
|
+
buttons_to_send.append(self.esm_dict["AGN"])
|
573
|
+
else:
|
574
|
+
self.make_button_green(self.esm_dict["EXCH"])
|
575
|
+
buttons_to_send.append(self.esm_dict["EXCH"])
|
576
|
+
buttons_to_send.append("LOGIT")
|
577
|
+
|
578
|
+
if with_enter is True and bool(len(buttons_to_send)):
|
579
|
+
for button in buttons_to_send:
|
580
|
+
if button:
|
581
|
+
if button == "LOGIT":
|
582
|
+
self.save_contact()
|
583
|
+
continue
|
584
|
+
self.process_function_key(button)
|
585
|
+
|
586
|
+
|
587
|
+
def populate_history_info_line(self):
|
588
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
589
|
+
if result:
|
590
|
+
self.history_info.setText(
|
591
|
+
f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Loc1', '')}, {result.get('UserText','...')}"
|
592
|
+
)
|
593
|
+
else:
|
594
|
+
self.history_info.setText("")
|
595
|
+
|
596
|
+
|
597
|
+
def check_call_history(self):
|
598
|
+
""""""
|
599
|
+
result = self.database.fetch_call_history(self.callsign.text())
|
600
|
+
if result:
|
601
|
+
self.history_info.setText(f"{result.get('UserText','')}")
|
602
|
+
if self.other_2.text() == "":
|
603
|
+
self.other_2.setText(f"{result.get('Loc1', '')}")
|
604
|
+
|
605
|
+
|
606
|
+
# !!Order!!,Call,Name,Loc1,UserText,
|
607
|
+
# gridsquare
|
608
|
+
def get_mults(self):
|
609
|
+
""""""
|
610
|
+
|
611
|
+
mults = {}
|
612
|
+
mults["gridsquare"] = show_mults(self)
|
613
|
+
return mults
|
614
|
+
|
615
|
+
|
616
|
+
def just_points(self):
|
617
|
+
""""""
|
618
|
+
result = self.database.fetch_points()
|
619
|
+
if result is not None:
|
620
|
+
score = result.get("Points", "0")
|
621
|
+
if score is None:
|
622
|
+
score = "0"
|
623
|
+
return int(score)
|
624
|
+
return 0
|
not1mm/radio.py
CHANGED
@@ -15,7 +15,7 @@ import logging
|
|
15
15
|
from PyQt6.QtCore import QObject, pyqtSignal, QThread, QEventLoop
|
16
16
|
from not1mm.lib.cat_interface import CAT
|
17
17
|
|
18
|
-
logger = logging.getLogger("
|
18
|
+
logger = logging.getLogger("radio")
|
19
19
|
|
20
20
|
|
21
21
|
class Radio(QObject):
|
@@ -103,7 +103,7 @@ class Radio(QObject):
|
|
103
103
|
except QEventLoop:
|
104
104
|
...
|
105
105
|
# QThread.msleep(int(self.delta / 2))
|
106
|
-
QThread.msleep(
|
106
|
+
QThread.msleep(100)
|
107
107
|
|
108
108
|
def store_last_data_mode(self, the_mode: str = ""):
|
109
109
|
"""if the last mode is a data mode, save it."""
|
not1mm/ratewindow.py
CHANGED
@@ -118,9 +118,8 @@ class RateWindow(QDockWidget):
|
|
118
118
|
|
119
119
|
# WHERE datetime(timestamp) > datetime(current_timestamp, '-60 minutes')
|
120
120
|
|
121
|
-
if not self.active:
|
121
|
+
if not self.active or not self.isVisible():
|
122
122
|
return
|
123
|
-
|
124
123
|
# Get Q's in the 60 Minutes
|
125
124
|
query = f"select (julianday(MAX(ts)) - julianday(MIN(ts))) * 24 * 60 as timespan, count(*) as items from (select * from dxlog where ContestNR = {self.database.current_contest} and datetime(TS) > datetime(current_timestamp, '-60 minutes'));"
|
126
125
|
result = self.database.exec_sql(query)
|
not1mm/vfo.py
CHANGED
@@ -189,6 +189,8 @@ class VfoWindow(QDockWidget):
|
|
189
189
|
Poll radio via CAT asking for VFO state.
|
190
190
|
If it's with in the HAM bands set the vfo knob to match the radio.
|
191
191
|
"""
|
192
|
+
if not self.isVisible():
|
193
|
+
return
|
192
194
|
if self.rig_control:
|
193
195
|
if self.rig_control.online is False:
|
194
196
|
self.rig_control.reinit()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: not1mm
|
3
|
-
Version: 25.4.
|
3
|
+
Version: 25.4.25
|
4
4
|
Summary: NOT1MM Logger
|
5
5
|
Author-email: Michael Bridak <michael.bridak@gmail.com>
|
6
6
|
License: GPL-3.0-or-later
|
@@ -256,6 +256,8 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
|
|
256
256
|
|
257
257
|
## Recent Changes
|
258
258
|
|
259
|
+
- [25-4-25] Merged PR from @microphonon making changes to ARRL VHF and CWOps CWT.
|
260
|
+
- [25-4-22] Mostly code cleanup. Not running some code when not needed.
|
259
261
|
- [25-4-21] Add a couple more debug messages. Add LSB/USB to input-able commands to the callsign field.
|
260
262
|
- [25-4-19-1] Add FM and AM as input-able commands to the callsign field.
|
261
263
|
- [25-4-19] Changed S&P QSY wipe from 50hz to 500hz.
|
@@ -1,16 +1,16 @@
|
|
1
1
|
not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
not1mm/__main__.py,sha256=
|
3
|
-
not1mm/bandmap.py,sha256
|
2
|
+
not1mm/__main__.py,sha256=bf-uGk88mT8OVbDJFr6wu-5StUBYNWBAJS1E8l8avCE,156555
|
3
|
+
not1mm/bandmap.py,sha256=n8mrRzo_8b1muzICk8nSpvaiAV4NyNoUkZBa6Rjprns,29968
|
4
4
|
not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
|
5
5
|
not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
|
6
6
|
not1mm/logwindow.py,sha256=e36t4ebyhLF6UR3y3HJWUwL1rzeqRFzdek7NAYINJNM,42565
|
7
7
|
not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
|
8
|
-
not1mm/radio.py,sha256=
|
9
|
-
not1mm/ratewindow.py,sha256=
|
8
|
+
not1mm/radio.py,sha256=4Lysf9BY3vdtYCHwKfzO5WN7IGyh4_lKSVuQ6F4Z08g,5536
|
9
|
+
not1mm/ratewindow.py,sha256=vMM56sOWbglQXf16Rhhgx2V4uaiGzTkfmcOmhgNd1GQ,7018
|
10
10
|
not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
|
11
11
|
not1mm/statistics.py,sha256=YbXBCr8wtmXlF21ojgsh0jY_G-dnCApUFe87JZclZAI,7712
|
12
12
|
not1mm/test.py,sha256=BNhsSvLnNG5hN4pywIWnj4pUBI-wQYY4Ejfbl97knmw,1198
|
13
|
-
not1mm/vfo.py,sha256=
|
13
|
+
not1mm/vfo.py,sha256=LbGjJKb6ipDEbEEcaeIR2DiEpReolamSzuY25rU3iOo,8997
|
14
14
|
not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
|
15
15
|
not1mm/data/JetBrainsMono-ExtraLight.ttf,sha256=g5Hn7BPounWMGDj1a8zZcyKMz03HSqW__pUluRR7Evg,274144
|
16
16
|
not1mm/data/MASTER.SCP,sha256=LuF8dTtdRKaqSyzJ1nl7zW2-gs5ehQiXiI41t5Zo9Bo,362769
|
@@ -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=-JDQXOaxj8_7Wda9KT2rEM4YUjBs31CiT1Rjc_DBobM,64907
|
37
|
-
not1mm/data/new_contest.ui,sha256=
|
37
|
+
not1mm/data/new_contest.ui,sha256=KrtNDS41-Cr1Kzt9IR9sVEyjsLXlj4R1I2GHRKjP9oo,25331
|
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
|
@@ -100,7 +100,7 @@ not1mm/data/phonetics/yourcall.wav,sha256=4kheHJmCiRDL2kjhlgXQ8_u_eEMgKxiNGu5UBk
|
|
100
100
|
not1mm/data/phonetics/z.wav,sha256=arafCi7fwmBLdVDI-PRyaL4U-03PIQDhffwY5noJ_2c,51768
|
101
101
|
not1mm/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
102
102
|
not1mm/lib/about.py,sha256=sWycfGcruN3SaEe4JmaJ61K6D8Itq0WxpUYT-lEcmYM,416
|
103
|
-
not1mm/lib/cat_interface.py,sha256=
|
103
|
+
not1mm/lib/cat_interface.py,sha256=zMSGSVl7B_hX2XIpTpdyepedyfFTm0rFVWRpSZvadoc,26637
|
104
104
|
not1mm/lib/cwinterface.py,sha256=rKUnqljHQC_Iljq4TCmAgSPe49lWbKcfxg58cE8YX5Y,5177
|
105
105
|
not1mm/lib/database.py,sha256=fykyaQaTa_Pwde51f09Odbexy1mlUqObv0fjZ7hf3E0,51693
|
106
106
|
not1mm/lib/edit_contact.py,sha256=Ki9bGPpqyQQBB1cU8VIBDCal3lbXeQ6qxhzklmhE2_w,353
|
@@ -118,7 +118,7 @@ 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=cC83Nw4pGLWyHybIflDR1ylX9P7Hq2P5b5yFZtx-llY,15410
|
120
120
|
not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
|
121
|
-
not1mm/lib/version.py,sha256=
|
121
|
+
not1mm/lib/version.py,sha256=a8J0jgqJTJWnoNOX19Zci1oHdY2sZo75ehPTDVk8p4o,48
|
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
|
@@ -134,9 +134,9 @@ not1mm/plugins/arrl_field_day.py,sha256=CzUAzcOus4MwJ0Ha08OvQwCfjcfRRNIEx1WCL9xB
|
|
134
134
|
not1mm/plugins/arrl_rtty_ru.py,sha256=bxOvrcb6R_Qf3H2MnkfpQkAfJbCyGjKwbZXt1PHCuAM,20957
|
135
135
|
not1mm/plugins/arrl_ss_cw.py,sha256=WnRiVLqiC_sX4QqDyyMOy3f07IJCPgxkFf9PstKkhK4,17522
|
136
136
|
not1mm/plugins/arrl_ss_phone.py,sha256=PzybC--tSB7_oNLbbN9xYkMnftH-z6qgcGZUp3-JGLU,16858
|
137
|
-
not1mm/plugins/arrl_vhf_jan.py,sha256=
|
138
|
-
not1mm/plugins/arrl_vhf_jun.py,sha256=
|
139
|
-
not1mm/plugins/arrl_vhf_sep.py,sha256=
|
137
|
+
not1mm/plugins/arrl_vhf_jan.py,sha256=paYrF_o1EotBRmXn_x9_hEM16SWx7sLDzoSoXcYXcCY,20201
|
138
|
+
not1mm/plugins/arrl_vhf_jun.py,sha256=WwQ-UGFekIZj26bIbq3sLacTYMmUzBYySHhPz2APm2M,19293
|
139
|
+
not1mm/plugins/arrl_vhf_sep.py,sha256=kq5Rncru74G9B76VwfXMeTaF9AL8hq-1vw9ZMYmJmvM,19326
|
140
140
|
not1mm/plugins/canada_day.py,sha256=89aGXm4S9PjKL9FYm3z7BMFRz--MugQQilwQnzLJvv0,15770
|
141
141
|
not1mm/plugins/cq_160_cw.py,sha256=bmHtxVcIWsqmgqpMCMso7DCBERtAr9fIKIjgymSKtms,18711
|
142
142
|
not1mm/plugins/cq_160_ssb.py,sha256=9KKDmmapETEebm1azfEzUWk1NyW3TBnYtBlFIPZYHBs,18754
|
@@ -146,7 +146,7 @@ not1mm/plugins/cq_wpx_ssb.py,sha256=mtUD0tQnraDHoCHIeuWpOD64my3Kni9mXVH5IF2QPL0,
|
|
146
146
|
not1mm/plugins/cq_ww_cw.py,sha256=EtcfWGZCb49WXBNoVzB7WCy5JmLc1KLglmA0O1PFN2w,18040
|
147
147
|
not1mm/plugins/cq_ww_rtty.py,sha256=2u3k4ofPh3S4B-BVlQtis-X4rwdx221WRf3hjHWPEyg,22549
|
148
148
|
not1mm/plugins/cq_ww_ssb.py,sha256=txeBfJ8rZCrAG2BWY-UmTH81ufRYbkeJJ6NpnV1eKKg,18055
|
149
|
-
not1mm/plugins/cwt.py,sha256=
|
149
|
+
not1mm/plugins/cwt.py,sha256=ozNGV_ziOjxJoFuqBjJC8_r9CWqJhunQJD5g9YrJBEM,17446
|
150
150
|
not1mm/plugins/darc_vhf.py,sha256=cyckJ-0c_z7uONEWwxbvxi_olxPP0NJm3ryQRCkT5tE,27419
|
151
151
|
not1mm/plugins/darc_xmas.py,sha256=p5UNYLdtylsC_sSlxT8NvXXL1oSW0KyUhIN-rJonHgI,18971
|
152
152
|
not1mm/plugins/ea_majistad_cw.py,sha256=tl9y92Oz4NTch4H-SrBnZND2tHGqWQvtgl3emXfU8og,23352
|
@@ -177,11 +177,12 @@ not1mm/plugins/sac_ssb.py,sha256=_hzcU-ZN9S8Z1HrLXIdUL-h60cVrTM3s9CGfksI35Uo,213
|
|
177
177
|
not1mm/plugins/spdx.py,sha256=O_PhTaWdjaV29hj2G8tUK3m6GNx8f40hO1JAF-olLMg,15909
|
178
178
|
not1mm/plugins/stew_perry_topband.py,sha256=3U-Dr28haBTqTaZWLiC1qHQBmLsLENDL-ihyddPpJbg,15403
|
179
179
|
not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,19105
|
180
|
+
not1mm/plugins/vhf_sprint.py,sha256=fi5oc7ko_iW4avIoVC76zc6GDEGCYn26GsAGAWaHqI4,19301
|
180
181
|
not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
|
181
182
|
not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
|
182
|
-
not1mm-25.4.
|
183
|
-
not1mm-25.4.
|
184
|
-
not1mm-25.4.
|
185
|
-
not1mm-25.4.
|
186
|
-
not1mm-25.4.
|
187
|
-
not1mm-25.4.
|
183
|
+
not1mm-25.4.25.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
184
|
+
not1mm-25.4.25.dist-info/METADATA,sha256=pwHeBlRKJSaJBgmDezHjXGwc32OH_fYxT2Waiv3vVrA,40678
|
185
|
+
not1mm-25.4.25.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
|
186
|
+
not1mm-25.4.25.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
|
187
|
+
not1mm-25.4.25.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
|
188
|
+
not1mm-25.4.25.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|