not1mm 25.5.21__py3-none-any.whl → 25.5.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/logwindow.py CHANGED
@@ -696,8 +696,9 @@ class LogWindow(QDockWidget):
696
696
  self.contact["RoverLocation"] = self.edit_contact_dialog.rover_qth.text()
697
697
 
698
698
  self.database.change_contact(self.contact)
699
+
699
700
  self.get_log()
700
- cmd = {}
701
+ cmd = self.contact.copy()
701
702
  cmd["cmd"] = "CONTACTCHANGED"
702
703
  self.message.emit(cmd)
703
704
  self.show_like_calls(self.contact.get("Call", ""))
@@ -715,6 +716,7 @@ class LogWindow(QDockWidget):
715
716
  None
716
717
  """
717
718
  self.database.delete_contact(self.contact.get("ID", ""))
719
+
718
720
  if self.n1mm:
719
721
  if self.n1mm.send_contact_packets:
720
722
  self.n1mm.contactdelete["timestamp"] = self.contact.get("TS", "")
@@ -728,7 +730,8 @@ class LogWindow(QDockWidget):
728
730
  self.edit_contact_dialog.close()
729
731
  self.get_log()
730
732
  cmd = {}
731
- cmd["cmd"] = "CONTACTCHANGED"
733
+ cmd["cmd"] = "DELETED"
734
+ cmd["ID"] = self.contact.get("ID", "")
732
735
  self.message.emit(cmd)
733
736
  self.show_like_calls(self.contact.get("Call", ""))
734
737
 
not1mm/ratewindow.py CHANGED
@@ -52,9 +52,6 @@ class RateWindow(QDockWidget):
52
52
  def msg_from_main(self, packet):
53
53
  """"""
54
54
 
55
- if self.active is False:
56
- return
57
-
58
55
  if packet.get("cmd", "") == "NEWDB":
59
56
  self.load_pref()
60
57
  self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
not1mm/statistics.py CHANGED
@@ -44,6 +44,15 @@ class StatsWindow(QDockWidget):
44
44
 
45
45
  def msg_from_main(self, packet):
46
46
  """"""
47
+ if packet.get("cmd", "") == "NEWDB":
48
+ self.load_pref()
49
+ self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
50
+ "current_database", "ham.db"
51
+ )
52
+ self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
53
+ self.database.current_contest = self.pref.get("contest", 0)
54
+ self.get_run_and_total_qs()
55
+
47
56
  if self.active is False:
48
57
  return
49
58
 
@@ -56,15 +65,6 @@ class StatsWindow(QDockWidget):
56
65
  self.get_run_and_total_qs()
57
66
  return
58
67
 
59
- if packet.get("cmd", "") == "NEWDB":
60
- self.load_pref()
61
- self.dbname = fsutils.USER_DATA_PATH / self.pref.get(
62
- "current_database", "ham.db"
63
- )
64
- self.database = DataBase(self.dbname, fsutils.APP_DATA_PATH)
65
- self.database.current_contest = self.pref.get("contest", 0)
66
- self.get_run_and_total_qs()
67
-
68
68
  def setActive(self, mode: bool) -> None:
69
69
  self.active = bool(mode)
70
70
 
not1mm/vfo.py CHANGED
@@ -12,9 +12,11 @@ Purpose: Provide onscreen widget that interacts with DIY VFO knob and remote rig
12
12
  # usb-Raspberry_Pi_Pico_E6612483CB1B242A-if00
13
13
  # usb-Raspberry_Pi_Pico_W_E6614C311B331139-if00
14
14
 
15
+ import datetime
15
16
  import logging
16
17
  import os
17
18
  from json import loads
19
+ import sys
18
20
 
19
21
  import serial
20
22
  from PyQt6 import QtCore, QtWidgets, uic
@@ -37,6 +39,7 @@ class VfoWindow(QDockWidget):
37
39
  multicast_interface = None
38
40
  current_palette = None
39
41
  device_reconnect = False
42
+ stale = datetime.datetime.now()
40
43
 
41
44
  def __init__(self):
42
45
  super().__init__()
@@ -102,13 +105,23 @@ class VfoWindow(QDockWidget):
102
105
  Return the device ID if it is, or None if not found.
103
106
  """
