diff --git a/Cargo.lock b/Cargo.lock index 6091a9d09..1e6588f57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -127,9 +127,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.11" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4730490333d58093109dc02c23174c3f4d490998c3fed3cc8e82d57afedb9cf" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "jobserver", "libc", @@ -637,7 +637,7 @@ dependencies = [ [[package]] name = "idsp" version = "0.17.0" -source = "git+https://github.com/quartiq/idsp.git#a65f6577e162c0df918831eb3e5ce7e690c8a702" +source = "git+https://github.com/quartiq/idsp.git#7a352679f197229152d0ece36866d9a676c0ac93" dependencies = [ "miniconf", "num-complex 0.4.6", @@ -770,7 +770,7 @@ dependencies = [ [[package]] name = "miniconf" version = "0.18.0" -source = "git+https://github.com/quartiq/miniconf.git#52796414eecc3c42b0ab066a539284ad562f33e8" +source = "git+https://github.com/quartiq/miniconf.git#23fc746768695287561fe8b5332e1c022a507cfb" dependencies = [ "itoa", "miniconf_derive", @@ -783,7 +783,7 @@ dependencies = [ [[package]] name = "miniconf_derive" version = "0.18.0" -source = "git+https://github.com/quartiq/miniconf.git#52796414eecc3c42b0ab066a539284ad562f33e8" +source = "git+https://github.com/quartiq/miniconf.git#23fc746768695287561fe8b5332e1c022a507cfb" dependencies = [ "darling", "proc-macro2", @@ -794,7 +794,7 @@ dependencies = [ [[package]] name = "miniconf_mqtt" version = "0.18.0" -source = "git+https://github.com/quartiq/miniconf.git#52796414eecc3c42b0ab066a539284ad562f33e8" +source = "git+https://github.com/quartiq/miniconf.git#23fc746768695287561fe8b5332e1c022a507cfb" dependencies = [ "embedded-io", "heapless 0.8.0", @@ -1740,18 +1740,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" +checksum = "7b8c07a70861ce02bad1607b5753ecb2501f67847b9f9ada7c160fff0ec6300c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.14" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" +checksum = "5226bc9a9a9836e7428936cde76bb6b22feea1a8bfdbc0d241136e4d13417e25" dependencies = [ "proc-macro2", "quote", diff --git a/hitl/loopback.py b/hitl/loopback.py index 45e71ceb3..2226c55bf 100644 --- a/hitl/loopback.py +++ b/hitl/loopback.py @@ -38,17 +38,18 @@ async def test_loopback(stabilizer, telemetry_queue, set_point, gain=1, channel= # "max": u, # }, "biquad/0/typ": "Pid", - "biquad/0/repr/Pid/ki": -1000, - "biquad/0/repr/Pid/kp": -0.1, + "biquad/0/repr/Pid/order": "I", + "biquad/0/repr/Pid/gain/i": -1000, + "biquad/0/repr/Pid/gain/p": -0.1, "biquad/0/repr/Pid/min": -10, "biquad/0/repr/Pid/max": 10, "biquad/0/repr/Pid/setpoint": set_point*gain, "source/amplitude": 0, + "source/offset": 0, "run": "Run", }.items(): await stabilizer.set(f"/ch/{channel}/{k}", v) - await stabilizer.set(f"/trigger", True) - await stabilizer.set(f"/trigger", False) + await stabilizer.set(f"/trigger", None) await telemetry_queue.__anext__() # discard latest_values = json.loads((await telemetry_queue.__anext__()).payload) print(f"Latest telemtry: {latest_values}") diff --git a/hitl/run.sh b/hitl/run.sh index 0461755b2..e4f3ea09c 100755 --- a/hitl/run.sh +++ b/hitl/run.sh @@ -40,8 +40,8 @@ ping -c 5 -w 20 stabilizer-hitl # Test the MQTT interface. This uses the default broker "mqtt" python3 -m miniconf $PREFIX '?' python3 -m miniconf $PREFIX \ - '/ch/0/gain="G2"' 'biquad/0/typ="Pid"' \ - /ch/0/biquad/0/repr/Pid/ki=-10 kp=-0.1 setpoint=0 min=-30000 max=30000 \ + '/ch/0/gain="G2"' '/ch/0/biquad/0/typ="Pid"' \ + /ch/0/biquad/0/repr/Pid/setpoint=0 min=-30000 max=30000 gain/i=-10 gain/p=-0.1 \ '/ch/0/run="Run"' # Test the ADC/DACs connected via loopback. diff --git a/src/bin/dual-iir.rs b/src/bin/dual-iir.rs index 8cd677b9b..d383d92f0 100644 --- a/src/bin/dual-iir.rs +++ b/src/bin/dual-iir.rs @@ -102,6 +102,9 @@ impl serial_settings::Settings for Settings { #[derive(Clone, Debug, Tree)] pub struct BiquadRepr { + /// Biquad parameters + #[tree(rename = "typ")] + repr: StrLeaf>, /// Subtree access #[tree( rename = "repr", @@ -109,9 +112,6 @@ pub struct BiquadRepr { defer = "*self.repr" )] _repr: (), - /// Biquad parameters - #[tree(rename = "typ")] - repr: StrLeaf>, } impl Default for BiquadRepr { @@ -181,8 +181,12 @@ impl Channel { pub struct DualIir { /// Channel configuration ch: [Channel; 2], + /// Trigger handshake + #[tree(skip)] + trigger: bool, /// Trigger both signal sources - trigger: Leaf, + #[tree(validate=self.validate_trigger, rename="trigger")] + _trigger: Leaf<()>, /// Telemetry output period in seconds. telemetry_period: Leaf, /// Target IP and port for UDP streaming. @@ -191,11 +195,23 @@ pub struct DualIir { stream: Leaf, } +impl DualIir { + fn validate_trigger( + &mut self, + depth: usize, + ) -> Result { + debug_assert!(!self.trigger); + self.trigger = true; + Ok(depth) + } +} + impl Default for DualIir { fn default() -> Self { Self { - telemetry_period: 10.0.into(), - trigger: false.into(), + telemetry_period: Leaf(10.0), + trigger: false, + _trigger: Leaf(()), stream: Default::default(), ch: Default::default(), } @@ -217,7 +233,7 @@ mod app { #[shared] struct Shared { usb: UsbDevice, - network: NetworkUsers, + network: NetworkUsers, settings: Settings, active: [Active; 2], telemetry: TelemetryBuffer, @@ -225,7 +241,7 @@ mod app { #[local] struct Local { - usb_terminal: SerialTerminal, + usb_terminal: SerialTerminal, sampling_timer: SamplingTimer, digital_inputs: (DigitalInput0, DigitalInput1), afes: (AFE0, AFE1), @@ -240,7 +256,7 @@ mod app { let clock = SystemTimer::new(|| Systick::now().ticks()); // Configure the microcontroller - let (stabilizer, _pounder) = hardware::setup::setup::( + let (stabilizer, _pounder) = hardware::setup::setup::( c.core, c.device, clock, @@ -435,8 +451,8 @@ mod app { c.local.afes.0.set_gain(*settings.dual_iir.ch[0].gain); c.local.afes.1.set_gain(*settings.dual_iir.ch[1].gain); - if *settings.dual_iir.trigger { - settings.dual_iir.trigger = Leaf(false); + if settings.dual_iir.trigger { + settings.dual_iir.trigger = false; let s = settings.dual_iir.ch.each_ref().map(|ch| { let s = ch .source @@ -454,11 +470,6 @@ mod app { } }); } - - c.shared - .network - .lock(|net| net.direct_stream(*settings.dual_iir.stream)); - let b = settings.dual_iir.ch.each_ref().map(|ch| { ( *ch.run, @@ -473,6 +484,9 @@ mod app { (a.run, a.biquad) = b; } }); + c.shared + .network + .lock(|net| net.direct_stream(*settings.dual_iir.stream)); }); }