not1mm 25.6.12__py3-none-any.whl → 25.6.13.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/data/rotator.ui CHANGED
@@ -29,16 +29,65 @@
29
29
  </property>
30
30
  <item>
31
31
  <layout class="QHBoxLayout" name="horizontalLayout">
32
+ <item>
33
+ <widget class="QPushButton" name="stop_button">
34
+ <property name="styleSheet">
35
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
36
+ </property>
37
+ <property name="text">
38
+ <string>Stop</string>
39
+ </property>
40
+ </widget>
41
+ </item>
42
+ <item>
43
+ <spacer name="horizontalSpacer_3">
44
+ <property name="orientation">
45
+ <enum>Qt::Orientation::Horizontal</enum>
46
+ </property>
47
+ <property name="sizeHint" stdset="0">
48
+ <size>
49
+ <width>40</width>
50
+ <height>20</height>
51
+ </size>
52
+ </property>
53
+ </spacer>
54
+ </item>
32
55
  <item>
33
56
  <widget class="QPushButton" name="move_button">
34
57
  <property name="focusPolicy">
35
58
  <enum>Qt::FocusPolicy::NoFocus</enum>
36
59
  </property>
60
+ <property name="styleSheet">
61
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
62
+ </property>
37
63
  <property name="text">
38
64
  <string>Move</string>
39
65
  </property>
40
66
  </widget>
41
67
  </item>
68
+ <item>
69
+ <spacer name="horizontalSpacer_4">
70
+ <property name="orientation">
71
+ <enum>Qt::Orientation::Horizontal</enum>
72
+ </property>
73
+ <property name="sizeHint" stdset="0">
74
+ <size>
75
+ <width>40</width>
76
+ <height>20</height>
77
+ </size>
78
+ </property>
79
+ </spacer>
80
+ </item>
81
+ <item>
82
+ <widget class="QPushButton" name="park_button">
83
+ <property name="styleSheet">
84
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
85
+ </property>
86
+ <property name="text">
87
+ <string>Park</string>
88
+ </property>
89
+ </widget>
90
+ </item>
42
91
  </layout>
43
92
  </item>
44
93
  <item>
@@ -74,9 +123,18 @@
74
123
  </item>
75
124
  <item>
76
125
  <widget class="QPushButton" name="north_button">
126
+ <property name="sizePolicy">
127
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
128
+ <horstretch>0</horstretch>
129
+ <verstretch>0</verstretch>
130
+ </sizepolicy>
131
+ </property>
77
132
  <property name="focusPolicy">
78
133
  <enum>Qt::FocusPolicy::NoFocus</enum>
79
134
  </property>
135
+ <property name="styleSheet">
136
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
137
+ </property>
80
138
  <property name="text">
81
139
  <string>N</string>
82
140
  </property>
@@ -86,6 +144,12 @@
86
144
  <height>16</height>
87
145
  </size>
88
146
  </property>
147
+ <property name="autoDefault">
148
+ <bool>false</bool>
149
+ </property>
150
+ <property name="default">
151
+ <bool>false</bool>
152
+ </property>
89
153
  <property name="flat">
90
154
  <bool>false</bool>
91
155
  </property>
@@ -96,6 +160,9 @@
96
160
  <property name="focusPolicy">
97
161
  <enum>Qt::FocusPolicy::NoFocus</enum>
98
162
  </property>
163
+ <property name="styleSheet">
164
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
165
+ </property>
99
166
  <property name="text">
100
167
  <string>S</string>
101
168
  </property>
@@ -106,6 +173,9 @@
106
173
  <property name="focusPolicy">
107
174
  <enum>Qt::FocusPolicy::NoFocus</enum>
108
175
  </property>
176
+ <property name="styleSheet">
177
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
178
+ </property>
109
179
  <property name="text">
110
180
  <string>W</string>
111
181
  </property>
@@ -116,6 +186,9 @@
116
186
  <property name="focusPolicy">
117
187
  <enum>Qt::FocusPolicy::NoFocus</enum>
118
188
  </property>
