diff --git a/examples/rp/src/bin/usb_serial.rs b/examples/rp/src/bin/usb_serial.rs index f6652dd637a401c7ef23f8fe2a75619851eae028..6f1465e82ceb715ffcc8eecc97c75e4e30c89029 100644 --- a/examples/rp/src/bin/usb_serial.rs +++ b/examples/rp/src/bin/usb_serial.rs @@ -110,18 +110,21 @@ async fn run<'d, P: Pin>(pin: &mut Flex<'d, P>, syst: &mut SYST) -> Result<(), D while pin.is_high() {} }); + let mut up_x = 0u32; + let mut down_x = 0u32; + let mut up = 0u32; + let mut down = 0u32; + loop { const LOOP: usize = 20; - const T: u32 = 10000; + const T: u32 = 8192; let mut dels = [0u32; LOOP]; let mut ups = [0u32; LOOP]; let mut downs = [0u32; LOOP]; - critical_section::with(|_cs| { + let mut upx = [0u32; LOOP]; + let mut downx = [0u32; LOOP]; - let mut up = 0u32; - let mut up_x = 0u32; - let mut down = 0u32; - let mut down_x = 0u32; + critical_section::with(|_cs| { for i in 0..LOOP { cortex_m::asm::delay(down_x); @@ -131,8 +134,12 @@ async fn run<'d, P: Pin>(pin: &mut Flex<'d, P>, syst: &mut SYST) -> Result<(), D while pin.is_low() {} let t2 = SYST::get_current(); up = t1 - t2; - up_x = up_x + T - down; - up_x = up_x.min(T * 4); + + up_x = if down < T { + up_x * 2 + } else { + up_x.saturating_sub(down/2) + }.max(1); cortex_m::asm::delay(up_x); pin.set_pull(Pull::Down); @@ -141,18 +148,24 @@ async fn run<'d, P: Pin>(pin: &mut Flex<'d, P>, syst: &mut SYST) -> Result<(), D while pin.is_high() {} let t2 = SYST::get_current(); down = t1 - t2; - down_x = down_x + T - up; - down_x = down_x.min(T * 4); + + down_x = if up < T { + down_x * 2 + } else { + down_x.saturating_sub(up/2) + }.max(1); ups[i] = up; + upx[i] = up_x; downs[i] = down; + downx[i] = down_x; dels[i] = up + down; } pin.set_pull(Pull::None); }); for i in 0..LOOP { - info!("{} U {} D {}", dels[i], ups[i], downs[i]); + info!("{} U {} x {} D {} x {}", dels[i], ups[i], upx[i], downs[i], downx[i]); } info!("==="); }