-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmod.rs
More file actions
77 lines (70 loc) · 2.79 KB
/
Copy pathmod.rs
File metadata and controls
77 lines (70 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! Code for managing and running sequences.
mod sequence_builder;
mod sequence_definition;
mod sequence_runner;
mod sequence_validation;
use std::path::Path;
use crate::{
events,
sequence::{
sequence_definition::Sequence,
sequence_runner::{SequenceCmd, SequenceRunner},
},
};
pub fn spawn_sequence_runner_thread<'scope>(
event_dispatcher: &'scope events::EventDispatcher,
scope: &'scope std::thread::Scope<'scope, '_>,
) {
scope.spawn(move || {
let (tx, rx) = std::sync::mpsc::channel::<events::Event>();
event_dispatcher.subscribe(tx, "Sequence Runner thread");
let mut sequence_runner = SequenceRunner::new(event_dispatcher, scope);
while let Ok(event) = rx.recv() {
match event {
events::Event::Shutdown => {
sequence_runner.control_sequence(SequenceCmd::Shutdown);
break;
}
events::Event::StartSequence {
seq_name,
abort_seq_name,
} => {
// TODO: replace with loading sequences from the frontend
let seq_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("sequences");
let seq = Sequence::load_from_path(&seq_dir.join(&seq_name));
let abort_seq = Sequence::load_from_path(&seq_dir.join(&abort_seq_name));
let seq = match seq {
Ok(seq) => seq,
Err(err) => {
eprintln!("Error while loading sequence '{seq_name}': {err:#}");
continue;
}
};
let abort_seq = match abort_seq {
Ok(abort_seq) => abort_seq,
Err(err) => {
eprintln!(
"Error while loading abort sequence '{abort_seq_name}': {err:#}"
);
continue;
}
};
let result = sequence_runner.run_sequence(seq, abort_seq);
if let Err(err) = result {
eprintln!("Error while running sequence: {err:#}");
}
}
events::Event::PauseSequence => {
sequence_runner.control_sequence(SequenceCmd::Pause)
}
events::Event::ResumeSequence => {
sequence_runner.control_sequence(SequenceCmd::Resume)
}
events::Event::AbortSequence => {
sequence_runner.control_sequence(SequenceCmd::Abort)
}
_ => continue,
};
}
});
}