diff --git a/crates/modbussim-app/src/commands.rs b/crates/modbussim-app/src/commands.rs index 0a2c01b..0750eaa 100644 --- a/crates/modbussim-app/src/commands.rs +++ b/crates/modbussim-app/src/commands.rs @@ -531,6 +531,65 @@ pub async fn read_register( Ok(RegisterValueInfo { address, value }) } +#[tauri::command] +pub async fn read_registers_bulk( + state: State<'_, AppState>, + connection_id: String, + slave_id: u8, + register_type: String, +) -> Result, String> { + let connections = state.slave_connections.read().await; + let conn = connections + .get(&connection_id) + .ok_or_else(|| format!("connection {} not found", connection_id))?; + + let reg_type = parse_register_type(®ister_type)?; + + let devices = conn.connection.devices.read().await; + let device = devices + .get(&slave_id) + .ok_or_else(|| format!("slave {} not found", slave_id))?; + + let mut out = Vec::with_capacity(device.register_defs.len()); + for def in device + .register_defs + .iter() + .filter(|d| d.register_type == reg_type) + { + let value = match reg_type { + RegisterType::Coil => device + .register_map + .coils + .get(&def.address) + .copied() + .unwrap_or(false) as u16, + RegisterType::DiscreteInput => device + .register_map + .discrete_inputs + .get(&def.address) + .copied() + .unwrap_or(false) as u16, + RegisterType::HoldingRegister => device + .register_map + .holding_registers + .get(&def.address) + .copied() + .unwrap_or(0), + RegisterType::InputRegister => device + .register_map + .input_registers + .get(&def.address) + .copied() + .unwrap_or(0), + }; + out.push(RegisterValueInfo { + address: def.address, + value, + }); + } + Ok(out) +} + #[tauri::command] pub async fn write_register( state: State<'_, AppState>, diff --git a/crates/modbussim-app/src/lib.rs b/crates/modbussim-app/src/lib.rs index d15e462..daca58f 100644 --- a/crates/modbussim-app/src/lib.rs +++ b/crates/modbussim-app/src/lib.rs @@ -22,6 +22,7 @@ pub fn run() { commands::add_register, commands::remove_register, commands::read_register, + commands::read_registers_bulk, commands::write_register, commands::list_registers, commands::export_registers,