From c1f86546776ed467b4d3365b5aebc4867eb0e33b Mon Sep 17 00:00:00 2001 From: Ayzen Date: Wed, 9 Sep 2026 22:15:50 +0300 Subject: [PATCH] review fixes: shared mock capture window, 2-position controller caveat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Мок-бэкенд ставил каждому трейсу свой capture_end_ns, потому что метка бралась в момент создания трейса. На реальном железе все комбинации коллекции выходят из одного синхронизированного цикла и делят одно окно — мок теперь ведёт себя так же, иначе он вводит в заблуждение при чтении записанных меток. В README контроллера добавлена оговорка: прошивка рассчитана ровно на два положения ключа. Хост допускает и 4, но тогда положение перестаёт быть чередованием одного бита и нужен контроллер на две управляющие линии. Co-Authored-By: Claude Opus 5 (1M context) --- device_firmware/switch_controller/README.md | 6 ++++++ python_app/hardware_full/multi_device_service.py | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/device_firmware/switch_controller/README.md b/device_firmware/switch_controller/README.md index cf0b550..5c62f1e 100644 --- a/device_firmware/switch_controller/README.md +++ b/device_firmware/switch_controller/README.md @@ -22,6 +22,12 @@ а не от того, какой порт сейчас излучает. Если у ключа больше двух состояний, лишние входы замыкаются джампером. +> Прошивка рассчитана **ровно на два положения** ключа +> (`stimulus_switch_positions: 2` на хосте). Хост технически допускает и 4 +> положения, но тогда положение перестаёт быть простым чередованием одного бита +> и потребуется контроллер на две управляющие линии — эта прошивка для такого +> режима не годится. + Если положению A соответствует лог. 1, а не 0 — поменяйте `kSwitchActiveLow` в [`src/main.cpp`](src/main.cpp). diff --git a/python_app/hardware_full/multi_device_service.py b/python_app/hardware_full/multi_device_service.py index aa1a729..7eae299 100644 --- a/python_app/hardware_full/multi_device_service.py +++ b/python_app/hardware_full/multi_device_service.py @@ -446,9 +446,15 @@ class MultiDeviceLibreVnaService: s11=s11, s21=s21, capture_start_ns=mock_sweep_start_ns, - capture_end_ns=time.monotonic_ns(), ) ) + # One shared window, as on real hardware: every combo of a collection comes + # out of the same synchronized cycle. Stamping each trace as it is built + # would instead spread the ends over the generation loop, which never + # happens natively and would mislead anyone reading mock captures. + mock_sweep_end_ns = time.monotonic_ns() + for trace in traces: + trace.capture_end_ns = mock_sweep_end_ns self._mock_phase += 0.05 return SweepCollection( collection_id=int(collection_id),