use simple_logger::SimpleLogger; use log::info; use tokio::runtime::Runtime; use bioz_host_rs::app::App; use bioz_host_rs::communication::communicate_with_hardware; use tokio::sync::mpsc::{self}; use bioz_host_rs::signals::SingleFrequencySignal; fn main() { SimpleLogger::new().init().expect("Failed to initialize logger"); log::set_max_level(log::LevelFilter::Info); info!("Starting Bioz Impedance Visualizer..."); let rt = Runtime::new().expect("Unable to create Runtime"); // Enter the runtime so that `tokio::spawn` is available immediately. // let _enter = rt.enter(); let (run_impedancemeter_tx, run_impedancemeter_rx) = mpsc::channel::(2); let run_impedancemeter_tx_clone = run_impedancemeter_tx.clone(); let app = App::new(run_impedancemeter_tx); let magnitude_clone = app.magnitude.clone(); let phase_clone = app.phase.clone(); let magnitude_series_clone = app.magnitude_series.clone(); let phase_series_clone = app.phase_series.clone(); let connected_clone = app.connected.clone(); let data_frequency_clone = app.data_frequency.clone(); // Execute the runtime in its own thread. std::thread::spawn(move || { rt.block_on(communicate_with_hardware( run_impedancemeter_rx, run_impedancemeter_tx_clone, magnitude_clone, phase_clone, magnitude_series_clone, phase_series_clone, connected_clone, data_frequency_clone, )); }); // Run the GUI in the main thread. let _ = eframe::run_native( "Impedance Visualizer [egui + tokio] - Hubald Verzijl - 2025", eframe::NativeOptions::default(), Box::new(|_cc| Ok(Box::new(app))), ); }