From 00dc0e21b7635314388026d79e6ce16e1daddb9b Mon Sep 17 00:00:00 2001 From: awe Date: Mon, 20 Apr 2026 18:01:14 +0300 Subject: [PATCH] fix lfm --- lchm_clock_counter.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lchm_clock_counter.cpp b/lchm_clock_counter.cpp index b957673..a8dc6eb 100644 --- a/lchm_clock_counter.cpp +++ b/lchm_clock_counter.cpp @@ -518,6 +518,10 @@ TickMs tick_count_ms() { #endif } +TickMs elapsed_ms(TickMs now, TickMs start) { + return (now >= start) ? (now - start) : 0U; +} + #ifdef _WIN32 volatile LONG g_console_stop_requested = 0; @@ -766,7 +770,7 @@ int run(const Config& cfg) { current_step.clear(); }; - auto finalize_lchm = [&](const char* close_reason) { + auto finalize_lchm = [&](const char* close_reason, TickMs now) { finalize_current_step(); if (current.clocks != (current.di2_high_clocks + current.di2_low_clocks)) { @@ -814,7 +818,7 @@ int run(const Config& cfg) { << ", di2_low_clocks=" << step.count.di2_low_clocks << "\n"; } - last_lchm_complete = tick_count_ms(); + last_lchm_complete = now; } current.clear(); current_step.clear(); @@ -841,8 +845,8 @@ int run(const Config& cfg) { } message << "Check DI_SYN2 wiring, common DGND, and signal level around 0/3.3 V. " - << "Progress: last DIN activity " << (now - last_din_activity) - << " ms ago, last DI_SYN2 edge " << (now - last_gate_edge) << " ms ago."; + << "Progress: last DIN activity " << elapsed_ms(now, last_din_activity) + << " ms ago, last DI_SYN2 edge " << elapsed_ms(now, last_gate_edge) << " ms ago."; fail(message.str()); }; @@ -863,11 +867,11 @@ int run(const Config& cfg) { const TickMs now = tick_count_ms(); if (recvd == 0) { - if ((now - last_stream_activity) >= cfg.clock_wait_ms) { + if (elapsed_ms(now, last_stream_activity) >= cfg.clock_wait_ms) { fail("Timeout waiting for DIN stream data in internal clock mode. " "Check device state and DIN stream configuration."); } - if ((now - last_lchm_complete) >= cfg.lchm_wait_ms) { + if (elapsed_ms(now, last_lchm_complete) >= cfg.lchm_wait_ms) { fail_waiting_for_lchm(now); } continue; @@ -924,7 +928,7 @@ int run(const Config& cfg) { } if (in_lchm && last_gate && !gate) { - finalize_lchm("di_syn2_fall"); + finalize_lchm("di_syn2_fall", now); in_lchm = false; } @@ -940,13 +944,14 @@ int run(const Config& cfg) { last_gate = gate; } - if ((stats.count < cfg.windows) && ((now - last_lchm_complete) >= cfg.lchm_wait_ms)) { - fail_waiting_for_lchm(now); + const TickMs now_after_block = tick_count_ms(); + if ((stats.count < cfg.windows) && (elapsed_ms(now_after_block, last_lchm_complete) >= cfg.lchm_wait_ms)) { + fail_waiting_for_lchm(now_after_block); } } if (console_stop_requested() && in_lchm) { - finalize_lchm("user_stop"); + finalize_lchm("user_stop", tick_count_ms()); } expect_ok(api, api.StreamsStop(device.hnd), "Stop streams");