104
107
 
105
- devices = None
108
+ devices = self.get_devices()
106
109
  data = None
107
- try:
108
- devices = os.listdir("/dev/serial/by-id")
109
- except FileNotFoundError:
110
+ if devices is None:
111
+ return None
112
+ if sys.platform == "darwin":
113
+ for device in devices:
114
+ if "usb" in device:
115
+ try:
116
+ with serial.Serial("/dev/" + device, 115200) as ser:
117
+ ser.timeout = 1000
118
+ ser.write(b"whatareyou\r")
119
+ data = ser.readline()
120
+ except serial.serialutil.SerialException:
121
+ return None
122
+ if "vfoknob" in data.decode().strip():
123
+ return "/dev/" + device
110
124
  return None
111
-
112
125
  for device in devices:
113
126
  if "usb-Raspberry_Pi_Pico" in device:
114
127
  try:
@@ -119,7 +132,16 @@ class VfoWindow(QDockWidget):
119
132
  except serial.serialutil.SerialException:
120
133
  return None
121
134
  if "vfoknob" in data.decode().strip():
122
- return device
135
+ return "/dev/serial/by-id/" + device
136
+
137
+ def get_devices(self):
138
+ try:
139
+ if sys.platform != "darwin":
140
+ return os.listdir("/dev/serial/by-id")
141
+ return os.listdir("/dev/")
142
+ except FileNotFoundError:
143
+ return None
144
+ return None
123
145
 
124
146
  def window_state_changed(self):
125
147
  """Setup vfo knob if window is toggled on"""
@@ -139,7 +161,7 @@ class VfoWindow(QDockWidget):
139
161
  device = self.discover_device()
140
162
  if device:
141
163
  try:
142
- self.pico = serial.Serial("/dev/serial/by-id/" + device, 115200)
164
+ self.pico = serial.Serial(device, 115200)
143
165
  self.pico.timeout = 100
144
166
  self.lcdNumber.setStyleSheet("QLCDNumber { color: white; }")
145
167
  self.device_reconnect = True
