Included active tab variable to stop amplifier after tab change.

This commit is contained in:
2025-09-07 19:10:14 +02:00
parent 3171f2d936
commit d9477626e1

View File

@@ -1,3 +1,5 @@
use log::info;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
@@ -12,6 +14,13 @@ use crate::plot::TimeSeriesPlot;
use crate::signals::SingleFrequencySignal; use crate::signals::SingleFrequencySignal;
#[derive(Clone, Copy,Debug, PartialEq, Eq)]
enum TabActive {
Single,
Multi,
Shortcuts,
}
pub struct App { pub struct App {
tree: DockState<String>, tree: DockState<String>,
tab_viewer: TabViewer, tab_viewer: TabViewer,
@@ -22,6 +31,7 @@ pub struct App {
pub phase_series: Arc<Mutex<TimeSeriesPlot>>, pub phase_series: Arc<Mutex<TimeSeriesPlot>>,
pub connected: Arc<AtomicBool>, pub connected: Arc<AtomicBool>,
pub on: Arc<Mutex<bool>>, pub on: Arc<Mutex<bool>>,
tab_active: TabActive,
pub data_frequency: Arc<AtomicF32>, pub data_frequency: Arc<AtomicF32>,
pub single_frequency: Arc<Mutex<u32>> pub single_frequency: Arc<Mutex<u32>>
} }
@@ -146,6 +156,7 @@ impl App {
let phase_series = Arc::new(Mutex::new(TimeSeriesPlot::new())); let phase_series = Arc::new(Mutex::new(TimeSeriesPlot::new()));
let single_frequency = Arc::new(Mutex::new(50000)); let single_frequency = Arc::new(Mutex::new(50000));
let on = Arc::new(Mutex::new(true)); let on = Arc::new(Mutex::new(true));
let tab_active = TabActive::Single;
// Step 2: Now we can initialize tab_viewer // Step 2: Now we can initialize tab_viewer
let tab_viewer = TabViewer { let tab_viewer = TabViewer {
@@ -170,6 +181,7 @@ impl App {
phase_series, phase_series,
connected: Arc::new(AtomicBool::new(false)), connected: Arc::new(AtomicBool::new(false)),
on, on,
tab_active,
data_frequency: Arc::new(AtomicF32::new(0.0)), data_frequency: Arc::new(AtomicF32::new(0.0)),
single_frequency, single_frequency,
}; };
@@ -179,17 +191,22 @@ impl App {
} }
pub fn update_start_stop(&self) { pub fn update_start_stop(&self) {
match *self.on.lock().unwrap() { match (self.tab_active, *self.on.lock().unwrap()) {
true => { (TabActive::Single, true) => {
if let Err(e) = self.run_impedancemeter_tx.try_send(SingleFrequencySignal::Start(*self.single_frequency.lock().unwrap())) { if let Err(e) = self.run_impedancemeter_tx.try_send(SingleFrequencySignal::Start(*self.single_frequency.lock().unwrap())) {
eprintln!("Failed to send start command: {:?}", e); eprintln!("Failed to send start command: {:?}", e);
} }
}, },
false => { (TabActive::Multi, true) => {
// For future use
info!("Multi frequency mode not implemented yet");
},
(_, false) => {
if let Err(e) = self.run_impedancemeter_tx.try_send(SingleFrequencySignal::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);
} }
}, },
(_, _) => {}
} }
} }
@@ -256,7 +273,39 @@ impl eframe::App for App {
.show_close_buttons(false) .show_close_buttons(false)
.show_inside(ui, &mut self.tab_viewer); .show_inside(ui, &mut self.tab_viewer);
}); });
// Do something when a tab is changed
if let Some((_, tab)) = self.tree.find_active_focused() {
match tab.as_str() {
"Single" => {
if self.tab_active != TabActive::Single {
self.tab_active = TabActive::Single;
*self.on.lock().unwrap() = false;
self.update_start_stop();
info!("Switched to Single tab");
}
}
"Multi" => {
if self.tab_active != TabActive::Multi {
self.tab_active = TabActive::Multi;
*self.on.lock().unwrap() = false;
self.update_start_stop();
info!("Switched to Multi tab");
}
}
"Shortcuts" => {
// if self.tab_active != TabActive::Shortcuts {
// self.tab_active = TabActive::Shortcuts;
// *self.on.lock().unwrap() = false;
// self.update_start_stop();
// info!("Switched to Shortcuts tab");
// }
}
_ => {
}
}
}
// CMD- or control-W to close window // CMD- or control-W to close window
if ctx.input(|i| i.modifiers.cmd_ctrl_matches(Modifiers::COMMAND)) if ctx.input(|i| i.modifiers.cmd_ctrl_matches(Modifiers::COMMAND))
&& ctx.input(|i| i.key_pressed(Key::W)) && ctx.input(|i| i.key_pressed(Key::W))