Skip to content

Commit

Permalink
transceivers-server: cleanup interface (#1446)
Browse files Browse the repository at this point in the history
Most of the interface here was built out to facilitate benchtop testing during initial development. Now that we have these interfaces proven out and connected via the UDP interface, we don't really need them as part of the general Idol server interface. I'm opting to remove them completely as otherwise it just doubles the surface area where we need to manage the module interactions. This will leave the UDP interface as the sole way to manage the transceivers going forward.
  • Loading branch information
Aaron-Hartwig committed Jun 28, 2023
1 parent 8d74b15 commit 822d375
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 418 deletions.
237 changes: 2 additions & 235 deletions drv/transceivers-server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@ use drv_sidecar_front_io::{
};
use drv_sidecar_seq_api::{SeqError, Sequencer};
use drv_transceivers_api::{
ModuleStatus, TransceiversError, NUM_PORTS, PAGE_SIZE_BYTES,
TRANSCEIVER_TEMPERATURE_SENSORS,
};
use idol_runtime::{
ClientError, Leased, NotificationHandler, RequestError, R, W,
ModuleStatus, TransceiversError, NUM_PORTS, TRANSCEIVER_TEMPERATURE_SENSORS,
};
use idol_runtime::{NotificationHandler, RequestError};
use ringbuf::*;
use task_sensor_api::{NoData, Sensor, SensorError};
use task_thermal_api::{Thermal, ThermalError, ThermalProperties};
Expand Down Expand Up @@ -440,217 +437,6 @@ impl idl::InOrderTransceiversImpl for ServerImpl {
}
}

fn port_enable_power(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.enable_power(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn port_disable_power(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.disable_power(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn port_assert_reset(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.assert_reset(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn port_deassert_reset(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.deassert_reset(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn port_assert_lpmode(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.assert_lpmode(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn port_deassert_lpmode(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.deassert_lpmode(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn clear_power_fault(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.clear_power_fault(mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn setup_i2c_read(
&mut self,
_msg: &userlib::RecvMessage,
reg: u8,
num_bytes: u8,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
if usize::from(num_bytes) > PAGE_SIZE_BYTES {
return Err(TransceiversError::InvalidNumberOfBytes.into());
}
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.setup_i2c_read(reg, num_bytes, mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn setup_i2c_write(
&mut self,
_msg: &userlib::RecvMessage,
reg: u8,
num_bytes: u8,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
if usize::from(num_bytes) > PAGE_SIZE_BYTES {
return Err(TransceiversError::InvalidNumberOfBytes.into());
}
let mask = LogicalPortMask(logical_port_mask);
let result = self.transceivers.setup_i2c_write(reg, num_bytes, mask);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn get_i2c_read_buffer(
&mut self,
_msg: &userlib::RecvMessage,
logical_port: u8,
dest: Leased<W, [u8]>,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
if logical_port >= NUM_PORTS {
return Err(TransceiversError::InvalidPortNumber.into());
}
let port = LogicalPort(logical_port);

if dest.len() > PAGE_SIZE_BYTES {
return Err(TransceiversError::InvalidNumberOfBytes.into());
}

let mut buf = [0u8; PAGE_SIZE_BYTES];

self.transceivers
.get_i2c_read_buffer(port, &mut buf[..dest.len()])
.map_err(TransceiversError::from)?;

dest.write_range(0..dest.len(), &buf[..dest.len()])
.map_err(|_| RequestError::Fail(ClientError::WentAway))?;
Ok(())
}

fn set_i2c_write_buffer(
&mut self,
_msg: &userlib::RecvMessage,
data: Leased<R, [u8]>,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
if data.len() > PAGE_SIZE_BYTES {
return Err(TransceiversError::InvalidNumberOfBytes.into());
}

let mut buf = [0u8; PAGE_SIZE_BYTES];

data.read_range(0..data.len(), &mut buf[..data.len()])
.map_err(|_| RequestError::Fail(ClientError::WentAway))?;

let result = self.transceivers.set_i2c_write_buffer(&buf[..data.len()]);
if result.error().is_empty() {
Ok(())
} else {
Err(RequestError::from(TransceiversError::FpgaError))
}
}

fn set_port_led_on(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
self.set_led_state(LogicalPortMask(logical_port_mask), LedState::On);
Ok(())
}

fn set_port_led_off(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
self.set_led_state(LogicalPortMask(logical_port_mask), LedState::Off);
Ok(())
}

fn set_port_led_blink(
&mut self,
_msg: &userlib::RecvMessage,
logical_port_mask: u32,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
self.set_led_state(LogicalPortMask(logical_port_mask), LedState::Blink);
Ok(())
}

fn set_system_led_on(
&mut self,
_msg: &userlib::RecvMessage,
Expand All @@ -674,25 +460,6 @@ impl idl::InOrderTransceiversImpl for ServerImpl {
self.set_system_led_state(LedState::Blink);
Ok(())
}

fn set_led_current(
&mut self,
_msg: &userlib::RecvMessage,
value: u8,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
self.leds
.set_current(value)
.map_err(|_| RequestError::from(TransceiversError::LedI2cError))
}

fn set_led_pwm(
&mut self,
_msg: &userlib::RecvMessage,
value: u8,
) -> Result<(), idol_runtime::RequestError<TransceiversError>> {
self.leds.set_pwm(value);
Ok(())
}
}

impl NotificationHandler for ServerImpl {
Expand Down
Loading

0 comments on commit 822d375

Please sign in to comment.