Inluded frequency selector at start.

This commit is contained in:
2025-08-18 14:50:50 +02:00
parent dba4d652f3
commit 9d6625e8fa
6 changed files with 33 additions and 22 deletions

View File

@@ -4,15 +4,15 @@ use std::sync::atomic::{AtomicBool, Ordering};
use atomic_float::AtomicF32; use atomic_float::AtomicF32;
use tokio::{sync::mpsc::{Sender}}; use tokio::{sync::mpsc::{Sender}};
use eframe::egui::{self, Color32, DragValue, Key, Layout, Modifiers, }; use eframe::egui::{self, Color32, DragValue, Key, Label, Layout, Modifiers};
use egui_plot::{Corner, Legend, Line, Plot, PlotPoints, Points, PlotBounds}; use egui_plot::{Corner, Legend, Line, Plot, PlotPoints, Points, PlotBounds};
use crate::plot::TimeSeriesPlot; use crate::plot::TimeSeriesPlot;
use crate::signals::FrequencySignal; use crate::signals::SingleFrequencySignal;
pub struct App { pub struct App {
run_impedancemeter_tx: Sender<FrequencySignal>, run_impedancemeter_tx: Sender<SingleFrequencySignal>,
pub magnitude: Arc<Mutex<f32>>, pub magnitude: Arc<Mutex<f32>>,
pub phase: Arc<Mutex<f32>>, pub phase: Arc<Mutex<f32>>,
pub magnitude_series: Arc<Mutex<TimeSeriesPlot>>, pub magnitude_series: Arc<Mutex<TimeSeriesPlot>>,
@@ -20,10 +20,11 @@ pub struct App {
pub connected: Arc<AtomicBool>, pub connected: Arc<AtomicBool>,
pub on: bool, pub on: bool,
pub data_frequency: Arc<AtomicF32>, pub data_frequency: Arc<AtomicF32>,
pub single_frequency: u32
} }
impl App { impl App {
pub fn new(run_impedancemeter_tx: Sender<FrequencySignal>) -> Self { pub fn new(run_impedancemeter_tx: Sender<SingleFrequencySignal>) -> Self {
let app = App { let app = App {
run_impedancemeter_tx, run_impedancemeter_tx,
magnitude: Arc::new(Mutex::new(0.0)), magnitude: Arc::new(Mutex::new(0.0)),
@@ -33,6 +34,7 @@ impl App {
connected: Arc::new(AtomicBool::new(false)), connected: Arc::new(AtomicBool::new(false)),
on: true, on: true,
data_frequency: Arc::new(AtomicF32::new(0.0)), data_frequency: Arc::new(AtomicF32::new(0.0)),
single_frequency: 50000,
}; };
app.update_start_stop(); app.update_start_stop();
app app
@@ -41,12 +43,12 @@ impl App {
pub fn update_start_stop(&self) { pub fn update_start_stop(&self) {
match self.on { match self.on {
true => { true => {
if let Err(e) = self.run_impedancemeter_tx.try_send(FrequencySignal::Start(0.0)) { if let Err(e) = self.run_impedancemeter_tx.try_send(SingleFrequencySignal::Start(self.single_frequency)) {
eprintln!("Failed to send start command: {:?}", e); eprintln!("Failed to send start command: {:?}", e);
} }
}, },
false => { false => {
if let Err(e) = self.run_impedancemeter_tx.try_send(FrequencySignal::Stop) { if let Err(e) = self.run_impedancemeter_tx.try_send(SingleFrequencySignal::Stop) {
eprintln!("Failed to send stop command: {:?}", e); eprintln!("Failed to send stop command: {:?}", e);
} }
}, },
@@ -68,6 +70,13 @@ impl eframe::App for App {
ui.separator(); ui.separator();
ui.add_enabled_ui(!self.on, |ui| {
ui.add(DragValue::new(&mut self.single_frequency));
ui.add(Label::new("Hz"));
});
ui.separator();
if ui.add_enabled(connected, toggle_start_stop(&mut self.on)).changed() { if ui.add_enabled(connected, toggle_start_stop(&mut self.on)).changed() {
self.update_start_stop(); self.update_start_stop();
}; };

View File

@@ -64,7 +64,7 @@ async fn main() {
} }
["imp", "listen", freq, dur] => { ["imp", "listen", freq, dur] => {
let Ok(freq) = freq.parse::<f32>() else { let Ok(freq) = freq.parse::<u32>() else {
println!("Bad freq: {freq}"); println!("Bad freq: {freq}");
continue; continue;
}; };
@@ -81,6 +81,7 @@ async fn main() {
client.start_impedancemeter(freq).await.unwrap(); client.start_impedancemeter(freq).await.unwrap();
println!("Started!"); println!("Started!");
let dur = Duration::from_millis(dur.into()); let dur = Duration::from_millis(dur.into());
let start = Instant::now(); let start = Instant::now();
while start.elapsed() < dur { while start.elapsed() < dur {
let val = sub.recv().await.unwrap(); let val = sub.recv().await.unwrap();
@@ -90,9 +91,10 @@ async fn main() {
println!("Stopped!"); println!("Stopped!");
} }
["imp", "start", freq] => { ["imp", "start", freq] => {
let Ok(freq) = freq.parse::<f32>() else { let Ok(freq) = freq.parse::<u32>() else {
println!("Bad freq: {freq}"); println!("Bad freq: {freq}");
continue; continue;
}; };
match client.start_impedancemeter(freq).await { match client.start_impedancemeter(freq).await {

View File

@@ -8,7 +8,7 @@ use bioz_host_rs::communication::communicate_with_hardware;
use tokio::sync::mpsc::{self}; use tokio::sync::mpsc::{self};
use bioz_host_rs::signals::FrequencySignal; use bioz_host_rs::signals::SingleFrequencySignal;
fn main() { fn main() {
SimpleLogger::new().init().expect("Failed to initialize logger"); SimpleLogger::new().init().expect("Failed to initialize logger");
@@ -20,7 +20,7 @@ fn main() {
// Enter the runtime so that `tokio::spawn` is available immediately. // Enter the runtime so that `tokio::spawn` is available immediately.
// let _enter = rt.enter(); // let _enter = rt.enter();
let (run_impedancemeter_tx, run_impedancemeter_rx) = mpsc::channel::<FrequencySignal>(2); let (run_impedancemeter_tx, run_impedancemeter_rx) = mpsc::channel::<SingleFrequencySignal>(2);
let run_impedancemeter_tx_clone = run_impedancemeter_tx.clone(); let run_impedancemeter_tx_clone = run_impedancemeter_tx.clone();
let app = App::new(run_impedancemeter_tx); let app = App::new(run_impedancemeter_tx);

View File

@@ -63,7 +63,7 @@ impl WorkbookClient {
pub async fn start_impedancemeter( pub async fn start_impedancemeter(
&self, &self,
frequency: f32, frequency: u32,
) -> Result<(), WorkbookError<Infallible>> { ) -> Result<(), WorkbookError<Infallible>> {
self.client self.client
.send_resp::<StartImpedanceEndpoint>(&StartImpedance { update_frequency: 60, sinus_frequency: frequency }) .send_resp::<StartImpedanceEndpoint>(&StartImpedance { update_frequency: 60, sinus_frequency: frequency })

View File

@@ -13,11 +13,11 @@ use crate::client::WorkbookClient;
use crate::plot::TimeSeriesPlot; use crate::plot::TimeSeriesPlot;
use crate::signals::FrequencySignal; use crate::signals::SingleFrequencySignal;
pub async fn communicate_with_hardware( pub async fn communicate_with_hardware(
mut run_impedancemeter_rx: Receiver<FrequencySignal>, mut run_impedancemeter_rx: Receiver<SingleFrequencySignal>,
run_impedancemeter_tx: Sender<FrequencySignal>, run_impedancemeter_tx: Sender<SingleFrequencySignal>,
magnitude: Arc<Mutex<f32>>, magnitude: Arc<Mutex<f32>>,
phase: Arc<Mutex<f32>>, phase: Arc<Mutex<f32>>,
magnitude_series: Arc<Mutex<TimeSeriesPlot>>, magnitude_series: Arc<Mutex<TimeSeriesPlot>>,
@@ -37,7 +37,7 @@ pub async fn communicate_with_hardware(
#[derive(Default)] #[derive(Default)]
struct Settings { struct Settings {
frequency: Option<FrequencySignal>, frequency: Option<SingleFrequencySignal>,
} }
let mut settings = Settings::default(); let mut settings = Settings::default();
@@ -90,19 +90,19 @@ pub async fn communicate_with_hardware(
select! { select! {
Some(frequency) = run_impedancemeter_rx.recv() => { Some(frequency) = run_impedancemeter_rx.recv() => {
match frequency { match frequency {
FrequencySignal::Start(freq) => { SingleFrequencySignal::Start(freq) => {
if let Err(e) = workbook_client.start_impedancemeter(freq).await { if let Err(e) = workbook_client.start_impedancemeter(freq).await {
error!("Failed to start impedancemeter: {:?}", e); error!("Failed to start impedancemeter: {:?}", e);
} else { } else {
settings.frequency = Some(FrequencySignal::Start(freq)); settings.frequency = Some(SingleFrequencySignal::Start(freq));
info!("Impedancemeter started at frequency: {}", freq); info!("Impedancemeter started at frequency: {}", freq);
} }
}, },
FrequencySignal::Stop => { SingleFrequencySignal::Stop => {
if let Err(e) = workbook_client.stop_impedancemeter().await { if let Err(e) = workbook_client.stop_impedancemeter().await {
error!("Failed to stop impedancemeter: {:?}", e); error!("Failed to stop impedancemeter: {:?}", e);
} else { } else {
settings.frequency = Some(FrequencySignal::Stop); settings.frequency = Some(SingleFrequencySignal::Stop);
info!("Impedancemeter stopped."); info!("Impedancemeter stopped.");
} }
}, },

View File

@@ -1,5 +1,5 @@
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum FrequencySignal { pub enum SingleFrequencySignal {
Start(f32), Start(u32),
Stop, Stop,
} }