Files
orisys-app/apps
ykcheungab a35d1877d6 拆分 A2:会话状态与生命周期移入 SessionController(app_window 2900→2837 行)
- What: 新增 apps/studio/src/orisys_studio/session_controller.py(423 行 / 41 成员):
  它拥有两个 worker 及当前 worker、相位、会话计数、每会话遥测(fps / process_ms /
  capture_fps / capture_dropped / 读数失败计数 / 丢帧上报语义)和运行定时器(16 ms),
  并给出 reset_for_run / mark_running / mark_stopped / note_first_frame / note_connect_slow /
  note_sample_telemetry / check_capture_negotiation / take_dropped_message /
  take_session_error / consume_end_reason / detach_sinks。app_window 只剩「看到什么」:
  按钮、轨道、状态栏、面板,以及 16 ms 呈现槽 _on_run_tick。
  同时删除窗口里已成副本的 _check_capture_negotiation / _session_time / _current_frame_id /
  _report_invalid_sample / _report_dropped_samples / _on_worker_error / _on_worker_status,
  并让 _on_packet_recorded、_on_calibration_applied、_set_phase 只在窗口一层转发。
- What: 窗口保留过渡 shim(_running / _active_worker / _box_worker / _finger_worker /
  _run_timer / _session_phase / _session_counter / _connect_started_at 等属性与
  _ensure_workers / _worker_for / _session_time 等方法),因为这些名字是
  apps/studio/tests 与 tools/ui_check.py 驱动窗口的既有接口;它们随后续切片逐个删除。
  test_ui_smoke.py 里两处直接写窗口状态改为写 window.session.*(否则会绕开新所有者)。
- Why: app_window 是唯一 fan-in=1 的中心、也是四个独立变更驱动的交汇点。会话/采集/
  记录生命周期是其中第一个:设备与相位规则改一次,这个 2900 行文件就要跟着改一次。
  状态与机制搬进控制器后,「谁在跑、跑到哪一阶段、报了什么数」只有一个所有者,
  窗口只负责把这些事实画出来。
- Verification: pytest shared/tests apps/studio/tests(QT_QPA_PLATFORM=offscreen)
  603 passed / 0 failed / 15 skipped(与改动前基线一致);apps/studio/tools/ui_check.py
  587 项检查 0 失败;.repro/locale_check.py 325 个字面 key 0 缺失。
- Not in this change: 不改行为(纯搬运 + 一层转发)。有意的语义收敛只有一处:相位信号
  现在每次 set_phase 都发出(状态芯片据此重绘,幂等),窗口不再自留一份相位判据。
  B 回放控制器、C1 视图排列、C2 显示偏好、标定交互仍未拆分;docs 里的行数/方法数
  指标待全部切片落定后统一刷新。
  已知未接线(本次未动、也非本次引入):worker 的 on_reset_applied 从未接到
  recording.note_reset,所以真机上按「清零」只会看到「指令已发出」,确认事件不会
  进入记录;这是独立缺陷,另行处理。
  真机 GL 冒烟本轮无法复跑:本机当前创建不出 GL 上下文(eglError 3005),
  test_scene3d_gl_smoke 13 例跳过、probe 用例因机器无上下文而失败,与本次改动无关。
2026-09-15 09:23:52 +08:00
..