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 +73 -0
- not1mm/lib/rot_interface.py +12 -12
- not1mm/lib/version.py +1 -1
- not1mm/rotator.py +81 -47
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/METADATA +31 -6
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/RECORD +10 -10
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/WHEEL +0 -0
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/entry_points.txt +0 -0
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/licenses/LICENSE +0 -0
- {not1mm-25.6.12.dist-info → not1mm-25.6.13.1.dist-info}/top_level.txt +0 -0
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>
|
not1mm/lib/rot_interface.py
CHANGED
@@ -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
|
48
|
+
if self.connected is False or self.socket is None:
|
49
49
|
self.connect()
|
50
|
-
if
|
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
not1mm/rotator.py
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
from PyQt6.QtWidgets import
|
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
|
-
|
32
|
-
|
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(
|
138
|
-
|
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
|
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 =
|
172
|
-
|
173
|
-
|
174
|
-
|
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
|
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.
|
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.
|
707
|
-
|
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
|
-

|
710
714
|
|
711
|
-
|
712
|
-
|
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
|
+

|
719
|
+
|
720
|
+
Once a call is entered and the bearing to contact is calculated you will see another needle
|
721
|
+
appear:
|
722
|
+
|
723
|
+

|
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=
|
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=
|
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=
|
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=
|
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.
|
194
|
-
not1mm-25.6.
|
195
|
-
not1mm-25.6.
|
196
|
-
not1mm-25.6.
|
197
|
-
not1mm-25.6.
|
198
|
-
not1mm-25.6.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|