From e56f99b3ae0325bafe1780731c190d2094d06a21 Mon Sep 17 00:00:00 2001 From: mwojcik Date: Tue, 31 Aug 2021 12:46:52 +0200 Subject: [PATCH] satman: straightened up drtio interface --- src/libboard_artiq/src/drtioaux.rs | 1 - src/satman/main.rs | 66 +++++++++++++++--------------- src/satman/repeater.rs | 8 ++-- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/libboard_artiq/src/drtioaux.rs b/src/libboard_artiq/src/drtioaux.rs index 78e21f3..e13bde1 100644 --- a/src/libboard_artiq/src/drtioaux.rs +++ b/src/libboard_artiq/src/drtioaux.rs @@ -11,7 +11,6 @@ use libboard_zynq::{timer::GlobalTimer, time::Milliseconds}; pub use drtioaux_proto::Packet; -// this is parametric over T because there's no impl Fail for !. #[derive(Debug)] pub enum Error { GatewareError, diff --git a/src/satman/main.rs b/src/satman/main.rs index 940947e..fe01294 100644 --- a/src/satman/main.rs +++ b/src/satman/main.rs @@ -62,12 +62,12 @@ fn drtiosat_tsc_loaded() -> bool { #[cfg(has_drtio_routing)] macro_rules! forward { - ($routing_table:expr, $destination:expr, $rank:expr, $repeaters:expr, $packet:expr) => {{ + ($routing_table:expr, $destination:expr, $rank:expr, $repeaters:expr, $packet:expr, $timer:expr) => {{ let hop = $routing_table.0[$destination as usize][$rank as usize]; if hop != 0 { let repno = (hop - 1) as usize; if repno < $repeaters.len() { - return $repeaters[repno].aux_forward($packet); + return $repeaters[repno].aux_forward($packet, $timer); } else { return Err(drtioaux::Error::RoutingError); } @@ -77,7 +77,7 @@ macro_rules! forward { #[cfg(not(has_drtio_routing))] macro_rules! forward { - ($routing_table:expr, $destination:expr, $rank:expr, $repeaters:expr, $packet:expr) => {} + ($routing_table:expr, $destination:expr, $rank:expr, $repeaters:expr, $packet:expr, $timer:expr) => {} } fn process_aux_packet(_repeaters: &mut [repeater::Repeater], @@ -94,8 +94,8 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], timer.delay_us(100); drtiosat_reset(false); for rep in _repeaters.iter() { - if let Err(e) = rep.rtio_reset() { - error!("failed to issue RTIO reset ({})", e); + if let Err(e) = rep.rtio_reset(timer) { + error!("failed to issue RTIO reset ({:?})", e); } } drtioaux::send(0, &drtioaux::Packet::ResetAck) @@ -150,12 +150,12 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], let repno = hop - 1; match _repeaters[repno].aux_forward(&drtioaux::Packet::DestinationStatusRequest { destination: _destination - }) { + }, timer) { Ok(()) => (), Err(drtioaux::Error::LinkDown) => drtioaux::send(0, &drtioaux::Packet::DestinationDownReply)?, Err(e) => { drtioaux::send(0, &drtioaux::Packet::DestinationDownReply)?; - error!("aux error when handling destination status request: {}", e); + error!("aux error when handling destination status request: {:?}", e); }, } } else { @@ -171,8 +171,8 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], drtioaux::Packet::RoutingSetPath { destination, hops } => { _routing_table.0[destination as usize] = hops; for rep in _repeaters.iter() { - if let Err(e) = rep.set_path(destination, &hops) { - error!("failed to set path ({})", e); + if let Err(e) = rep.set_path(destination, &hops, timer) { + error!("failed to set path ({:?})", e); } } drtioaux::send(0, &drtioaux::Packet::RoutingAck) @@ -184,8 +184,8 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], let rep_rank = rank + 1; for rep in _repeaters.iter() { - if let Err(e) = rep.set_rank(rep_rank) { - error!("failed to set rank ({})", e); + if let Err(e) = rep.set_rank(rep_rank, timer) { + error!("failed to set rank ({:?})", e); } } @@ -205,7 +205,7 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], } drtioaux::Packet::MonitorRequest { destination: _destination, channel, probe } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let value; #[cfg(has_rtio_moninj)] unsafe { @@ -222,7 +222,7 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], drtioaux::send(0, &reply) }, drtioaux::Packet::InjectionRequest { destination: _destination, channel, overrd, value } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); #[cfg(has_rtio_moninj)] unsafe { csr::rtio_moninj::inj_chan_sel_write(channel as _); @@ -232,7 +232,7 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], Ok(()) }, drtioaux::Packet::InjectionStatusRequest { destination: _destination, channel, overrd } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let value; #[cfg(has_rtio_moninj)] unsafe { @@ -247,23 +247,23 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], drtioaux::send(0, &drtioaux::Packet::InjectionStatusReply { value: value }) }, - drtioaux::Packet::I2cStartRequest { destination: _destination, _busno } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::I2cStartRequest { destination: _destination, busno } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let succeeded = i2c.start().is_ok(); drtioaux::send(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) } - drtioaux::Packet::I2cRestartRequest { destination: _destination, _busno } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::I2cRestartRequest { destination: _destination, busno } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let succeeded = i2c.restart().is_ok(); drtioaux::send(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) } - drtioaux::Packet::I2cStopRequest { destination: _destination, _busno } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::I2cStopRequest { destination: _destination, busno } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let succeeded = i2c.stop().is_ok(); drtioaux::send(0, &drtioaux::Packet::I2cBasicReply { succeeded: succeeded }) } - drtioaux::Packet::I2cWriteRequest { destination: _destination, _busno, data } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::I2cWriteRequest { destination: _destination, busno, data } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); match i2c.write(data) { Ok(ack) => drtioaux::send(0, &drtioaux::Packet::I2cWriteReply { succeeded: true, ack: ack }), @@ -271,8 +271,8 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], &drtioaux::Packet::I2cWriteReply { succeeded: false, ack: false }) } } - drtioaux::Packet::I2cReadRequest { destination: _destination, _busno, ack } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::I2cReadRequest { destination: _destination, busno, ack } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); match i2c.read(ack) { Ok(data) => drtioaux::send(0, &drtioaux::Packet::I2cReadReply { succeeded: true, data: data }), @@ -282,21 +282,21 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], } drtioaux::Packet::SpiSetConfigRequest { destination: _destination, busno, flags, length, div, cs } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); // todo: reimplement when SPI is available //let succeeded = spi::set_config(busno, flags, length, div, cs).is_ok(); drtioaux::send(0, &drtioaux::Packet::SpiBasicReply { succeeded: false}) }, - drtioaux::Packet::SpiWriteRequest { destination: _destination, _busno, data } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::SpiWriteRequest { destination: _destination, busno, data } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); // todo: reimplement when SPI is available //let succeeded = spi::write(busno, data).is_ok(); drtioaux::send(0, &drtioaux::Packet::SpiBasicReply { succeeded: false }) } - drtioaux::Packet::SpiReadRequest { destination: _destination, _busno } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + drtioaux::Packet::SpiReadRequest { destination: _destination, busno } => { + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); // todo: reimplement when SPI is available // match spi::read(busno) { // Ok(data) => drtioaux::send(0, @@ -310,7 +310,7 @@ fn process_aux_packet(_repeaters: &mut [repeater::Repeater], drtioaux::Packet::JdacBasicRequest { destination: _destination, dacno: _dacno, reqno: _reqno, param: _param } => { - forward!(_routing_table, _destination, *_rank, _repeaters, &packet); + forward!(_routing_table, _destination, *_rank, _repeaters, &packet, timer); let (succeeded, retval) = (false, 0); drtioaux::send(0, &drtioaux::Packet::JdacBasicReply { succeeded: succeeded, retval: retval }) @@ -336,7 +336,7 @@ fn process_aux_packets(repeaters: &mut [repeater::Repeater], }); match result { Ok(()) => (), - Err(e) => warn!("aux packet error ({})", e) + Err(e) => warn!("aux packet error ({:?})", e) } } @@ -544,11 +544,11 @@ pub extern fn main_core0() -> i32 { info!("TSC loaded from uplink"); for rep in repeaters.iter() { if let Err(e) = rep.sync_tsc(timer) { - error!("failed to sync TSC ({})", e); + error!("failed to sync TSC ({:?})", e); } } if let Err(e) = drtioaux::send(0, &drtioaux::Packet::TSCAck) { - error!("aux packet error: {}", e); + error!("aux packet error: {:?}", e); } } } diff --git a/src/satman/repeater.rs b/src/satman/repeater.rs index 1391716..917e03f 100644 --- a/src/satman/repeater.rs +++ b/src/satman/repeater.rs @@ -81,18 +81,18 @@ impl Repeater { if let Ok(Some(drtioaux::Packet::EchoReply)) = drtioaux::recv(self.auxno) { info!("[REP#{}] remote replied after {} packets", self.repno, ping_count); self.state = RepeaterState::Up; - if let Err(e) = self.sync_tsc() { - error!("[REP#{}] failed to sync TSC ({})", self.repno, e); + if let Err(e) = self.sync_tsc(timer) { + error!("[REP#{}] failed to sync TSC ({:?})", self.repno, e); self.state = RepeaterState::Failed; return; } if let Err(e) = self.load_routing_table(routing_table, timer) { - error!("[REP#{}] failed to load routing table ({})", self.repno, e); + error!("[REP#{}] failed to load routing table ({:?})", self.repno, e); self.state = RepeaterState::Failed; return; } if let Err(e) = self.set_rank(rank + 1, timer) { - error!("[REP#{}] failed to set rank ({})", self.repno, e); + error!("[REP#{}] failed to set rank ({:?})", self.repno, e); self.state = RepeaterState::Failed; return; }