示例(M6 入口)
本页为使用指南(无规格 ID);场景规格见 examples-scenarios(TC019)。示例索引见 示例。
实现边界:算法未实现。
Run成功不等于工具已算完——passthrough是注册表契约夹具,基类Tool::Run只报NotImplemented,而空工具组的Run仍可返回Succeeded。
1. 示例清单
VYNTEK_BUILD_EXAMPLES=ON 时构建四个可执行(每个都是独立目标,产物同进 build/<preset>/bin/)。逐页说明见 示例。
| 文件 | 作用 |
|---|---|
examples/headless_run.cpp | 入口 main():公开头建组 → 跑一次 → 停两端。相机接线已拆出到下两行文件 |
examples/headless_camera.hpp | 宿主侧相机接线声明(DEBT-IMG-004 宿主接线示范):ArmCamera / WireToolWorkHook / StopCameraExplicitly |
examples/headless_camera.cpp | 上述三函数实现;错误码 6/7/8/9 与拆分前 headless_run.cpp 一致 |
examples/gray_mean_tool.cpp | 双工具串联:image_load(cv::imread 收图 → Copy 发 ImageGray8 句柄)→ Link → gray_mean(cv::mean 求均值);客户直链 opencv_world 的写法示范,需 VYNTEK_WITH_OPENCV=ON |
examples/quota_ledger_demo.cpp | TC010 跨层配额总账:打印各层读数,4 轮启停验证字节平台与回基线 |
examples/serialize_roundtrip.cpp | .avtg Save → Load 往返,校验工具数与顺序 |
examples/CMakeLists.txt | 四个 add_executable,统一 vyntek_example() 设置(输出目录 / C++17 / 警告);gray_mean_demo 额外链接 opencv_world(OFF 时跳过),其余链接 Vyntek::toolgroup 或 Vyntek::imaging |
公开头用到的面:vyntek.h(版本)、toolgroup/registry.hpp(ToolRegistry::RegisterBuiltinTools / Create)、toolgroup/toolgroup.hpp(ToolGroup::Create / AddTool)、toolgroup/run_session.hpp(Run / GetOutput / RequestCancel / SetToolWorkDoneHook)、imaging/acquisition_session.hpp(Arm / Start / RequestStop / WaitStop)。
2. 构建
cmake --preset ninja-debug-all
cmake --build --preset ninja-debug-all --target headless_runninja-debug-all = tests + examples 联编(VYNTEK_BUILD_TESTS=ON + VYNTEK_BUILD_EXAMPLES=ON)。旧命令 cmake --preset ninja-debug -DVYNTEK_BUILD_EXAMPLES=ON 仍可用(VYNTEK_BUILD_EXAMPLES 默认 OFF,见根 CMakeLists.txt)。
3. 运行
产物:build/ninja-debug-all/bin/headless_run.exe(Windows)或 build/ninja-debug-all/bin/headless_run(Linux / macOS)。
vyntek 0.1.0 (commit <sha>)
headless_run ok逐步行为与退出码(以源码为准;0 = 成功):
| 码 | 触发点 |
|---|---|
| 0 | 全部步骤通过,打印 headless_run ok |
| 1 | ToolGroup::Create("headless") 返回空 |
| 2 | registry.Create("passthrough", "t1") 或 group->AddTool(...) 失败 |
| 3 | RunSession::Run() 结果不是 Succeeded |
| 4 | session.GetOutput("t1.out") 非空——stub 必须仍为空(GetOutput 不是 KeepLatest 保留) |
| 5 | RequestCancel() 后 cancel_requested() 未置位 |
| 6 | AcquisitionSession::Arm / Start 失败(headless::ArmCamera) |
| 7 | Run 结束后采集端已不是 Running——工具工作钩不得自动停相机(M3-07 / TC-SESS-05) |
| 8 | stop_progress().tool_work_done 为 false——Run 返回后工具工作必须已上报完成 |
| 9 | 显式 RequestStop + WaitStop(StopTimeout{1000}) 未到达 Stopped |
4. 示例实际钉住的语义
- 注册表 → 组 → 会话最小闭环:
RegisterBuiltinTools()后Create("passthrough", "t1"),AddTool接管所有权。 - 两端停止互不触碰:
RunSession不调AcquisitionSession::RequestStop,采集端也不RequestCancel编排;钩子只把SetToolWorkDone(bool)送到采集端,显式停流是宿主的事(退出码 7/8/9 就是这条契约的断言)。 GetOutput≠ 观察保留:GetOutput("t1.out")返回空串;真正的 KeepLatest 保留语义在toolgroup/output_inspector.hpp(output-inspection)。
5. 不覆盖(勿当成已验收)
serialize_roundtrip只覆盖 Save→Load 往返与工具顺序;schema 门禁、未知 type_id、字段保真仍走 test-contracts TC-SER-* 与tests/contracts_serialize.cpp。- 不接真实相机 SDK:
AcquisitionSession是骨架,无供应商适配器与归还泵压力(TC-ACQ 未关)。 - 无渲染、无 ImageDisplay、无 C#:显示只在 C# Controls 轨(image-display)。
- 无多工具链 / 嵌套 / 取消矩阵:那些走
tests/orchestration_contracts.cpp(编排契约)。 - 有头 ≠ 验收完成:示例通过不代表任何
TC-*勾选。
6. 场景与验证
场景目录:examples-scenarios(S01–S13,未验收;文末「实现现状」表把每个场景映射到本仓对应代码)。路线:validation-and-roadmap。测试去留:test-value-and-lifecycle。契约全文:test-contracts。