dronecot 2.3.9__tar.gz → 2.3.10__tar.gz
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.
- {dronecot-2.3.9 → dronecot-2.3.10}/CHANGELOG.md +5 -0
- {dronecot-2.3.9/dronecot.egg-info → dronecot-2.3.10}/PKG-INFO +1 -1
- {dronecot-2.3.9 → dronecot-2.3.10/dronecot.egg-info}/PKG-INFO +1 -1
- dronecot-2.3.10/src/dronecot/VERSION +1 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/functions.py +8 -1
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_functions.py +30 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_status.py +4 -1
- dronecot-2.3.9/src/dronecot/VERSION +0 -1
- {dronecot-2.3.9 → dronecot-2.3.10}/LICENSE +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/MANIFEST.in +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/README.md +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/dronecot.egg-info/SOURCES.txt +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/dronecot.egg-info/dependency_links.txt +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/dronecot.egg-info/entry_points.txt +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/dronecot.egg-info/requires.txt +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/dronecot.egg-info/top_level.txt +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/setup.cfg +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/setup.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/__init__.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/ble_capture.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/ble_parse.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/bluez_capture.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/classes.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/commands.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/constants.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/dji_exceptions.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/dji_functions.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/dji_text_parser.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/odid.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/open_drone_id.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/rid_normalize.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/rid_track.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/udp_rid.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/wifi_capture.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/src/dronecot/wifi_parse.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_adsb_vehicle.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_bluez_capture.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_dji_listener.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_mavlink_identity.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_rid_normalize.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_rid_track.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_sensor_detail.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_serial_crlf.py +0 -0
- {dronecot-2.3.9 → dronecot-2.3.10}/tests/test_wifi_parse.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.3.10
|
|
@@ -65,6 +65,12 @@ _DJI_Logger = logging.getLogger(__name__)
|
|
|
65
65
|
APP_NAME = "dronecot"
|
|
66
66
|
|
|
67
67
|
|
|
68
|
+
def sensor_beacon_enabled(config: Union[dict, SectionProxy]) -> bool:
|
|
69
|
+
"""Return whether the periodic receiver beacon is enabled."""
|
|
70
|
+
value = config.get("SENSOR_BEACON", "1")
|
|
71
|
+
return str(value).strip().lower() not in {"0", "false", "no", "off"}
|
|
72
|
+
|
|
73
|
+
|
|
68
74
|
def _pacific_timestamp() -> str:
|
|
69
75
|
"""Return a human-readable last-seen timestamp, falling back if tzdata is absent."""
|
|
70
76
|
try:
|
|
@@ -160,7 +166,8 @@ def create_tasks(config: SectionProxy, clitool: pytak.CLITool) -> Set[pytak.Work
|
|
|
160
166
|
if config.get("ENABLE_RX_MOCK", "0") == "1":
|
|
161
167
|
tasks.add(dronecot.RXMockWorker(clitool.rx_queue, config))
|
|
162
168
|
|
|
163
|
-
|
|
169
|
+
if sensor_beacon_enabled(config):
|
|
170
|
+
tasks.add(dronecot.SensorWorker(clitool.tx_queue, config))
|
|
164
171
|
|
|
165
172
|
return tasks
|
|
166
173
|
|
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
"""DroneCOT Function Tests."""
|
|
18
18
|
|
|
19
|
+
import asyncio
|
|
19
20
|
import json
|
|
20
21
|
import os
|
|
21
22
|
import unittest
|
|
23
|
+
from types import SimpleNamespace
|
|
24
|
+
from unittest.mock import patch
|
|
22
25
|
|
|
23
26
|
import xml.etree.ElementTree as ET
|
|
24
27
|
|
|
@@ -45,6 +48,33 @@ def load_sample_data(file_path, line=0):
|
|
|
45
48
|
|
|
46
49
|
|
|
47
50
|
class FunctionsTestCase(unittest.TestCase):
|
|
51
|
+
def test_sensor_beacon_switch(self):
|
|
52
|
+
"""Receiver beacons default on and accept common false values."""
|
|
53
|
+
enabled = dronecot.functions.sensor_beacon_enabled
|
|
54
|
+
self.assertTrue(enabled({}))
|
|
55
|
+
for value in ("0", "false", "False", "no", "off"):
|
|
56
|
+
with self.subTest(value=value):
|
|
57
|
+
self.assertFalse(enabled({"SENSOR_BEACON": value}))
|
|
58
|
+
|
|
59
|
+
def test_create_tasks_can_omit_sensor_beacon(self):
|
|
60
|
+
"""Disabling the receiver beacon keeps drone processing enabled."""
|
|
61
|
+
clitool = SimpleNamespace(tx_queue=object())
|
|
62
|
+
config = {"FEED_URL": "serial:///dev/ttyACM0", "SENSOR_BEACON": "0"}
|
|
63
|
+
loop = asyncio.new_event_loop()
|
|
64
|
+
try:
|
|
65
|
+
asyncio.set_event_loop(loop)
|
|
66
|
+
with patch.object(dronecot, "SerialWorker", return_value="serial"):
|
|
67
|
+
with patch.object(dronecot, "RIDWorker", return_value="tracks"):
|
|
68
|
+
with patch.object(
|
|
69
|
+
dronecot, "SensorWorker", return_value="receiver"
|
|
70
|
+
) as sensor_worker:
|
|
71
|
+
tasks = dronecot.functions.create_tasks(config, clitool)
|
|
72
|
+
finally:
|
|
73
|
+
asyncio.set_event_loop(None)
|
|
74
|
+
loop.close()
|
|
75
|
+
self.assertEqual(tasks, {"serial", "tracks"})
|
|
76
|
+
sensor_worker.assert_not_called()
|
|
77
|
+
|
|
48
78
|
"""
|
|
49
79
|
Test class for functions... functions.
|
|
50
80
|
"""
|
|
@@ -216,7 +216,10 @@ class TestDJIStatusSurface:
|
|
|
216
216
|
def _worker(self, tmp_path):
|
|
217
217
|
worker = classes.DJIWorker.__new__(classes.DJIWorker)
|
|
218
218
|
worker.config = {"FEED_URL": "tcp://172.31.100.2:52002"}
|
|
219
|
-
|
|
219
|
+
# handle_data does not consume net_queue. Keeping this synthetic worker
|
|
220
|
+
# loop-free also works on Python 3.9 after an earlier asyncio.run()
|
|
221
|
+
# closes and clears the process-wide default loop.
|
|
222
|
+
worker.net_queue = None
|
|
220
223
|
worker._logger = logging.getLogger("test")
|
|
221
224
|
worker.status = pytak.StatusWriter(
|
|
222
225
|
"dronecot-test", path=str(tmp_path / "status.json")
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.3.9
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|