From 4a6ddf107064c8b80b64346c15ae86f11e2fb0b7 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Wed, 7 Apr 2021 13:13:32 +0200 Subject: Delete demo lua console, start usbtmc driver --- src/testbench.rs | 162 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 140 insertions(+), 22 deletions(-) (limited to 'src/testbench.rs') 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, tests_path: PathBuf, selected_test: Option, - console: Vec, + selected_usb_dev: Option, + usb_devices: HashMap>, + selected_serial_dev: Option, + // serial_devices: Vec + lua_console: Vec, + instr_console: Vec, + 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| { + let ui_print = context.create_function(|_, _strings: Variadic| { + // 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, 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 + } } -- cgit v1.2.1