189
+ <property name="styleSheet">
190
+ <string notr="true">padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;</string>
191
+ </property>
119
192
  <property name="text">
120
193
  <string>E</string>
121
194
  </property>
@@ -13,13 +13,13 @@ class RotatorInterface:
13
13
  """
14
14
 
15
15
  def __init__(self, host="127.0.0.1", port=4533):
16
- self.host = host
17
- self.port = port
18
- self.socket = None
19
- self.connected = False
16
+ self.host: str = host
17
+ self.port: int = port
18
+ self.socket: socket.socket | None = None
19
+ self.connected: bool = False
20
20
  self.connect()
21
21
 
22
- def connect(self):
22
+ def connect(self) -> None:
23
23
  """Connect to the rotator control program."""
24
24
  try:
25
25
  self.socket = socket.create_connection((self.host, self.port), timeout=1)
@@ -32,9 +32,9 @@ class RotatorInterface:
32
32
  )
33
33
  self.socket = None
34
34
 
35
- def disconnect(self):
35
+ def disconnect(self) -> None:
36
36
  """Disconnect from the rotator control program."""
37
- if self.socket:
37
+ if isinstance(self.socket, socket.socket):
38
38
  try:
39
39
  self.socket.close()
40
40
  logger.info("Disconnected from rotator")
@@ -43,11 +43,11 @@ class RotatorInterface:
43
43
  self.socket = None
44
44
  self.connected = False
45
45
 
46
- def send_command(self, command):
46
+ def send_command(self, command) -> str | None:
47
47
  """Send a command to the rotator control program and return the response."""
48
- if not self.connected or not self.socket:
48
+ if self.connected is False or self.socket is None:
49
49
  self.connect()
50
- if not self.connected or not self.socket:
50
+ if self.connected is False or self.socket is None:
51
51
  logger.warning("Not connected to rotator. Command not sent.")
52
52
  return None
53
53
 
@@ -61,11 +61,11 @@ class RotatorInterface:
61
61
  self.disconnect()
62
62
  return None
63
63
 
64
- def get_position(self):
64
+ def get_position(self) -> tuple[float, float] | None:
65
65
  """Get the current azimuth and elevation from the rotator."""
66
66
  response = self.send_command("p")
67
67
  logger.debug(f"get_position response: {response}")
68
- if response:
68
+ if response is not None:
69
69
  if response == "RPRT -1":
70
70
  return None, None
71
71
  try:
not1mm/lib/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """It's the version"""
2
2
 
3
- __version__ = "25.6.12"
3
+ __version__ = "25.6.13.1"
not1mm/rotator.py CHANGED
@@ -1,4 +1,9 @@
1
- from PyQt6.QtWidgets import QDockWidget, QGraphicsScene
1
+ from PyQt6.QtWidgets import (
2
+ QDockWidget,
3
+ QGraphicsScene,
4
+ QGraphicsPathItem,
5
+ QGraphicsPixmapItem,
6
+ )
2
7
 
