use rs_teststand::{
AdapterKeyName, Engine, Error, GetTemplatesFileOptions, PropertyOptions, RunMode, Step,
StepGroup,
};
const VI_PATH: &str = "TS.SData.ViCall.VIPath";
const COPIES: i32 = 2;
fn describe_templates(engine: &Engine) -> Result<(), Error> {
let templates_file = engine.get_templates_file(GetTemplatesFileOptions::LOAD_IF_NOT_LOADED)?;
let root = templates_file
.data()?
.get_property_object("Root", PropertyOptions::NONE.bits())?;
for index in 0..root.get_num_elements()? {
let category = root.get_property_object_by_offset(index, PropertyOptions::NONE.bits())?;
if category.name()? == "Steps" {
println!(
"Step templates defined on this station: {}",
category.get_num_elements()?
);
}
}
Ok(())
}
fn build_prototype(engine: &Engine) -> Result<Step, Error> {
let step = engine.new_step(AdapterKeyName::LabView.as_str(), "Action")?;
step.set_name("Measure (VI)")?;
step.set_run_mode(RunMode::Normal)?;
step.as_property_object()?.set_val_string(
VI_PATH,
PropertyOptions::INSERT_IF_MISSING.bits(),
r"example.lvlibp\measure.vi",
)?;
Ok(step)
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let engine = Engine::new()?;
describe_templates(&engine)?;
let prototype = build_prototype(&engine)?;
println!(
"Prototype: {} via {:?}, run mode {:?}",
prototype.name()?,
prototype.adapter_key_name()?,
prototype.run_mode()?
);
let sequence_file = engine.new_sequence_file()?;
let main_sequence = sequence_file.get_sequence_by_name("MainSequence")?;
let template = prototype.as_property_object()?;
for copy_number in 1..=COPIES {
let index = main_sequence.get_num_steps(StepGroup::Main)?;
let inserted =
main_sequence.insert_step_from_template(&template, index, StepGroup::Main)?;
inserted.set_name(&format!("Measure {copy_number} (from template)"))?;
inserted.create_new_unique_step_id()?;
}
println!(
"\nMainSequence now holds {} step(s):",
main_sequence.get_num_steps(StepGroup::Main)?
);
for index in 0..main_sequence.get_num_steps(StepGroup::Main)? {
let step = main_sequence.get_step(index, StepGroup::Main)?;
println!(
" [{index}] {} -> {}",
step.name()?,
step.as_property_object()?
.get_val_string(VI_PATH, PropertyOptions::NONE.bits())?
);
}
println!("\nPrototype still named: {}", prototype.name()?);
let path = std::env::temp_dir().join("rs_teststand_from_template.seq");
let path = path.to_string_lossy().into_owned();
sequence_file.save(&path)?;
println!("Saved to {path}");
Ok(())
}