mirror of
https://github.com/hubaldv/bioz-host-rs.git
synced 2025-12-06 05:11:17 +00:00
Inluded frequency selector at start.
This commit is contained in:
21
src/app.rs
21
src/app.rs
@@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 })
|
||||||
|
|||||||
@@ -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.");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub enum FrequencySignal {
|
pub enum SingleFrequencySignal {
|
||||||
Start(f32),
|
Start(u32),
|
||||||
Stop,
|
Stop,
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user