ui_messages_handle/
ui_messages_handle.rs1use std::time::{Duration, Instant};
12
13use rs_teststand::{Engine, Sequence, StepGroup, UIMessageCode};
14
15const INSERT_IF_MISSING: i32 = 1;
16const NO_OPTIONS: i32 = 0;
17const NO_ADAPTER: &str = "";
18
19const STAGE_MESSAGE: i32 = UIMessageCode::USER_MESSAGE_BASE + 1;
20const PROGRESS_MESSAGE: i32 = UIMessageCode::USER_MESSAGE_BASE + 2;
21
22fn add_statement(
23 engine: &Engine,
24 sequence: &Sequence,
25 name: &str,
26 expression: &str,
27) -> Result<(), rs_teststand::Error> {
28 let step = engine.new_step(NO_ADAPTER, "Statement")?;
29 step.set_name(name)?;
30 step.as_property_object()?
31 .set_val_string("TS.PostExpr", INSERT_IF_MISSING, expression)?;
32 sequence.insert_step(
33 &step,
34 sequence.get_num_steps(StepGroup::Main)?,
35 StepGroup::Main,
36 )?;
37 Ok(())
38}
39
40fn main() -> Result<(), Box<dyn std::error::Error>> {
41 let engine = Engine::new()?;
42
43 engine.set_ui_message_polling_enabled(true)?;
45
46 let sequence_file = engine.new_sequence_file()?;
47 let main_sequence = sequence_file.get_sequence_by_name("MainSequence")?;
48
49 add_statement(
52 &engine,
53 &main_sequence,
54 "Report Stage",
55 &format!(
56 "RunState.Engine.PostUIMessage(RunState.Execution, RunState.Thread, {STAGE_MESSAGE}, \
57 1, \"stage: configuring instruments\", Nothing, True)"
58 ),
59 )?;
60 add_statement(
62 &engine,
63 &main_sequence,
64 "Report Progress",
65 &format!(
66 "RunState.Thread.PostUIMessageEx({PROGRESS_MESSAGE}, 50, \"progress: halfway\", \
67 Nothing, False)"
68 ),
69 )?;
70
71 let execution = engine.new_execution(&sequence_file, "MainSequence", None, false, 0)?;
72 println!(
73 "Execution {} started; polling for messages...",
74 execution.id()?
75 );
76
77 let started = Instant::now();
81 let mut ended = false;
82 while started.elapsed() < Duration::from_secs(60) && !ended {
83 while !engine.is_ui_message_queue_empty()? {
84 let message = engine.get_ui_message()?;
85 let code = message.event()?;
86 if matches!(
87 UIMessageCode::from_bits(code),
88 Ok(UIMessageCode::EndExecution)
89 ) {
90 ended = true;
91 }
92 let origin = if UIMessageCode::is_user_message(code) {
93 "sequence".to_owned()
94 } else {
95 format!("engine {:?}", UIMessageCode::from_bits(code))
96 };
97 println!(
98 " [{origin}] code={code} numeric={} string={:?} synchronous={}",
99 message.numeric_data()?,
100 message.string_data()?,
101 message.is_synchronous()?
102 );
103 message.acknowledge()?;
105 }
106 }
107
108 println!("\nExecution ended: {ended}");
109 engine.release_sequence_file_ex(sequence_file, NO_OPTIONS)?;
110 Ok(())
111}