@@ -191,6 +213,8 @@ class VfoWindow(QDockWidget):
191
213
  """
192
214
  if not self.isVisible():
193
215
  return
216
+ if datetime.datetime.now() < self.stale:
217
+ return
194
218
  if self.rig_control:
195
219
  if self.rig_control.online is False:
196
220
  self.rig_control.reinit()
@@ -227,8 +251,12 @@ class VfoWindow(QDockWidget):
227
251
  while self.pico.in_waiting:
228
252
  result = self.pico.read(self.pico.in_waiting)
229
253
  result = result.decode().strip()
254
+
230
255
  if self.old_pico != result:
231
256
  self.old_pico = result
257
+ self.stale = datetime.datetime.now() + datetime.timedelta(
258
+ seconds=1
259
+ )
232
260
  if self.rig_control:
233
261
  self.rig_control.set_vfo(result)
234
262
  self.showNumber(result)
@@ -240,6 +268,8 @@ class VfoWindow(QDockWidget):
240
268
  except AttributeError:
241
269
  logger.critical("Unable to write to serial device.")
242
270
  self.pico = None
271
+ except KeyboardInterrupt:
272
+ ...
243
273
 
244
274
  def show_message_box(self, message: str) -> None:
245
275
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.5.21
3
+ Version: 25.5.25
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -164,8 +164,10 @@ and SQLite for the database.
164
164
  ### Target Environment
165
165
 
166
166
  The primary target for this application is Linux. It may be able to run on other
167
- platforms, BSD, Mac and Windows. But I don't have a way, or desire, to directly
168
- support them.
167
+ platforms, BSD and Windows. But I don't have a way, or desire, to directly support them.
168
+
169
+ I've recently purchased an M4 Mac Mini, So I'll probably put more effort into that platform as well.
170
+
169
171
 
170
172
  ### The Why
171
173
 
@@ -257,7 +259,13 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
257
259
 
258
260
  ## Recent Changes
259
261
 
260
- -[25-5-21] Fix crash from unsafe dict key access when processing F1-F12.
262
+ - [25-5-25] Added {PREVNR} macro to resend last logged serial number.
263
+ - Add Bandmap mode indicators for CW, FT*, SSB, Beacons.
264
+ - Made tuning with the VFO knob smoother.
265
+ - Add MacOS support for VFO knob.
266
+ - Forced style to Fusion on MacOS, 'cause it looked like ass.
267
+ - [25-5-22] Trap possible ValueError exception in settings.py
268
+ - [25-5-21] Fix crash from unsafe dict key access when processing F1-F12.
261
269
  - [25-5-6] Merged PR from @JG3LLB, Koji-Kawano, Adding code to stop sending morse if using rigctld to send, and @alduhoo adding more control to CW serial number padding.
262
270
 
263
271
  See [CHANGELOG.md](CHANGELOG.md) for prior changes.
@@ -1,16 +1,16 @@
1
1
  not1mm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- not1mm/__main__.py,sha256=7VUesI-jAYNa2W0IUWS1u3Y5nyQQfc2K9ZvIO-rKmgo,159536
3
- not1mm/bandmap.py,sha256=4Ieg3Z_PYdvo4KxGcAiPB5VohUXH6g8r9rCCXbHuKLc,30151
2
+ not1mm/__main__.py,sha256=FZZGObcnSJEzEFj7a2K_-DPJUivmDS2tV5boPVudSJs,169592
3
+ not1mm/bandmap.py,sha256=0JmZ32UvkaPjXs2xTgowX1GLvZo5zHU_Zo9y_GL-On4,31139
4
4
  not1mm/checkwindow.py,sha256=zEHlw40j6Wr3rvKbCQf2lcezCoiZqaBqEvBjQU5aKW0,7630
5
5
  not1mm/fsutils.py,sha256=ukHKxKTeNKxKwqRaJjtzRShL4X5Xl0jRBbADyy3Ifp8,1701
6
- not1mm/logwindow.py,sha256=e36t4ebyhLF6UR3y3HJWUwL1rzeqRFzdek7NAYINJNM,42565
6
+ not1mm/logwindow.py,sha256=zpCCcyRLK40D2rcxnIJBSVVqPEmTHKCrkAcfEj5sZ54,42624
7
7
  not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
8
8
  not1mm/radio.py,sha256=4Lysf9BY3vdtYCHwKfzO5WN7IGyh4_lKSVuQ6F4Z08g,5536
9
- not1mm/ratewindow.py,sha256=vMM56sOWbglQXf16Rhhgx2V4uaiGzTkfmcOmhgNd1GQ,7018
9
+ not1mm/ratewindow.py,sha256=iBjqdOetIEX0wSwdGM89Ibt4gVlFdE-K8HQPnkVPVOg,6965
10
10
  not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
11
- not1mm/statistics.py,sha256=YbXBCr8wtmXlF21ojgsh0jY_G-dnCApUFe87JZclZAI,7712
11
+ not1mm/statistics.py,sha256=_k65GU93N-TIb2-b0_Yta4NCT9pJd5t-SB_DvC-m_ZM,7712
12
12
  not1mm/test.py,sha256=BNhsSvLnNG5hN4pywIWnj4pUBI-wQYY4Ejfbl97knmw,1198
13
- not1mm/vfo.py,sha256=LbGjJKb6ipDEbEEcaeIR2DiEpReolamSzuY25rU3iOo,8997
13
+ not1mm/vfo.py,sha256=SsqinokSd8BqVp6l-_DGRKcNN9Uc9JiFYXDl9Ycep1o,10111
14
14
  not1mm/voice_keying.py,sha256=HZImqC5NgnyW2nknNYQ3b7I8-6S_hxpq5G4RcIRXn_k,3005
15
15
  not1mm/data/JetBrainsMono-Thin.ttf,sha256=B1bo6M8dZfp1GXdnZEebOXPvsVr09BnV1ydNwnrhtwI,270112
16
16
  not1mm/data/MASTER.SCP,sha256=LuF8dTtdRKaqSyzJ1nl7zW2-gs5ehQiXiI41t5Zo9Bo,362769
@@ -19,7 +19,9 @@ not1mm/data/alpha bravo charlie delta.txt,sha256=d5QMmSWEUAe4Rj1XbNjTPLa_5Be4Se6
19
19
  not1mm/data/bandmap.ui,sha256=V0RlAcaGTcP85VBI_Rkxu3kpDmP4EKZmwrqPTrUGv5w,8580
20
20
  not1mm/data/check.png,sha256=UvFOLr8V-79qnjW8wUaGItXk_OSP8m8hqPevs8NDlFY,387
21
21
  not1mm/data/checkwindow.ui,sha256=kRRfMXOsvyQwCk93Fm8CWTaL3DCWFTIfyqncciRY2MI,5064
22
- not1mm/data/configuration.ui,sha256=_Ya9xVphfBCh0wFV5dizrb61giUWkj0-6fmaiIPfwoc,77367
22
+ not1mm/data/cloud_green.png,sha256=MdXhls1n4XR7oM0Y84pqlsuay6byduAJF7NwgZ-g0DU,626
23
+ not1mm/data/cloud_red.png,sha256=vSIQ1X7_z484pv3xXjTRtdtfIontsUq11suTALSsaQA,482
24
+ not1mm/data/configuration.ui,sha256=Qze_mbSw3vS6Iwof5TyEz-3KycG1lconANEMXhPrFQQ,76372
23
25
  not1mm/data/contests.sql,sha256=4hmJCDvrbxnA_Y5S4T5o52TZieeFk6QUwFerwlFePNA,89307
24
26
  not1mm/data/cty.json,sha256=bwPhOrOAgvV9JiXUDT9kzCqfNWAhGuJQt489h0SKsCk,4925375
25
27
  not1mm/data/cwmacros.txt,sha256=NztufsX6R52gAO7VyJ2AHr7wOh41pJTwHKh5Lcs32ds,468
@@ -33,7 +35,7 @@ not1mm/data/k6gte.not1mm-32.png,sha256=XdTsCa3xqwTfn26Ga7RwO_Vlbg_77RKkSc8bMxVcC
33
35
  not1mm/data/k6gte.not1mm-64.png,sha256=6ku45Gq1g5ezh04F07osoKRtanb3e4kbx5XdIEh3N90,2925
34
36
  not1mm/data/logwindow.ui,sha256=vfkNdzJgFs3tTOBKLDavF2zVMvNHWOZ82fAErRi6pQY,1436
35
37
  not1mm/data/logwindowx.ui,sha256=9FzDJtLRpagvAWcDjFdB9NnvNZ4bVxdTNHy1Jit2ido,1610
36
- not1mm/data/main.ui,sha256=hqgvaffln0vxXiRKJGIEZ_kylqCaRz77BXKRREEz9Qw,64727
38
+ not1mm/data/main.ui,sha256=gEWmfXmqLM-DiujjnPdU-4buYJF9TQxS9gE0JlVv_4Y,65142
37
39
  not1mm/data/new_contest.ui,sha256=WKg2jy8jxHg2d3pZsBTcdSNObKcd0eVbO-OoW0u0uxA,25309
38
40
  not1mm/data/not1mm.html,sha256=c9-mfjMwDt4f5pySUruz2gREW33CQ2_rCddM2z5CZQo,23273
39
41
  not1mm/data/opon.ui,sha256=mC4OhoVIfR1H9IqHAKXliPMm8VOVmxSEadpsFQ7XnS4,2247
@@ -100,9 +102,9 @@ not1mm/data/phonetics/yourcall.wav,sha256=4kheHJmCiRDL2kjhlgXQ8_u_eEMgKxiNGu5UBk
100
102
  not1mm/data/phonetics/z.wav,sha256=arafCi7fwmBLdVDI-PRyaL4U-03PIQDhffwY5noJ_2c,51768
101
103
  not1mm/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
104
  not1mm/lib/about.py,sha256=sWycfGcruN3SaEe4JmaJ61K6D8Itq0WxpUYT-lEcmYM,416
103
- not1mm/lib/cat_interface.py,sha256=f23U6LA2xydIE-ftV_sO_QGhb5GfSWpfKX46MxH5kkM,27209
105
+ not1mm/lib/cat_interface.py,sha256=jADt45E5AcdEx8FHN4rSDbngeQqVzbtIy43luGWGDK0,27222
104
106
  not1mm/lib/cwinterface.py,sha256=rKUnqljHQC_Iljq4TCmAgSPe49lWbKcfxg58cE8YX5Y,5177
105
- not1mm/lib/database.py,sha256=fykyaQaTa_Pwde51f09Odbexy1mlUqObv0fjZ7hf3E0,51693
107
+ not1mm/lib/database.py,sha256=ycc_O3e8fOhWyiGfZjTFf2U94BGMaUw3nCvXFbligaw,53358
106
108
  not1mm/lib/edit_contact.py,sha256=Ki9bGPpqyQQBB1cU8VIBDCal3lbXeQ6qxhzklmhE2_w,353
107
109
  not1mm/lib/edit_macro.py,sha256=raKWBwsHInj5EUKmvyLQ6gqc3ZFDlstsD3xqoM4PC8E,517
108
110
  not1mm/lib/edit_opon.py,sha256=j3qJ1aBsQoIOnQ9yiBl3lyeISvKTP0I_rtBYBPAfgeI,359
@@ -116,9 +118,9 @@ not1mm/lib/n1mm.py,sha256=H54mpgJF0GAmKavM-nb5OAq2SJFWYkux4eMWWiSRxJc,6288
116
118
  not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
117
119
  not1mm/lib/plugin_common.py,sha256=D1OBjyLmX7zuSPqgTCmHwXzAKA12J_zTQItvyIem-4Y,13299
118
120
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
119
- not1mm/lib/settings.py,sha256=wDatDIqgYmMIwMfH2j_1kG_kwsQdaE1JD9DbA2bgJkI,15746
121
+ not1mm/lib/settings.py,sha256=5xnsagH48qGeCDhfxPWW9yaXtv8wT13yoIVvYt8h_Qs,16023
120
122
  not1mm/lib/super_check_partial.py,sha256=hwT2NRwobu0PLDyw6ltmbmcAtGBD02CKGFbgGWjXMqA,2334
121
- not1mm/lib/version.py,sha256=cEusnAI712uvpjIfg9JKZRBwu6YuQVQIdPRpxUNrdpc,48
123
+ not1mm/lib/version.py,sha256=gcUyTawJD4PIn_mBa947znnmgM9-mvfHXIEnCSo7gnM,49
122
124
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
123
125
  not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
124
126
  not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
@@ -180,9 +182,9 @@ not1mm/plugins/ukeidx.py,sha256=0ABGW7_9Ui0Rgr8mkPBxOJokAIerM1a4-HWnl6VsnV8,1910
180
182
  not1mm/plugins/vhf_sprint.py,sha256=a9QFTpv8XUbZ_GLjdVCh7svykFa-gXOWwKFZ6MD3uQM,19289
181
183
  not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
182
184
  not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
183
- not1mm-25.5.21.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
184
- not1mm-25.5.21.dist-info/METADATA,sha256=dt8cK7ZVrXa5uJRRUmpouwqjr1Tgtmpddu54xWVKjxQ,40820
185
- not1mm-25.5.21.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
186
- not1mm-25.5.21.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
187
- not1mm-25.5.21.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
188
- not1mm-25.5.21.dist-info/RECORD,,
185
+ not1mm-25.5.25.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
186
+ not1mm-25.5.25.dist-info/METADATA,sha256=LMao9elh21fHypET3g4kblWcGFyjDg5z0A1LSOMY2J0,41254
187
+ not1mm-25.5.25.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
188
+ not1mm-25.5.25.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
189
+ not1mm-25.5.25.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
190
+ not1mm-25.5.25.dist-info/RECORD,,