From 7879224ab2926577a7b4e6e8abda00bc449da6dd Mon Sep 17 00:00:00 2001 From: miranda Date: Thu, 18 Jul 2024 21:51:06 +0300 Subject: [PATCH] fix state management for OnOffMode::Raw --- src/autocrap/interpreter.rs | 46 ++++++++++++++++++++----------------- src/main.rs | 6 ++++- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/autocrap/interpreter.rs b/src/autocrap/interpreter.rs index 9e3c26a..762cbc9 100644 --- a/src/autocrap/interpreter.rs +++ b/src/autocrap/interpreter.rs @@ -100,21 +100,23 @@ pub struct OnOffLogic { } impl OnOffLogic { - fn update(&mut self, new_state: bool) -> Response { - let changed = new_state != self.state; - self.state = new_state; + fn update(&mut self, new_state: bool, remember: bool) -> Response { + if remember { + let changed = new_state != self.state; + self.state = new_state; - if !changed { - return Response::new(); + if !changed { + return Response::new(); + } } Response { osc: Some(OscResponse { addr: self.osc_addr.clone(), - args: vec![OscType::Float(if self.state { 1.0 } else { 0.0 })] + args: vec![OscType::Float(if new_state { 1.0 } else { 0.0 })] }), ctrl: self.ctrl_out_num.map(|num| CtrlResponse { - data: vec![num, if self.state { 0x7f } else { 0x00 }] + data: vec![num, if new_state { 0x7f } else { 0x00 }] }), midi: self.midi.map(|midi| { let data = match midi.kind { @@ -122,7 +124,7 @@ impl OnOffLogic { vec![ 0b10110000 | midi.channel, midi.num, - if self.state { 0x7f } else { 0x00 } + if new_state { 0x7f } else { 0x00 } ] } }; @@ -163,10 +165,12 @@ impl CtrlLogic for OnOffLogic { let mut new_state = self.state; let mut send_ctrl = true; let mut send_osc = true; + let mut remember = true; match self.mode { OnOffMode::Raw => { new_state = pressed; send_ctrl = false; + remember = false; }, OnOffMode::Momentary => { new_state = pressed; @@ -181,7 +185,7 @@ impl CtrlLogic for OnOffLogic { } } - let mut response = self.update(new_state); + let mut response = self.update(new_state, remember); if !send_ctrl { response.ctrl = None; @@ -211,9 +215,9 @@ impl CtrlLogic for OnOffLogic { return None; }; - self.update(val != 0.0) - .ctrl - .map(|r| r.into()) + let mut response = Response::new(); + response.ctrl = self.update(val != 0.0, true).ctrl; + Some(response) } fn handle_midi(&mut self, msg: &[u8]) -> Option { @@ -241,9 +245,9 @@ impl CtrlLogic for OnOffLogic { return None; } - self.update(val != 0) - .ctrl - .map(|r| r.into()) + let mut response = Response::new(); + response.ctrl = self.update(val != 0, true).ctrl; + Some(response) } } @@ -440,9 +444,9 @@ impl CtrlLogic for RelativeLogic { let new_state = float_to_7bit(val); - self.update(new_state) - .ctrl - .map(|r| r.into()) + let mut response = Response::new(); + response.ctrl = self.update(new_state).ctrl; + Some(response) } fn handle_midi(&mut self, msg: &[u8]) -> Option { @@ -470,9 +474,9 @@ impl CtrlLogic for RelativeLogic { return None; } - self.update(val) - .ctrl - .map(|r| r.into()) + let mut response = Response::new(); + response.ctrl = self.update(val).ctrl; + Some(response) } } diff --git a/src/main.rs b/src/main.rs index 1aa3276..20f4c12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -286,7 +286,7 @@ fn run_reader( addr: addr, args: args, }); - println!("osc: {:?}", msg); + // println!("osc out: {:?}", msg); let msg_buf = encoder::encode(&msg)?; sock.send_to(&msg_buf, out_addr)?; @@ -315,6 +315,7 @@ fn run_writer( ) -> Result<()> { loop { let ctrl_out = ctrl_rx.recv()?; + // println!("ctrl out: {:02x?}", ctrl_out); handle.write_interrupt(endpoint.address, &ctrl_out, DEFAULT_TIMEOUT)?; } } @@ -338,11 +339,14 @@ fn run_osc_receiver( let (_, packet) = rosc::decoder::decode_udp(&buf[..size])?; match packet { OscPacket::Message(msg) => { + // println!("osc in: {} {:?}", msg.addr, msg.args); let Some(response) = interpreter.write().unwrap().handle_osc(&msg) else { println!("unhandled osc message: with size {} from {}: {} {:?}", size, addr, msg.addr, msg.args); continue; }; + // println!("osc in response: {:?}", response); + let Some(CtrlResponse { data }) = response.ctrl else { continue; };