use std::net::SocketAddr;
use std::sync::Arc;
use oms_modbus::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let host = "127.0.0.1"; let port: u16 = 502;
println!("═══ OMS Modbus — TCP Server ═══\n");
let addr: SocketAddr = format!("{host}:{port}").parse()?;
println!("[1/3] Binding to {addr} …");
let server = tcp::TcpServer::bind(addr).await?;
let bind_addr = server.local_addr()?;
println!(" ✓ Listening on {bind_addr}\n");
println!("[2/3] Initializing SlaveStore …");
let store = Arc::new(SlaveStore::with_holding_registers(&[
(0, 1234), (1, 5678), (2, 100), (3, 42), (10, 500), (11, 600), (20, 1000), ]));
store.write_input_register(0, 3300); store.write_input_register(1, 1250); store.write_input_register(2, 5000);
store.write_coil(0, true); store.write_coil(1, false); store.write_coil(2, true); store.write_coil(3, true);
store.write_discrete_input(0, true); store.write_discrete_input(1, false); store.write_discrete_input(2, true);
println!(" ✓ Registers, coils, and discrete inputs ready\n");
println!("┌─ Register Map ───────────────────────────────────────┐");
println!("│ Holding Registers (read/write): │");
println!("│ [ 0] = 1234 Temperature ×10 (12.34 °C) │");
println!("│ [ 1] = 5678 Humidity ×10 (56.78 %) │");
println!("│ [ 2] = 100 Pressure (100 kPa) │");
println!("│ [ 3] = 42 Status code │");
println!("│ [ 10] = 500 Setpoint 1 │");
println!("│ [ 11] = 600 Setpoint 2 │");
println!("│ [ 20] = 1000 Counter │");
println!("│ │");
println!("│ Input Registers (read-only): │");
println!("│ [ 0] = 3300 Voltage ×100 (33.00 V) │");
println!("│ [ 1] = 1250 Current ×100 (12.50 A) │");
println!("│ [ 2] = 5000 Power (5000 W) │");
println!("│ │");
println!("│ Coils (digital outputs): │");
println!("│ [0] = ON Pump │");
println!("│ [1] = OFF Valve │");
println!("│ [2] = ON Heater │");
println!("│ [3] = ON Fan │");
println!("│ │");
println!("│ Discrete Inputs: │");
println!("│ [0] = ON Limit switch 1 │");
println!("│ [1] = OFF Limit switch 2 │");
println!("│ [2] = ON Emergency stop OK │");
println!("└─────────────────────────────────────────────────────┘\n");
println!("[3/3] Serving … (press Ctrl+C to stop)\n");
println!("Connect with: cargo run --example tcp_client");
println!("Or: cargo run --example tcp_client_auto_tid");
println!("Or any Modbus TCP client → {bind_addr}\n");
server.serve_forever(store).await?;
Ok(())
}