diff --git a/controller/src/logic.rs b/controller/src/logic.rs index 1403e276d71575fcc05c10fef284082bc3d9d1ab..17ee57c72465515bfcb1031b7ade3afe34c1dc32 100644 --- a/controller/src/logic.rs +++ b/controller/src/logic.rs @@ -13,13 +13,13 @@ use embassy_time::{Duration, Instant, Ticker}; use heapless::Deque; use i2c2_target::{I2C2, MESSAGE_SIZE}; +static MAX_MOTOR_PERCENTAGE: AtomicU8 = AtomicU8::new(100); static WATCHDOG_TICKS: AtomicU8 = AtomicU8::new(5); struct State { i2c: I2C2, motors: Tb6612fng<'static>, encoders: Encoders<'static>, - max_motor_percentage: u8, motor_speed: [u8; 2], standby: bool, } @@ -30,7 +30,6 @@ impl State { i2c: i2c2, motors, encoders, - max_motor_percentage: 100, motor_speed: [0, 0], standby: true, } @@ -40,7 +39,7 @@ impl State { fn set_motor_speed(&mut self, ms: [u8; 2]) { let (max_pwm, mmp) = ( self.motors.max_pwm() as i32, - i32::from(self.max_motor_percentage), + i32::from(MAX_MOTOR_PERCENTAGE.load(Ordering::Relaxed)), ); let scaled_speed = |speed| match speed as i8 { -128 => None, @@ -202,14 +201,16 @@ fn process_command( } &[CMD_MAX_MOTOR_PERCENTAGE, p] => { if (1..=100).contains(&p) { - state.max_motor_percentage = p; + MAX_MOTOR_PERCENTAGE.store(p, Ordering::Relaxed); } else { defmt::warn!("incorrect max percentage {}", p); return false; } } [CMD_MAX_MOTOR_PERCENTAGE] => { - response.push_back(state.max_motor_percentage).unwrap(); + response + .push_back(MAX_MOTOR_PERCENTAGE.load(Ordering::Relaxed)) + .unwrap(); } [CMD_MOTOR_SPEED, ms @ ..] if ms.len() == 2 => { state.set_motor_speed([ms[0], ms[1]]);