3
8
  from PyQt6.QtGui import (
4
9
  QImage,
@@ -9,6 +14,7 @@ from PyQt6.QtGui import (
9
14
  QPainterPath,
10
15
  QShowEvent,
11
16
  QResizeEvent,
17
+ QMouseEvent,
12
18
  )
13
19
 
14
20
  from PyQt6.QtCore import Qt, pyqtSignal, QTimer
@@ -24,32 +30,33 @@ logger = logging.getLogger(__name__)
24
30
 
25
31
 
26
32
  class RotatorWindow(QDockWidget):
27
- message = pyqtSignal(dict)
28
- pref = {}
29
- MAP_RESOLUTION = 600
30
- GLOBE_RADIUS = 100.0
31
- AZIMUTH_DEAD_BAND = 2
32
- requestedAzimuthNeedle = None
33
- antennaNeedle = None
33
+ message: pyqtSignal = pyqtSignal(dict)
34
+ pref: dict = {}
35
+ MAP_RESOLUTION: int = 600
36
+ GLOBE_RADIUS: float = 100.0
37
+ requestedAzimuthNeedle: QGraphicsPathItem | None = None
38
+ antennaNeedle: QGraphicsPathItem | None = None
34
39
 
35
40
  def __init__(self):
36
41
  super().__init__()
37
- self.active = False
38
- self.compassScene = None
39
- self.mygrid = "DM13at"
40
- self.requestedAzimuth = None
41
- self.antennaAzimuth = None
42
+ self.active: bool = False
43
+ self.compassScene: QGraphicsScene | None = None
44
+ self.mygrid: str = "DM13at"
45
+ self.requestedAzimuth: float | None = None
46
+ self.antennaAzimuth: float | None = None
42
47
  uic.loadUi(fsutils.APP_DATA_PATH / "rotator.ui", self)
43
48
  self.north_button.clicked.connect(self.set_north_azimuth)
44
49
  self.south_button.clicked.connect(self.set_south_azimuth)
45
50
  self.east_button.clicked.connect(self.set_east_azimuth)
46
51
  self.west_button.clicked.connect(self.set_west_azimuth)
47
52
  self.move_button.clicked.connect(self.the_eye_of_sauron)
53
+ self.stop_button.clicked.connect(lambda x: self.rotator.send_command("S"))
54
+ self.park_button.clicked.connect(lambda x: self.rotator.send_command("K"))
48
55
  self.redrawMap()
49
- self.rotator = RotatorInterface()
56
+ self.rotator: RotatorInterface = RotatorInterface()
50
57
  self.antennaAzimuth, _ = self.rotator.get_position()
51
58
  self.set_antenna_azimuth(self.antennaAzimuth)
52
- self.watch_timer = QTimer()
59
+ self.watch_timer: QTimer = QTimer()
53
60
  self.watch_timer.timeout.connect(self.check_rotator)
54
61
  self.watch_timer.start(1000)
55
62
 
@@ -115,13 +122,13 @@ class RotatorWindow(QDockWidget):
115
122
 
116
123
  def redrawMap(self) -> None:
117
124
  """"""
118
- self.compassScene = QGraphicsScene()
125
+ self.compassScene: QGraphicsScene = QGraphicsScene()
119
126
  self.compassView.setScene(self.compassScene)
120
127
  self.compassView.setStyleSheet("background-color: transparent;")
121
128
  file = fsutils.APP_DATA_PATH / "map3.png"
122
- source = QImage()
129
+ source: QImage = QImage()
123
130
  source.load(str(file))
124
- the_map = QImage(
131
+ the_map: QImage = QImage(
125
132
  self.MAP_RESOLUTION, self.MAP_RESOLUTION, QImage.Format.Format_ARGB32
126
133
  )
127
134
  the_map.fill(QColor(0, 0, 0, 0))
@@ -134,12 +141,17 @@ class RotatorWindow(QDockWidget):
134
141
  source, lat, lon, output_size=self.MAP_RESOLUTION
135
142
  )
136
143
 
137
- pixMapItem = self.compassScene.addPixmap(QPixmap.fromImage(the_map))
138
- pixMapItem.moveBy(-self.MAP_RESOLUTION / 2, -self.MAP_RESOLUTION / 2)
139
- pixMapItem.setTransformOriginPoint(
140
- self.MAP_RESOLUTION / 2, self.MAP_RESOLUTION / 2
144
+ pixMapItem: QGraphicsPixmapItem | None = self.compassScene.addPixmap(
145
+ QPixmap.fromImage(the_map)
141
146
  )
142
- pixMapItem.setScale(self.GLOBE_RADIUS * 2 / self.MAP_RESOLUTION)
147
+ if pixMapItem is None:
148
+ logging.error("Unable to add pixmap to scene")
149
+ else:
150
+ pixMapItem.moveBy(-self.MAP_RESOLUTION / 2, -self.MAP_RESOLUTION / 2)
151
+ pixMapItem.setTransformOriginPoint(
152
+ self.MAP_RESOLUTION / 2, self.MAP_RESOLUTION / 2
153
+ )
154
+ pixMapItem.setScale(self.GLOBE_RADIUS * 2 / self.MAP_RESOLUTION)
143
155
  self.compassScene.addEllipse(
144
156
  -100,
145
157
  -100,
@@ -156,36 +168,41 @@ class RotatorWindow(QDockWidget):
156
168
  QPen(Qt.PenStyle.NoPen),
157
169
  QBrush(QColor(0, 0, 0), Qt.BrushStyle.SolidPattern),
158
170
  )
159
- path = QPainterPath()
171
+ path: QPainterPath = QPainterPath()
160
172
  path.lineTo(-4, 0)
161
173
  path.lineTo(0, -90)
162
174
  path.lineTo(4, 0)
163
175
  path.closeSubpath()
164
176
 
165
- path2 = QPainterPath()
166
- path2.lineTo(-1, 0)
167
- path2.lineTo(0, -90)
168
- path2.lineTo(1, 0)
169
- path2.closeSubpath()
170
-
171
- self.requestedAzimuthNeedle = self.compassScene.addPath(
172
- path,
173
- QPen(QColor(0, 0, 0, 150)),
174
- QBrush(QColor(0, 0, 255), Qt.BrushStyle.SolidPattern),
177
+ # path2: QPainterPath = QPainterPath()
178
+ # path2.lineTo(-1, 0)
179
+ # path2.lineTo(0, -90)
180
+ # path2.lineTo(1, 0)
181
+ # path2.closeSubpath()
182
+
183
+ self.requestedAzimuthNeedle: QGraphicsPathItem | None = (
184
+ self.compassScene.addPath(
185
+ path,
186
+ QPen(QColor(0, 0, 0, 150)),
187
+ QBrush(QColor(0, 0, 255), Qt.BrushStyle.SolidPattern),
188
+ )
175
189
  )
176
190
 
177
- if isinstance(self.requestedAzimuth, float):
191
+ if (
192
+ isinstance(self.requestedAzimuth, float)
193
+ and self.requestedAzimuthNeedle is not None
194
+ ):
178
195
  self.requestedAzimuthNeedle.setRotation(self.requestedAzimuth)
179
196
  self.requestedAzimuthNeedle.show()
180
197
  else:
181
198
  self.requestedAzimuthNeedle.hide()
182
199
 
183
- self.antennaNeedle = self.compassScene.addPath(
200
+ self.antennaNeedle: QGraphicsPathItem | None = self.compassScene.addPath(
184
201
  path,
185
202
  QPen(QColor(0, 0, 0, 150)),
186
203
  QBrush(QColor(255, 191, 0), Qt.BrushStyle.SolidPattern),
187
204
  )
188
- if isinstance(self.antennaAzimuth, float):
205
+ if isinstance(self.antennaAzimuth, float) and self.antennaNeedle is not None:
189
206
  self.antennaNeedle.setRotation(self.antennaAzimuth)
190
207
  self.antennaNeedle.show()
191
208
  else:
@@ -196,11 +213,11 @@ class RotatorWindow(QDockWidget):
196
213
  Converts a maidenhead gridsquare to a latitude longitude pair.
197
214
  """
198
215
  try:
199
- maiden = str(maiden).strip().upper()
216
+ maiden: str = str(maiden).strip().upper()
200
217
 
201
- chars_in_grid_square = len(maiden)
218
+ chars_in_grid_square: int = len(maiden)
202
219
  if not 8 >= chars_in_grid_square >= 2 and chars_in_grid_square % 2 == 0:
203
- return 0, 0
220
+ return 0.0, 0.0
204
221
  lon = (ord(maiden[0]) - 65) * 20 - 180
205
222
  lat = (ord(maiden[1]) - 65) * 10 - 90
206
223
  if chars_in_grid_square >= 4:
@@ -224,7 +241,7 @@ class RotatorWindow(QDockWidget):
224
241
  lon += 10
225
242
  lat += 5
226
243
 
227
- return lat, lon
244
+ return float(lat), float(lon)
228
245
  except IndexError:
229
246
  return 0.0, 0.0
230
247
 
@@ -238,16 +255,16 @@ class RotatorWindow(QDockWidget):
238
255
  """This does some super magic"""
239
256
 
240
257
  width, height = source_img.width(), source_img.height()
241
- dest_img = QImage(output_size, output_size, QImage.Format.Format_ARGB32)
258
+ dest_img: QImage = QImage(output_size, output_size, QImage.Format.Format_ARGB32)
242
259
 
243
260
  # Convert center point to radians
244
- lat0 = math.radians(center_lat_deg)
245
- lon0 = math.radians(center_lon_deg)
261
+ lat0: float = math.radians(center_lat_deg)
262
+ lon0: float = math.radians(center_lon_deg)
246
263
 
247
- sin_lat = math.sin(lat0)
248
- cos_lat = math.cos(lat0)
264
+ sin_lat: float = math.sin(lat0)
265
+ cos_lat: float = math.cos(lat0)
249
266
 
250
- R = output_size / 2
267
+ R: float = output_size / 2
251
268
  for y in range(output_size):
252
269
  for x in range(output_size):
253
270
  # Convert pixel coordinate to normalized cartesian coordinate in range [-1, 1]
@@ -314,6 +331,23 @@ class RotatorWindow(QDockWidget):
314
331
  self.compassScene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio
315
332
  )
316
333
 
334
+ def mousePressEvent(self, event: QMouseEvent) -> None:
335
+ """Catch mouse clicks in the widget"""
336
+ if event.button() == Qt.MouseButton.LeftButton:
337
+ clickPos = self.compassView.mapToScene(
338
+ self.compassView.mapFromGlobal(event.globalPosition().toPoint())
339
+ )
340
+ dx: float = clickPos.x()
341
+ dy: float = -1 * clickPos.y()
342
+ if math.sqrt(math.pow(dx, 2) + math.pow(dy, 2)) <= self.GLOBE_RADIUS:
343
+
344
+ angle: float = math.degrees(math.atan2(dx, dy))
345
+
346
+ if angle < 0:
347
+ angle += 360
348
+
349
+ self.rotator.set_position(angle)
350
+
317
351
  def check_rotator(self) -> None:
318
352
  """Check the rotator"""
319
353
  if self.rotator.connected:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: not1mm
3
- Version: 25.6.12
3
+ Version: 25.6.13.1
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  License: GPL-3.0-or-later
@@ -246,6 +246,9 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
246
246
 
247
247
  ## Recent Changes
248
248
 
249
+ - [25-6-13] Polished up the Rotator window. Adding Stop and Park. Made the NSWE buttons smaller.
250
+ - Add mouse press event handling to RotatorWindow for position setting.
251
+ - [25-6-13] Polished up the Rotator window. Adding Stop and Park. Made the NSWE buttons smaller.
249
252
  - [25-6-12] Account for no gridsquare being returned from lookup service.
250
253
  - [25-6-11] Added a rotator control widget.
251
254
  - [25-6-10] Merged PR from @dj1yfk correcting WPX prefix calculation.
@@ -703,13 +706,35 @@ This window shows you a grid of DXCC entities you've aquired and on what bands.
703
706
 
704
707
  `Window`>`Rotator`
705
708
 
706
- The Rotator window is a work in progress. Currently it blindly connects to a rigctld
707
- instance on it's default port of 4533.
709
+ The Rotator window is a work in progress. The Rotator window relies on the functionality
710
+ of the rotctld daemon. It connects to rotctld over it's default port of 4533. If started
711
+ and there is no connection, you will see this:
708
712
 
709
- ![Rotator Window](https://github.com/mbridak/not1mm/raw/master/pic/rotator_window.png)
713
+ ![Rotator Window](https://github.com/mbridak/not1mm/raw/master/pic/rot1.png)
710
714
 
711
- I myself don't have a rotator to test with. I'm a QRP wires in the trees, if only I
712
- had a tree, kind of guy. So we're kind of hoping this works. If not, don't use it.
715
+ Once there is a connection to rotctld, the current azimuth of the antenna is obtained and
716
+ you will see a direction needle apear:
717
+
718
+ ![Rotator Window](https://github.com/mbridak/not1mm/raw/master/pic/rot2.png)
719
+
720
+ Once a call is entered and the bearing to contact is calculated you will see another needle
721
+ appear:
722
+
723
+ ![Rotator Window](https://github.com/mbridak/not1mm/raw/master/pic/rot3.png)
724
+
725
+ At this time you can click on the 'Move' button to point your antenna at the contact. A list
726
+ of other buttons follows below.
727
+
728
+ Move: Rotates the antenna at the target.
729
+
730
+ Stop: Stops the current movement.
731
+
732
+ Park: Parks the antenna.
733
+
734
+ N,S,W,E: Points the antenna to one of the 4 cardinal directions.
735
+
736
+ You can also move the rotator by clicking in the globe where you want the
737
+ antenna to point.
713
738
 
714
739
  ### The Remote VFO Window
715
740
 
@@ -8,7 +8,7 @@ not1mm/logwindow.py,sha256=O2dMaT_BYWsXA_dxsEHN92JwN-qVGy9nmH0MCMaG9gY,42830
8
8
  not1mm/lookupservice.py,sha256=GkY_qHZfrW6XHf8upIoaG4hCFqm0fg6Ganu9ConGrIc,2628
9
9
  not1mm/radio.py,sha256=4Lysf9BY3vdtYCHwKfzO5WN7IGyh4_lKSVuQ6F4Z08g,5536
10
10
  not1mm/ratewindow.py,sha256=iBjqdOetIEX0wSwdGM89Ibt4gVlFdE-K8HQPnkVPVOg,6965
11
- not1mm/rotator.py,sha256=9HjhrlbeYFhNOjvCPmmoWMfRtbQ6ReYHMDJm6EPKrJo,11200
11
+ not1mm/rotator.py,sha256=jrAqO3IkeuZcOgsYFKvEv6DY2ccV85wg0o5sdJa_EUo,12760
12
12
  not1mm/rtc_service.py,sha256=axAwnCBuTr-QL0YwXtWvg9tjwhcFsiiEZFgFjOofX6k,2816
13
13
  not1mm/statistics.py,sha256=eOmUvbbYdbbIYHmaEhtBGab1IxAf2RQYV1q9MItpqEM,7969
14
14
  not1mm/test.py,sha256=WhL0DLlJTD15aON8Dkf2q_tlP_X1juxKZJh0jEC99tU,154
@@ -49,7 +49,7 @@ not1mm/data/radio_grey.png,sha256=9eOtMHDpQvRYY29D7_vPeacWbwotRXZTMm8EiHE9TW0,12
49
49
  not1mm/data/radio_red.png,sha256=QvkMk7thd_hCEIyK5xGAG4xVVXivl39nwOfD8USDI20,957
50
50
  not1mm/data/ratewindow.ui,sha256=c0gikcZQYWuGwWdFE1PGcRbeJ9nTUPIRkOozWo2FQw8,11541
51
51
  not1mm/data/reddot.png,sha256=M33jEMoU8W4rQ4_MVyzzKxDPDte1ypKBch5VnUMNLKE,565
52
- not1mm/data/rotator.ui,sha256=GcyEsb1TOQwp4g02jfCxsQRr8WkC7L4Bm5TTyvkk7hE,3935
52
+ not1mm/data/rotator.ui,sha256=BuWDzo3R68bDT4cbhQxqjVWzu_QRueuFf4ov3AbGcqc,6606
53
53
  not1mm/data/rttymacros.txt,sha256=FQ2BnAChXF5w-tzmMnBOE8IgvviAEsd3cmmz4b8GOPk,467
54
54
  not1mm/data/settings.ui,sha256=0nAdg4hDv37x0RL5G0Cc1L8p-F95YtkOjIGqlCGu0Fs,40073
55
55
  not1mm/data/splash.png,sha256=85_BQotR1q24uCthrKm4SB_6ZOMwRjR-Jdp1XBHSTyg,5368
@@ -122,11 +122,11 @@ not1mm/lib/multicast.py,sha256=KJcruI-bOuHfHXPjl3SGQhL6I9sKrygy-sdFSvxffUM,3255
122
122
  not1mm/lib/n1mm.py,sha256=H54mpgJF0GAmKavM-nb5OAq2SJFWYkux4eMWWiSRxJc,6288
123
123
  not1mm/lib/new_contest.py,sha256=IznTDMq7yXHB6zBoGUEC_WDYPCPpsSZW4wwMJi16zK0,816
124
124
  not1mm/lib/plugin_common.py,sha256=nqiUq11T9Wz8RDrRen4Zvp-KXVWUYcIp5JPZwqmu2Oo,13913
125
- not1mm/lib/rot_interface.py,sha256=kGhpRsxPa6MYDaHd7gLJfzgsJKiJ-qHyx8tJ2tWwwlk,3589
125
+ not1mm/lib/rot_interface.py,sha256=bOyxpV9pQHORUY5qfNZE2QAV1V71QEG2jooiI2p9AwE,3744
126
126
  not1mm/lib/select_contest.py,sha256=WsptLuwkouIHeocJL3oZ6-eUfEnhpwdc-x7eMZ_TIVM,359
127
127
  not1mm/lib/settings.py,sha256=5xnsagH48qGeCDhfxPWW9yaXtv8wT13yoIVvYt8h_Qs,16023
128
128
  not1mm/lib/super_check_partial.py,sha256=jX7DjHesEV4KNVQbddJui0wAsYHerikH7W0iPv7PXQw,3110
129
- not1mm/lib/version.py,sha256=FOEOU2uNUEV5bJamF0b6Dxgv5dxKso-77okuXfp8vGs,48
129
+ not1mm/lib/version.py,sha256=4iMPCwhlJpDccy4P7xQiiY0DegdZm8jICpkoDKVNsGs,50
130
130
  not1mm/lib/versiontest.py,sha256=8vDNptuBBunn-1IGkjNaquehqBYUJyjrPSF8Igmd4_Y,1286
131
131
  not1mm/plugins/10_10_fall_cw.py,sha256=oJh3JKqjOpnWElSlZpiQ631UnaOd8qra5s9bl_QoInk,14783
132
132
  not1mm/plugins/10_10_spring_cw.py,sha256=p7dSDtbFK0e6Xouw2V6swYn3VFVgHKyx4IfRWyBjMZY,14786
@@ -190,9 +190,9 @@ not1mm/plugins/ukeidx.py,sha256=ZsIFXgOSwjuKNmN4W_C0TAgGqgnabJGNLMHwGkl3_bk,1910
190
190
  not1mm/plugins/vhf_sprint.py,sha256=a9QFTpv8XUbZ_GLjdVCh7svykFa-gXOWwKFZ6MD3uQM,19289
191
191
  not1mm/plugins/weekly_rtty.py,sha256=C8Xs3Q5UgSYx-mFFar8BVARWtmqlyrbeC98Ubzb4UN8,20128
192
192
  not1mm/plugins/winter_field_day.py,sha256=hmAMgkdqIXtnCNyUp8J9Bb8liN8wj10wps6ROuG-Bok,15284
193
- not1mm-25.6.12.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
194
- not1mm-25.6.12.dist-info/METADATA,sha256=2vdtH_bwu2Kjy8L58lqMQPNFOxiqZ1Iph6TIgjWzHi0,35752
195
- not1mm-25.6.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
196
- not1mm-25.6.12.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
197
- not1mm-25.6.12.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
198
- not1mm-25.6.12.dist-info/RECORD,,
193
+ not1mm-25.6.13.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
194
+ not1mm-25.6.13.1.dist-info/METADATA,sha256=aq7L2UE4N-ipeuRVJ8eouicmYklQYZyX9pJXMRKd7xE,36720
195
+ not1mm-25.6.13.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
196
+ not1mm-25.6.13.1.dist-info/entry_points.txt,sha256=pMcZk_0dxFgLkcUkF0Q874ojpwOmF3OL6EKw9LgvocM,47
197
+ not1mm-25.6.13.1.dist-info/top_level.txt,sha256=0YmTxEcDzQlzXub-lXASvoLpg_mt1c2thb5cVkDf5J4,7
198
+ not1mm-25.6.13.1.dist-info/RECORD,,