summaryrefslogtreecommitdiffstats
path: root/src/testbench.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/testbench.rs')
-rw-r--r--src/testbench.rs162
1 files changed, 140 insertions, 22 deletions
diff --git a/src/testbench.rs b/src/testbench.rs
index 6d9ea16..5dd18fd 100644
--- a/src/testbench.rs
+++ b/src/testbench.rs
@@ -1,11 +1,15 @@
+use std::collections::HashMap;
use std::ffi::OsStr;
use std::fs;
use std::io;
use std::option::Option;
-use std::path::{Path, PathBuf};
+use std::path::PathBuf;
use imgui;
use rlua::Lua;
+// use serialport;
+
+use crate::rusbtmc;
#[derive(Default, PartialEq)]
pub struct Test {
@@ -29,21 +33,28 @@ impl Test {
return self.text.as_ref().unwrap();
}
- pub fn text(&self) -> &str {
- return match &self.text {
- Some(text) => text,
- None => "",
- }
- }
+ // pub fn text(&self) -> &str {
+ // return match &self.text {
+ // Some(text) => text,
+ // None => "",
+ // }
+ // }
}
#[derive(Default)]
pub struct Bench {
+ // tests window
lua: Lua,
tests: Vec<Test>,
tests_path: PathBuf,
selected_test: Option<usize>,
- console: Vec<imgui::ImString>,
+ selected_usb_dev: Option<usize>,
+ usb_devices: HashMap<imgui::ImString, rusbtmc::Instrument<rusb::GlobalContext>>,
+ selected_serial_dev: Option<usize>,
+ // serial_devices: Vec<?>
+ lua_console: Vec<imgui::ImString>,
+ instr_console: Vec<imgui::ImString>,
+ instr_input: imgui::ImString,
}
impl Bench {
@@ -56,7 +67,9 @@ impl Bench {
let globals = context.globals();
let ui_table = context.create_table()?;
- let ui_print = context.create_function(|_, strings: Variadic<String>| {
+ let ui_print = context.create_function(|_, _strings: Variadic<String>| {
+ // TODO
+ // lua_console.push()
Ok(())
})?;
@@ -66,25 +79,31 @@ impl Bench {
Ok(())
});
- // TODO: handle errors
- // if let Err(e) = lua_setup {}
+ if let Err(_) = lua_setup {
+ // TODO: handle errors
+ }
let mut b = Bench {
lua: lua,
tests: Vec::new(),
tests_path: PathBuf::from("lua"),
selected_test: None,
- console: Vec::new(),
+ selected_usb_dev: None,
+ usb_devices: HashMap::new(),
+ selected_serial_dev: None,
+ lua_console: Vec::new(),
+ instr_console: Vec::new(),
+ instr_input: imgui::ImString::with_capacity(256),
+ // scope: None,
};
// TODO: set graphically and use RV
- b.load_tests();
+ let _ = b.load_tests();
return b;
}
- pub fn load_tests(&mut self) -> io::Result<()>
- {
+ pub fn load_tests(&mut self) -> io::Result<()> {
let entries: Result<Vec<PathBuf>, io::Error> = fs::read_dir(&self.tests_path)?
.into_iter()
.map(|r| r.map(|f| f.path()))
@@ -108,11 +127,12 @@ impl Bench {
pub fn draw(&mut self, _: &mut bool, ui: &mut imgui::Ui) {
use imgui::*;
- let win = Window::new(im_str!("Testbench"))
+ /* Testbench window */
+ let tb_win = Window::new(im_str!("Testbench"))
.size([400., 500.], Condition::Appearing)
.position([20., 20.], Condition::Appearing);
- win.build(&ui, || {
+ tb_win.build(&ui, || {
for (index, test) in self.tests.iter().enumerate() {
if let Some(test_name) = test.path.to_str() {
let test_name: ImString = test_name.to_string().into();
@@ -124,8 +144,8 @@ impl Bench {
}
}
- ui.separator();
if let Some(index) = self.selected_test {
+ ui.separator();
if let Some(test_name) = self.tests[index].path.to_str() {
let imstr: ImString =
format!("Selected Test: {}", test_name).to_string().into();
@@ -143,11 +163,107 @@ impl Bench {
}
ui.separator();
- ChildWindow::new("console")
+ ChildWindow::new("lua console")
+ .size([0., 0.])
+ .scrollable(true)
+ .build(&ui, || {
+ for line in &self.lua_console {
+ ui.text(line);
+ }
+ });
+ });
+
+ /* devices window */
+ let dev_win = Window::new(im_str!("Devices"))
+ .size([400., 500.], Condition::Appearing)
+ .position([520., 20.], Condition::Appearing);
+
+ dev_win.build(&ui, || {
+ // usb devices
+ ui.text_wrapped(im_str!("USB Devices"));
+ ui.same_line(0.);
+ if ui.button(im_str!("Refresh"), [0., 0.]) {
+ // TODO: do not remove open devices
+ self.usb_devices.clear();
+ self.selected_usb_dev = None;
+
+ if let Ok(instruments) = rusbtmc::instruments() {
+ for instr in instruments {
+ let desc = match instr.device.device_descriptor() {
+ Ok(desc) => desc,
+ Err(_) => {
+ dbg!("failed to get descriptor");
+ continue;
+ }
+ };
+
+ let handle = match instr.device.open() {
+ Ok(handle) => handle,
+ Err(_) => {
+ // dbg!("failed to get handle");
+ continue;
+ }
+ };
+
+ let prodstr = match handle.read_product_string_ascii(&desc) {
+ Ok(s) => s,
+ Err(_) => {
+ dbg!("failed to read product string");
+ continue;
+ }
+ };
+
+ let dev_name: ImString = prodstr.into();
+ self.usb_devices.insert(dev_name, instr);
+ }
+ }
+ }
+
+ if self.selected_usb_dev.is_some() {
+ // search dev
+ let mut instr = None;
+ for (index, (_name, dev)) in self.usb_devices.iter_mut().enumerate() {
+ if matches!(self.selected_usb_dev, Some(i) if i == index) {
+ instr = Some(dev);
+ break;
+ }
+ }
+
+ if let Some(instr) = instr {
+ ui.same_line(0.);
+ if ui.button(im_str!("Open"), [0., 0.]) {
+ let _ = dbg!(instr.open());
+ }
+
+ ui.same_line(0.);
+ if ui.button(im_str!("Close"), [0., 0.]) {
+ let _ = dbg!(instr.close());
+ }
+
+ ui.same_line(0.);
+ if ui.button(im_str!("Pulse"), [0., 0.]) {
+ let _ = dbg!(instr.pulse());
+ }
+ }
+ }
+
+ for (index, (name, _dev)) in self.usb_devices.iter().enumerate() {
+ let selected = matches!(self.selected_usb_dev, Some(i) if i == index);
+
+ if Selectable::new(&name).selected(selected).build(ui) {
+ self.selected_usb_dev = Some(index);
+ }
+
+ ui.same_line(0.);
+ }
+
+ ui.separator();
+ ui.input_text(im_str!("Device"), &mut self.instr_input).build();
+ ChildWindow::new("instrument console")
.size([0., 0.])
.scrollable(true)
.build(&ui, || {
- for line in &self.console {
+ for line in &self.instr_console {
ui.text(line);
}
});
@@ -176,9 +292,11 @@ impl Bench {
},
);
- self.console.push(output);
+ self.lua_console.push(output);
}
}
- fn show_test(&self, index: usize) {}
+ fn show_test(&self, _index: usize) {
+ // TODO
+ }
}