|
1 | 1 | use crate::{ |
2 | | - clock::{Clock, ClockServer, NEVER, SyncTime}, |
3 | | - device_map::DeviceMap, |
4 | | - log_println, |
5 | | - protocol::TimedMessage, |
6 | | - scene::Scene, |
7 | | - schedule::{playback::PlaybackManager, scheduler_actions::ActionProcessor}, |
8 | | - vm::{LanguageCenter, PartialContext, variable::VariableStore}, |
9 | | - world::ACTIVE_WAITING_SWITCH_MICROS, |
| 2 | + clock::{Clock, ClockServer, NEVER, SyncTime}, device_map::DeviceMap, error::ErrorQueue, log_println, protocol::TimedMessage, scene::Scene, schedule::{playback::PlaybackManager, scheduler_actions::ActionProcessor}, vm::{LanguageCenter, PartialContext, variable::VariableStore}, world::ACTIVE_WAITING_SWITCH_MICROS |
10 | 3 | }; |
11 | 4 |
|
12 | 5 | use crossbeam_channel::{self, Receiver, RecvTimeoutError, Sender, TryRecvError}; |
@@ -43,6 +36,8 @@ pub struct Scheduler { |
43 | 36 | playback_manager: PlaybackManager, |
44 | 37 | shutdown_requested: bool, |
45 | 38 |
|
| 39 | + error_queue: ErrorQueue, |
| 40 | + |
46 | 41 | scene_structure: Vec<Vec<f64>>, |
47 | 42 | } |
48 | 43 |
|
@@ -102,6 +97,7 @@ impl Scheduler { |
102 | 97 | playback_manager: PlaybackManager::default(), |
103 | 98 | shutdown_requested: false, |
104 | 99 | scene_structure: Vec::new(), |
| 100 | + error_queue: Default::default() |
105 | 101 | } |
106 | 102 | } |
107 | 103 |
|
@@ -232,6 +228,7 @@ impl Scheduler { |
232 | 228 | partial.clock = Some(&self.clock); |
233 | 229 | partial.device_map = Some(&self.devices); |
234 | 230 | partial.structure = Some(&self.scene_structure); |
| 231 | + partial.errors = Some(&self.error_queue); |
235 | 232 | let (events, wait) = self.scene.update_executions(partial); |
236 | 233 | for event in events { |
237 | 234 | for msg in self.devices.map_event(event, date, &self.clock) { |
@@ -306,6 +303,10 @@ impl Scheduler { |
306 | 303 |
|
307 | 304 | let next_exec_delay = self.process_executions(date); |
308 | 305 |
|
| 306 | + while let Some(error) = self.error_queue.poll() { |
| 307 | + let _ = self.update_notifier.send(SovaNotification::Error(error)); |
| 308 | + } |
| 309 | + |
309 | 310 | // Check if global variables changed and send notification |
310 | 311 | let one_letter_vars: VariableStore = self.scene.vars.one_letter_vars().collect(); |
311 | 312 | if one_letter_vars != one_letters_before { |
|
0 commit comments