daqsync 0.2.0__tar.gz → 0.2.1__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.
- {daqsync-0.2.0 → daqsync-0.2.1}/CHANGELOG.md +12 -1
- {daqsync-0.2.0/src/daqsync.egg-info → daqsync-0.2.1}/PKG-INFO +19 -2
- {daqsync-0.2.0 → daqsync-0.2.1}/README.md +18 -1
- {daqsync-0.2.0 → daqsync-0.2.1}/pyproject.toml +1 -1
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/__init__.py +1 -1
- {daqsync-0.2.0 → daqsync-0.2.1/src/daqsync.egg-info}/PKG-INFO +19 -2
- {daqsync-0.2.0 → daqsync-0.2.1}/tests/test_align.py +7 -4
- {daqsync-0.2.0 → daqsync-0.2.1}/tests/test_session.py +7 -4
- {daqsync-0.2.0 → daqsync-0.2.1}/LICENSE +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/MANIFEST.in +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/firmware/stm32_tick_line.c +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/setup.cfg +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/align.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/cli.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/clocks.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/firmware/stm32_tick_line.c +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/py.typed +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/session.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/streams/__init__.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/streams/base.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/streams/camera.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/streams/detector.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/streams/serial.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync/table.py +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync.egg-info/SOURCES.txt +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync.egg-info/dependency_links.txt +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync.egg-info/entry_points.txt +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync.egg-info/requires.txt +0 -0
- {daqsync-0.2.0 → daqsync-0.2.1}/src/daqsync.egg-info/top_level.txt +0 -0
|
@@ -7,6 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
## [未发布]
|
|
9
9
|
|
|
10
|
+
## [0.2.1] - 2026-10-14
|
|
11
|
+
|
|
12
|
+
### 变更
|
|
13
|
+
|
|
14
|
+
- README 增加「更新记录」小节与 CI 状态徽章。PyPI 页面只渲染 README,此前的变更记录在项目页面上不可见。
|
|
15
|
+
|
|
16
|
+
### 修复
|
|
17
|
+
|
|
18
|
+
- 修正 README 中的 changelog 链接:原先使用相对路径,在 PyPI 页面上指向不存在的地址。
|
|
19
|
+
|
|
10
20
|
## [0.2.0] - 2026-10-14
|
|
11
21
|
|
|
12
22
|
### 新增
|
|
@@ -40,6 +50,7 @@
|
|
|
40
50
|
- STM32 行协议(`T=<HAL_GetTick>,ADC=<值>`)解析,并附带最小固件片段。
|
|
41
51
|
- 扁平 CSV 导出与 `daqsync` 命令行入口。
|
|
42
52
|
|
|
43
|
-
[未发布]: https://github.com/jamesgreenwangjw/daqsync/compare/v0.2.
|
|
53
|
+
[未发布]: https://github.com/jamesgreenwangjw/daqsync/compare/v0.2.1...HEAD
|
|
54
|
+
[0.2.1]: https://github.com/jamesgreenwangjw/daqsync/compare/v0.2.0...v0.2.1
|
|
44
55
|
[0.2.0]: https://github.com/jamesgreenwangjw/daqsync/compare/v0.1.0...v0.2.0
|
|
45
56
|
[0.1.0]: https://pypi.org/project/daqsync/0.1.0/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: daqsync
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Align webcam, MCU serial, and detector boxes onto one lab timeline.
|
|
5
5
|
Author: 王俊为
|
|
6
6
|
License-Expression: MIT
|
|
@@ -39,6 +39,8 @@ Dynamic: license-file
|
|
|
39
39
|
|
|
40
40
|
# daqsync
|
|
41
41
|
|
|
42
|
+
[](https://github.com/jamesgreenwangjw/daqsync/actions/workflows/test.yml)
|
|
43
|
+
|
|
42
44
|
摄像头、单片机串口、检测框,对齐到**同一条实验时间轴**。
|
|
43
45
|
|
|
44
46
|
不是又一个 YOLO 后处理。不是又一个串口助手。
|
|
@@ -102,6 +104,21 @@ table = s.run(seconds=5)
|
|
|
102
104
|
|
|
103
105
|
YOLO 真推理:`Detector("yolov8n.pt")`,需要自己装 ultralytics。
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
## 更新记录
|
|
108
|
+
|
|
109
|
+
**0.2.1**(2026-10-14)
|
|
110
|
+
- README 增加更新记录小节与 CI 状态徽章
|
|
111
|
+
- 修正 changelog 链接:原先用相对路径,在 PyPI 页面上指向不存在的地址
|
|
112
|
+
|
|
113
|
+
**0.2.0**(2026-10-14)
|
|
114
|
+
- 修复推理慢于采集时 `infer_lag_s` 无界增长:待检队列改为有界,满时丢弃最旧帧
|
|
115
|
+
- 修复真实相机下串口时间戳被帧周期量化:串口采集拆为独立线程
|
|
116
|
+
- 新增 `py.typed` 类型标记与 `n_dropped_frames` 统计
|
|
117
|
+
- CI 扩展至 Linux / macOS / Windows 与 Python 3.9 / 3.13,并加入 mypy 检查
|
|
118
|
+
|
|
119
|
+
**0.1.0**(2026-09-18)
|
|
120
|
+
- 首个版本:相机帧、串口采样与检测框对齐到同一时间轴,导出扁平 CSV
|
|
121
|
+
|
|
122
|
+
完整变更见 [CHANGELOG.md](https://github.com/jamesgreenwangjw/daqsync/blob/main/CHANGELOG.md)。
|
|
106
123
|
|
|
107
124
|
源码:[github.com/jamesgreenwangjw/daqsync](https://github.com/jamesgreenwangjw/daqsync)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# daqsync
|
|
2
2
|
|
|
3
|
+
[](https://github.com/jamesgreenwangjw/daqsync/actions/workflows/test.yml)
|
|
4
|
+
|
|
3
5
|
摄像头、单片机串口、检测框,对齐到**同一条实验时间轴**。
|
|
4
6
|
|
|
5
7
|
不是又一个 YOLO 后处理。不是又一个串口助手。
|
|
@@ -63,6 +65,21 @@ table = s.run(seconds=5)
|
|
|
63
65
|
|
|
64
66
|
YOLO 真推理:`Detector("yolov8n.pt")`,需要自己装 ultralytics。
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
## 更新记录
|
|
69
|
+
|
|
70
|
+
**0.2.1**(2026-10-14)
|
|
71
|
+
- README 增加更新记录小节与 CI 状态徽章
|
|
72
|
+
- 修正 changelog 链接:原先用相对路径,在 PyPI 页面上指向不存在的地址
|
|
73
|
+
|
|
74
|
+
**0.2.0**(2026-10-14)
|
|
75
|
+
- 修复推理慢于采集时 `infer_lag_s` 无界增长:待检队列改为有界,满时丢弃最旧帧
|
|
76
|
+
- 修复真实相机下串口时间戳被帧周期量化:串口采集拆为独立线程
|
|
77
|
+
- 新增 `py.typed` 类型标记与 `n_dropped_frames` 统计
|
|
78
|
+
- CI 扩展至 Linux / macOS / Windows 与 Python 3.9 / 3.13,并加入 mypy 检查
|
|
79
|
+
|
|
80
|
+
**0.1.0**(2026-09-18)
|
|
81
|
+
- 首个版本:相机帧、串口采样与检测框对齐到同一时间轴,导出扁平 CSV
|
|
82
|
+
|
|
83
|
+
完整变更见 [CHANGELOG.md](https://github.com/jamesgreenwangjw/daqsync/blob/main/CHANGELOG.md)。
|
|
67
84
|
|
|
68
85
|
源码:[github.com/jamesgreenwangjw/daqsync](https://github.com/jamesgreenwangjw/daqsync)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: daqsync
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Align webcam, MCU serial, and detector boxes onto one lab timeline.
|
|
5
5
|
Author: 王俊为
|
|
6
6
|
License-Expression: MIT
|
|
@@ -39,6 +39,8 @@ Dynamic: license-file
|
|
|
39
39
|
|
|
40
40
|
# daqsync
|
|
41
41
|
|
|
42
|
+
[](https://github.com/jamesgreenwangjw/daqsync/actions/workflows/test.yml)
|
|
43
|
+
|
|
42
44
|
摄像头、单片机串口、检测框,对齐到**同一条实验时间轴**。
|
|
43
45
|
|
|
44
46
|
不是又一个 YOLO 后处理。不是又一个串口助手。
|
|
@@ -102,6 +104,21 @@ table = s.run(seconds=5)
|
|
|
102
104
|
|
|
103
105
|
YOLO 真推理:`Detector("yolov8n.pt")`,需要自己装 ultralytics。
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
## 更新记录
|
|
108
|
+
|
|
109
|
+
**0.2.1**(2026-10-14)
|
|
110
|
+
- README 增加更新记录小节与 CI 状态徽章
|
|
111
|
+
- 修正 changelog 链接:原先用相对路径,在 PyPI 页面上指向不存在的地址
|
|
112
|
+
|
|
113
|
+
**0.2.0**(2026-10-14)
|
|
114
|
+
- 修复推理慢于采集时 `infer_lag_s` 无界增长:待检队列改为有界,满时丢弃最旧帧
|
|
115
|
+
- 修复真实相机下串口时间戳被帧周期量化:串口采集拆为独立线程
|
|
116
|
+
- 新增 `py.typed` 类型标记与 `n_dropped_frames` 统计
|
|
117
|
+
- CI 扩展至 Linux / macOS / Windows 与 Python 3.9 / 3.13,并加入 mypy 检查
|
|
118
|
+
|
|
119
|
+
**0.1.0**(2026-09-18)
|
|
120
|
+
- 首个版本:相机帧、串口采样与检测框对齐到同一时间轴,导出扁平 CSV
|
|
121
|
+
|
|
122
|
+
完整变更见 [CHANGELOG.md](https://github.com/jamesgreenwangjw/daqsync/blob/main/CHANGELOG.md)。
|
|
106
123
|
|
|
107
124
|
源码:[github.com/jamesgreenwangjw/daqsync](https://github.com/jamesgreenwangjw/daqsync)
|
|
@@ -42,11 +42,12 @@ class TestAlignFrameIdNotInferTime(unittest.TestCase):
|
|
|
42
42
|
self.assertGreater(len(table.rows), 5)
|
|
43
43
|
lags = [r["infer_lag_s"] for r in table.rows if r["infer_lag_s"] is not None]
|
|
44
44
|
self.assertTrue(lags)
|
|
45
|
-
#
|
|
46
|
-
#
|
|
45
|
+
# 推理设定 30ms,但 MockDetector 的 sleep 在高负载 runner 上会因
|
|
46
|
+
# 线程调度延迟放大数倍(实测 macOS runner 中位数已达 0.11s),
|
|
47
|
+
# 故只断言推理确实产生了可观测的滞后,不把绝对值作为判据。
|
|
47
48
|
median_lag = sorted(lags)[len(lags) // 2]
|
|
48
49
|
self.assertGreater(median_lag, 0.02)
|
|
49
|
-
self.assertLess(median_lag, 0.
|
|
50
|
+
self.assertLess(median_lag, 0.5)
|
|
50
51
|
for r in table.rows:
|
|
51
52
|
if r["boxes"]:
|
|
52
53
|
for b in r["boxes"]:
|
|
@@ -74,7 +75,9 @@ class TestAlignFrameIdNotInferTime(unittest.TestCase):
|
|
|
74
75
|
# 而不是让 infer_lag_s 持续上升。
|
|
75
76
|
lags = [r["infer_lag_s"] for r in table.rows if r["infer_lag_s"] is not None]
|
|
76
77
|
self.assertTrue(lags)
|
|
77
|
-
|
|
78
|
+
# 绝对滞后含推理耗时与调度延迟,随 runner 负载浮动;此处只要求不出现
|
|
79
|
+
# 病态量级。「不随运行时长增长」由 test_session 的无界队列回归用例覆盖。
|
|
80
|
+
self.assertLess(max(lags), 0.5)
|
|
78
81
|
self.assertGreater(table.meta["n_dropped_frames"], 0)
|
|
79
82
|
for r in table.rows:
|
|
80
83
|
if r["boxes"]:
|
|
@@ -108,7 +108,7 @@ class TestEnqueueLatest(unittest.TestCase):
|
|
|
108
108
|
class TestInferLagBounded(unittest.TestCase):
|
|
109
109
|
def test_lag_bounded_when_detector_slower_than_camera(self):
|
|
110
110
|
# 采集 30fps,推理 40ms(产能 25fps):修复前队列无界积压,
|
|
111
|
-
# infer_lag_s
|
|
111
|
+
# infer_lag_s 随运行时长线性上升;修复后它是一个不随时间增长的常数。
|
|
112
112
|
s = Session(
|
|
113
113
|
MockCamera(fps=30),
|
|
114
114
|
MockSerial(interval_s=0.01),
|
|
@@ -117,14 +117,17 @@ class TestInferLagBounded(unittest.TestCase):
|
|
|
117
117
|
table = s.run(seconds=2.0)
|
|
118
118
|
lags = [r["infer_lag_s"] for r in table.rows if r["infer_lag_s"] is not None]
|
|
119
119
|
self.assertTrue(lags)
|
|
120
|
-
self.assertLess(max(lags), 0.15)
|
|
121
120
|
|
|
122
|
-
#
|
|
121
|
+
# 该常数的绝对值 = 推理耗时 + 调度延迟,后者在高负载 runner 上会
|
|
122
|
+
# 被放大数倍,故只要求不出现病态量级:修复前 2 秒内该值升至 0.9 左右。
|
|
123
|
+
self.assertLess(max(lags), 0.5)
|
|
124
|
+
|
|
125
|
+
# 核心判据:不随运行时长增长。修复前后半段均值远高于前半段。
|
|
123
126
|
half = len(lags) // 2
|
|
124
127
|
self.assertGreater(half, 2)
|
|
125
128
|
first = statistics.mean(lags[:half])
|
|
126
129
|
second = statistics.mean(lags[half:])
|
|
127
|
-
self.assertLess(
|
|
130
|
+
self.assertLess(second, first * 1.5 + 0.05)
|
|
128
131
|
|
|
129
132
|
def test_capture_rate_not_dragged_down(self):
|
|
130
133
|
s = Session(
|
|
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
|