From 5b0bebe93fe20711f0193189bfccf4c42256af92 Mon Sep 17 00:00:00 2001 From: Tony Cao Date: Mon, 26 Oct 2026 18:59:54 +0800 Subject: [PATCH] restore blocking FPWR in async loop - branch tip deployable (bridge/async both work; verified bSync=True 4kHz) --- src/main.rs | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1f24c22..d720b42 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2550,26 +2550,16 @@ async fn rfm_async_loop( while (rt::now_ns() as i64) < target { core::hint::spin_loop(); } wphase_st.push(((rt::now_ns() % 1_000_000) / 1000) as i64); } - // PIPELINE v2: mirror the fprd's working pattern - a short - // yield-kick lets the executor run the TX task (frame goes on - // the wire), then store for poll-based completion at reap. - let mut f: FpwrFut<'_> = Box::pin( - ethercrab::Command::fpwr(station, SM_TX_ADDR).send(maindevice, &slot[..PAYLOAD_LEN]), - ); - let t_kick = Instant::now(); - let _ = futures_lite::future::or( - async { f.as_mut().await.is_ok() }, - async { - while t_kick.elapsed().as_micros() < 20 { - futures_lite::future::yield_now().await; - } - false - }, - ) - .await; - pending_fpwr = Some(f); - j2cx_pending = Some(t_detect); - n_fpwr += 1; // issued; result counted at reap + let tx_ok = ethercrab::Command::fpwr(station, SM_TX_ADDR) + .send(maindevice, &slot[..PAYLOAD_LEN]) + .await + .is_ok(); + n_fpwr += 1; + if tx_ok { + j2cx_st.push(t_detect.elapsed().as_nanos() as i64); + } else { + n_fpwr_err += 1; + } } else { n_ovf += 1; // wire busy; newer tx_latest will go out after reap }