use rs_teststand::{Engine, Sequence, Step, StepGroup};
const INSERT_IF_MISSING: i32 = 1;
const NO_OPTIONS: i32 = 0;
const NO_ADAPTER: &str = "";
fn numeric_limit_test(
engine: &Engine,
name: &str,
precondition: &str,
low: f64,
high: f64,
) -> Result<Step, rs_teststand::Error> {
let step = engine.new_step(NO_ADAPTER, "NumericLimitTest")?;
step.set_name(name)?;
step.set_precondition(precondition)?;
step.set_record_result(true)?;
let properties = step.as_property_object()?;
properties.set_val_number("Limits.High", INSERT_IF_MISSING, high)?;
properties.set_val_number("Limits.Low", INSERT_IF_MISSING, low)?;
Ok(step)
}
fn describe(sequence: &Sequence) -> Result<(), rs_teststand::Error> {
let count = sequence.get_num_steps(StepGroup::Main)?;
println!("{} holds {count} step(s) in Main:", sequence.name()?);
for index in 0..count {
let step = sequence.get_step(index, StepGroup::Main)?;
let properties = step.as_property_object()?;
println!(" [{index}] {}", step.name()?);
if properties.exists("Limits.Low", NO_OPTIONS)? {
println!(
" limits: low={}, high={}",
properties.get_val_number("Limits.Low", NO_OPTIONS)?,
properties.get_val_number("Limits.High", NO_OPTIONS)?
);
}
let precondition = step.precondition()?;
if !precondition.is_empty() {
println!(" runs when: {precondition}");
}
}
Ok(())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let engine = Engine::new()?;
let sequence_file = engine.new_sequence_file()?;
let main_sequence = sequence_file.get_sequence_by_name("MainSequence")?;
main_sequence.insert_step(
&numeric_limit_test(
&engine,
"Temperature Check",
"Locals.TempSensorPresent == True",
15.0,
85.0,
)?,
0,
StepGroup::Main,
)?;
main_sequence.insert_step(
&numeric_limit_test(
&engine,
"Voltage Monitor",
"Locals.DUTPowered == True",
4.75,
5.25,
)?,
1,
StepGroup::Main,
)?;
let subsequence = engine.new_sequence()?;
subsequence.set_name("CustomSubsequence")?;
sequence_file.insert_sequence(&subsequence)?;
let init_step = engine.new_step(NO_ADAPTER, "Action")?;
init_step.set_name("Initialize Hardware")?;
subsequence.insert_step(&init_step, 0, StepGroup::Main)?;
describe(&main_sequence)?;
println!();
describe(&subsequence)?;
println!(
"\nGroup sizes in MainSequence: setup={}, main={}, cleanup={}",
main_sequence.get_num_steps(StepGroup::Setup)?,
main_sequence.get_num_steps(StepGroup::Main)?,
main_sequence.get_num_steps(StepGroup::Cleanup)?
);
let path = std::env::temp_dir().join("rs_teststand_built_sequence.seq");
sequence_file.save(&path.to_string_lossy())?;
println!("\nSaved to {}", path.display());
engine.release_sequence_file_ex(sequence_file, NO_OPTIONS)?;
Ok(())
}