xref: /DragonReach/src/unit/timer/mod.rs (revision 2069cc0dc0984a2981454b00316ba607f88ac512)
1*2069cc0dSBrahmaMantra use super::{BaseUnit, Unit};
2*2069cc0dSBrahmaMantra use crate::error::parse_error::{ParseError, ParseErrorType};
3*2069cc0dSBrahmaMantra use crate::error::runtime_error::{RuntimeError, RuntimeErrorType};
4*2069cc0dSBrahmaMantra use crate::executor::Executor;
5*2069cc0dSBrahmaMantra use crate::manager::timer_manager::TimerManager;
6*2069cc0dSBrahmaMantra use crate::manager::UnitManager;
7*2069cc0dSBrahmaMantra use crate::parse::parse_timer::TimerParser;
8*2069cc0dSBrahmaMantra use crate::parse::{Segment, TIMER_UNIT_ATTR_TABLE};
9*2069cc0dSBrahmaMantra use crate::time::calandar::CalendarStandard;
10*2069cc0dSBrahmaMantra use crate::unit::UnitState;
11*2069cc0dSBrahmaMantra use humantime::parse_duration;
12*2069cc0dSBrahmaMantra use std::fmt::Debug;
13*2069cc0dSBrahmaMantra use std::sync::{Arc, Mutex};
14*2069cc0dSBrahmaMantra use std::time::{Duration, Instant};
15909e4d10SGnoCiYeH 
16909e4d10SGnoCiYeH #[allow(dead_code)]
17*2069cc0dSBrahmaMantra #[derive(Clone, Debug)]
18909e4d10SGnoCiYeH pub struct TimerUnit {
19909e4d10SGnoCiYeH     unit_base: BaseUnit,
20909e4d10SGnoCiYeH     timer_part: TimerPart,
21909e4d10SGnoCiYeH }
22909e4d10SGnoCiYeH 
23*2069cc0dSBrahmaMantra impl Default for TimerUnit {
default() -> Self24*2069cc0dSBrahmaMantra     fn default() -> Self {
25*2069cc0dSBrahmaMantra         Self {
26*2069cc0dSBrahmaMantra             unit_base: Default::default(),
27*2069cc0dSBrahmaMantra             timer_part: Default::default(),
28*2069cc0dSBrahmaMantra         }
29*2069cc0dSBrahmaMantra     }
30909e4d10SGnoCiYeH }
31909e4d10SGnoCiYeH 
32*2069cc0dSBrahmaMantra impl Unit for TimerUnit {
33*2069cc0dSBrahmaMantra     /// 初始化计时器单元
init(&mut self)34*2069cc0dSBrahmaMantra     fn init(&mut self) {
35*2069cc0dSBrahmaMantra         // 将单元状态设置为激活中
36*2069cc0dSBrahmaMantra         self.unit_base.state = UnitState::Activating;
37*2069cc0dSBrahmaMantra         // 更新计时器部分的数据
38*2069cc0dSBrahmaMantra 
39*2069cc0dSBrahmaMantra         // 设置初始触发时间
40*2069cc0dSBrahmaMantra         let part = &mut self.timer_part;
41*2069cc0dSBrahmaMantra         let now = Instant::now();
42*2069cc0dSBrahmaMantra         part.last_trigger = now;
43*2069cc0dSBrahmaMantra         part.now_time = now;
44*2069cc0dSBrahmaMantra 
45*2069cc0dSBrahmaMantra         // 如果设置了激活时的秒数,则添加一个计时器值
46*2069cc0dSBrahmaMantra         if part.on_active_sec != Default::default() {
47*2069cc0dSBrahmaMantra             part.value.push(TimerVal::new(
48*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnActiveSec,
49*2069cc0dSBrahmaMantra                 false,
50*2069cc0dSBrahmaMantra                 part.on_active_sec,
51*2069cc0dSBrahmaMantra                 Default::default(),
52*2069cc0dSBrahmaMantra                 Some(now + part.on_active_sec),
53*2069cc0dSBrahmaMantra             ));
54*2069cc0dSBrahmaMantra         }
55*2069cc0dSBrahmaMantra 
56*2069cc0dSBrahmaMantra         // 实现OnActiveSec的具体逻辑
57*2069cc0dSBrahmaMantra 
58*2069cc0dSBrahmaMantra         // 检查单元是否正在运行
59*2069cc0dSBrahmaMantra         let unit_is_running = UnitManager::is_running_unit(&part.unit);
60*2069cc0dSBrahmaMantra 
61*2069cc0dSBrahmaMantra         if part.on_unit_active_sec != Default::default() {
62*2069cc0dSBrahmaMantra             let next_trigger = if unit_is_running {
63*2069cc0dSBrahmaMantra                 Some(now + part.on_unit_active_sec)
64*2069cc0dSBrahmaMantra             } else {
65*2069cc0dSBrahmaMantra                 None
66*2069cc0dSBrahmaMantra             };
67*2069cc0dSBrahmaMantra             part.value.push(TimerVal::new(
68*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnUnitActiveSec,
69*2069cc0dSBrahmaMantra                 !unit_is_running,
70*2069cc0dSBrahmaMantra                 part.on_unit_active_sec,
71*2069cc0dSBrahmaMantra                 Default::default(),
72*2069cc0dSBrahmaMantra                 next_trigger,
73*2069cc0dSBrahmaMantra             ));
74*2069cc0dSBrahmaMantra         }
75*2069cc0dSBrahmaMantra 
76*2069cc0dSBrahmaMantra         // 实现OnUnitActiveSec的具体逻辑
77*2069cc0dSBrahmaMantra 
78*2069cc0dSBrahmaMantra         if part.on_unit_inactive_sec != Default::default() {
79*2069cc0dSBrahmaMantra             part.value.push(TimerVal::new(
80*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnUnitInactiveSec,
81*2069cc0dSBrahmaMantra                 true,
82*2069cc0dSBrahmaMantra                 part.on_unit_inactive_sec,
83*2069cc0dSBrahmaMantra                 Default::default(),
84*2069cc0dSBrahmaMantra                 None, /*无论服务是否在运行,这里都不会有值 */
85*2069cc0dSBrahmaMantra             ));
86*2069cc0dSBrahmaMantra         }
87*2069cc0dSBrahmaMantra 
88*2069cc0dSBrahmaMantra         // 实现OnUnitInactiveSec的具体逻辑
89*2069cc0dSBrahmaMantra         part.update_next_trigger();
90*2069cc0dSBrahmaMantra         self._init();
91*2069cc0dSBrahmaMantra         // 将单元状态设置为激活
92*2069cc0dSBrahmaMantra         self.unit_base.state = UnitState::Active;
93*2069cc0dSBrahmaMantra     }
94*2069cc0dSBrahmaMantra     /// 设置单元的名称
set_unit_name(&mut self, name: String)95*2069cc0dSBrahmaMantra     fn set_unit_name(&mut self, name: String) {
96*2069cc0dSBrahmaMantra         self.unit_base_mut().unit_name = name;
97*2069cc0dSBrahmaMantra     }
98*2069cc0dSBrahmaMantra     /// 重启单元
restart(&mut self) -> Result<(), RuntimeError>99*2069cc0dSBrahmaMantra     fn restart(&mut self) -> Result<(), RuntimeError> {
100*2069cc0dSBrahmaMantra         self.exit();
101*2069cc0dSBrahmaMantra         self.init();
102*2069cc0dSBrahmaMantra         Ok(())
103*2069cc0dSBrahmaMantra     }
104*2069cc0dSBrahmaMantra     /// 从给定的路径解析并创建计时器单元
from_path(path: &str) -> Result<usize, ParseError> where Self: Sized,105*2069cc0dSBrahmaMantra     fn from_path(path: &str) -> Result<usize, ParseError>
106*2069cc0dSBrahmaMantra     where
107*2069cc0dSBrahmaMantra         Self: Sized,
108*2069cc0dSBrahmaMantra     {
109*2069cc0dSBrahmaMantra         TimerParser::parse(path)
110*2069cc0dSBrahmaMantra     }
111*2069cc0dSBrahmaMantra     /// 将计时器单元转换为任何类型,用于多态调用
as_any(&self) -> &dyn std::any::Any112*2069cc0dSBrahmaMantra     fn as_any(&self) -> &dyn std::any::Any {
113*2069cc0dSBrahmaMantra         self
114*2069cc0dSBrahmaMantra     }
115*2069cc0dSBrahmaMantra     /// 将计时器单元转换为任何可变类型,用于多态调用
as_mut_any(&mut self) -> &mut dyn std::any::Any116*2069cc0dSBrahmaMantra     fn as_mut_any(&mut self) -> &mut dyn std::any::Any {
117*2069cc0dSBrahmaMantra         self
118*2069cc0dSBrahmaMantra     }
119*2069cc0dSBrahmaMantra     /// 设置计时器单元的属性
set_attr(&mut self, segment: Segment, attr: &str, val: &str) -> Result<(), ParseError>120*2069cc0dSBrahmaMantra     fn set_attr(&mut self, segment: Segment, attr: &str, val: &str) -> Result<(), ParseError> {
121*2069cc0dSBrahmaMantra         if segment != Segment::Timer {
122*2069cc0dSBrahmaMantra             // 如果段不是计时器段,则返回错误
123*2069cc0dSBrahmaMantra             return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
124*2069cc0dSBrahmaMantra         }
125*2069cc0dSBrahmaMantra         if let Some(attr_type) = TIMER_UNIT_ATTR_TABLE.get(attr) {
126*2069cc0dSBrahmaMantra             return self.timer_part.set_attr(attr_type, val);
127*2069cc0dSBrahmaMantra         }
128*2069cc0dSBrahmaMantra         Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0))
129*2069cc0dSBrahmaMantra     }
130*2069cc0dSBrahmaMantra     /// 设置单元的基础信息
set_unit_base(&mut self, unit_base: BaseUnit)131*2069cc0dSBrahmaMantra     fn set_unit_base(&mut self, unit_base: BaseUnit) {
132*2069cc0dSBrahmaMantra         self.unit_base = unit_base;
133*2069cc0dSBrahmaMantra     }
134*2069cc0dSBrahmaMantra     /// 返回单元的类型
unit_type(&self) -> super::UnitType135*2069cc0dSBrahmaMantra     fn unit_type(&self) -> super::UnitType {
136*2069cc0dSBrahmaMantra         self.unit_base.unit_type
137*2069cc0dSBrahmaMantra     }
138*2069cc0dSBrahmaMantra     /// 返回单元的基础信息
unit_base(&self) -> &BaseUnit139*2069cc0dSBrahmaMantra     fn unit_base(&self) -> &BaseUnit {
140*2069cc0dSBrahmaMantra         &self.unit_base
141*2069cc0dSBrahmaMantra     }
142*2069cc0dSBrahmaMantra     /// 返回单元的基础信息的可变引用
unit_base_mut(&mut self) -> &mut BaseUnit143*2069cc0dSBrahmaMantra     fn unit_base_mut(&mut self) -> &mut BaseUnit {
144*2069cc0dSBrahmaMantra         &mut self.unit_base
145*2069cc0dSBrahmaMantra     }
146*2069cc0dSBrahmaMantra     /// 返回单元的ID
unit_id(&self) -> usize147*2069cc0dSBrahmaMantra     fn unit_id(&self) -> usize {
148*2069cc0dSBrahmaMantra         self.unit_base.unit_id
149*2069cc0dSBrahmaMantra     }
150*2069cc0dSBrahmaMantra 
run(&mut self) -> Result<(), RuntimeError>151*2069cc0dSBrahmaMantra     fn run(&mut self) -> Result<(), RuntimeError> {
152*2069cc0dSBrahmaMantra         //真正的run在_run中
153*2069cc0dSBrahmaMantra         if self.check() && UnitManager::contains_id(&self.timer_part.unit) {
154*2069cc0dSBrahmaMantra             // 如果单元检查通过并且单元管理器包含该单元,则运行
155*2069cc0dSBrahmaMantra             let _ = self._run(); // 运行单元
156*2069cc0dSBrahmaMantra             let id = self.get_parent_unit();
157*2069cc0dSBrahmaMantra             // 更新下一个触发器
158*2069cc0dSBrahmaMantra             TimerManager::update_next_trigger(id, true);
159*2069cc0dSBrahmaMantra         } else if !UnitManager::contains_id(&self.timer_part.unit) {
160*2069cc0dSBrahmaMantra             // 如果单元管理器不包含该单元,则打印错误信息
161*2069cc0dSBrahmaMantra             println!("task error,unit does not exist")
162*2069cc0dSBrahmaMantra         };
163*2069cc0dSBrahmaMantra         Ok(())
164*2069cc0dSBrahmaMantra     }
165*2069cc0dSBrahmaMantra 
exit(&mut self)166*2069cc0dSBrahmaMantra     fn exit(&mut self) {
167*2069cc0dSBrahmaMantra         UnitManager::try_kill_running(self.unit_id());
168*2069cc0dSBrahmaMantra     }
169*2069cc0dSBrahmaMantra }
170*2069cc0dSBrahmaMantra 
171*2069cc0dSBrahmaMantra impl TimerUnit {
_run(&mut self) -> Result<(), RuntimeError>172*2069cc0dSBrahmaMantra     pub fn _run(&mut self) -> Result<(), RuntimeError> {
173*2069cc0dSBrahmaMantra         //到这里触发计时器对应的服务
174*2069cc0dSBrahmaMantra         let part = &mut self.timer_part;
175*2069cc0dSBrahmaMantra         if part.value.is_empty() {
176*2069cc0dSBrahmaMantra             //触发次数已尽
177*2069cc0dSBrahmaMantra             self.unit_base.state = UnitState::Inactive;
178*2069cc0dSBrahmaMantra         } else if matches!(
179*2069cc0dSBrahmaMantra             part.value[0].attr,
180*2069cc0dSBrahmaMantra             TimerUnitAttr::OnActiveSec | TimerUnitAttr::OnBootSec | TimerUnitAttr::OnStartUpSec
181*2069cc0dSBrahmaMantra         ) {
182*2069cc0dSBrahmaMantra             part.value.remove(0); //消耗掉此次run时的TimeValue值
183*2069cc0dSBrahmaMantra         }
184*2069cc0dSBrahmaMantra 
185*2069cc0dSBrahmaMantra         if UnitManager::is_running_unit(&part.unit) {
186*2069cc0dSBrahmaMantra             //如果服务已经启动,则退出
187*2069cc0dSBrahmaMantra             return Ok(());
188*2069cc0dSBrahmaMantra         }
189*2069cc0dSBrahmaMantra 
190*2069cc0dSBrahmaMantra         //执行相应的unit单元
191*2069cc0dSBrahmaMantra         if let Ok(_) = Executor::exec(part.unit) {
192*2069cc0dSBrahmaMantra             self.unit_base.state = UnitState::Active;
193*2069cc0dSBrahmaMantra             part.last_trigger = Instant::now();
194*2069cc0dSBrahmaMantra             return Ok(());
195*2069cc0dSBrahmaMantra         } else {
196*2069cc0dSBrahmaMantra             self.unit_base.state = UnitState::Failed;
197*2069cc0dSBrahmaMantra             return Err(RuntimeError::new(RuntimeErrorType::ExecFailed));
198*2069cc0dSBrahmaMantra         }
199*2069cc0dSBrahmaMantra     }
_init(&self)200*2069cc0dSBrahmaMantra     fn _init(&self) {
201*2069cc0dSBrahmaMantra         let unit: Arc<Mutex<TimerUnit>> = Arc::new(Mutex::new(self.clone()));
202*2069cc0dSBrahmaMantra         TimerManager::push_timer_unit(unit);
203*2069cc0dSBrahmaMantra     }
204*2069cc0dSBrahmaMantra 
check(&mut self) -> bool205*2069cc0dSBrahmaMantra     pub fn check(&mut self) -> bool {
206*2069cc0dSBrahmaMantra         let part = &mut self.timer_part;
207*2069cc0dSBrahmaMantra         //计时器不可用
208*2069cc0dSBrahmaMantra         if part.value.len() == 0 {
209*2069cc0dSBrahmaMantra             //不可能再触发
210*2069cc0dSBrahmaMantra             self.unit_base.state = UnitState::Inactive;
211*2069cc0dSBrahmaMantra         }
212*2069cc0dSBrahmaMantra         if self.unit_base.state == UnitState::Inactive
213*2069cc0dSBrahmaMantra         //可能是手动停止
214*2069cc0dSBrahmaMantra         {
215*2069cc0dSBrahmaMantra             return false;
216*2069cc0dSBrahmaMantra         }
217*2069cc0dSBrahmaMantra         if UnitManager::is_running_unit(&part.unit)  //在运行就不管了
218*2069cc0dSBrahmaMantra         || part.next_elapse_monotonic_or_boottime==None
219*2069cc0dSBrahmaMantra         //下次触发时间无限大
220*2069cc0dSBrahmaMantra         {
221*2069cc0dSBrahmaMantra             return false;
222*2069cc0dSBrahmaMantra         }
223*2069cc0dSBrahmaMantra         part.now_time = Instant::now();
224*2069cc0dSBrahmaMantra 
225*2069cc0dSBrahmaMantra         if part.now_time >= part.next_elapse_monotonic_or_boottime.unwrap() {
226*2069cc0dSBrahmaMantra             //检查Timer管理的unit是否存在
227*2069cc0dSBrahmaMantra             if let Some(_) = UnitManager::get_unit_with_id(&part.unit) {
228*2069cc0dSBrahmaMantra                 return true;
229*2069cc0dSBrahmaMantra             }
230*2069cc0dSBrahmaMantra             println!("task error,unit does not exist");
231*2069cc0dSBrahmaMantra         }
232*2069cc0dSBrahmaMantra         return false;
233*2069cc0dSBrahmaMantra     }
234*2069cc0dSBrahmaMantra 
unit_base(&self) -> &BaseUnit235*2069cc0dSBrahmaMantra     pub fn unit_base(&self) -> &BaseUnit {
236*2069cc0dSBrahmaMantra         &self.unit_base
237*2069cc0dSBrahmaMantra     }
238*2069cc0dSBrahmaMantra 
timer_part(&self) -> &TimerPart239*2069cc0dSBrahmaMantra     pub fn timer_part(&self) -> &TimerPart {
240*2069cc0dSBrahmaMantra         &self.timer_part
241*2069cc0dSBrahmaMantra     }
242*2069cc0dSBrahmaMantra 
mut_timer_part(&mut self) -> &mut TimerPart243*2069cc0dSBrahmaMantra     pub fn mut_timer_part(&mut self) -> &mut TimerPart {
244*2069cc0dSBrahmaMantra         &mut self.timer_part
245*2069cc0dSBrahmaMantra     }
246*2069cc0dSBrahmaMantra 
get_parent_unit(&mut self) -> usize247*2069cc0dSBrahmaMantra     pub fn get_parent_unit(&mut self) -> usize {
248*2069cc0dSBrahmaMantra         self.timer_part().unit
249*2069cc0dSBrahmaMantra     }
250*2069cc0dSBrahmaMantra     ///判断计时器是否失效
enter_inactive(&mut self) -> bool251*2069cc0dSBrahmaMantra     pub fn enter_inactive(&mut self) -> bool {
252*2069cc0dSBrahmaMantra         if self.unit_base.state == UnitState::Inactive {
253*2069cc0dSBrahmaMantra             return true;
254*2069cc0dSBrahmaMantra         }
255*2069cc0dSBrahmaMantra         false
256*2069cc0dSBrahmaMantra     }
257*2069cc0dSBrahmaMantra 
258*2069cc0dSBrahmaMantra     ///在unit run或exit的时候改变TimerValue中OnUnitInactiveSec和OnUnitActiveSec的状态
change_stage(&mut self, flag: bool )259*2069cc0dSBrahmaMantra     pub fn change_stage(&mut self, flag: bool /*1为启动0为退出 */) {
260*2069cc0dSBrahmaMantra         for val in &mut self.timer_part.value {
261*2069cc0dSBrahmaMantra             match val.attr {
262*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnUnitActiveSec => {
263*2069cc0dSBrahmaMantra                     val.disabled = false;
264*2069cc0dSBrahmaMantra                     if flag {
265*2069cc0dSBrahmaMantra                         val.next_elapse = Some(Instant::now() + val.val);
266*2069cc0dSBrahmaMantra                     }
267*2069cc0dSBrahmaMantra                 }
268*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnUnitInactiveSec => {
269*2069cc0dSBrahmaMantra                     val.disabled = false;
270*2069cc0dSBrahmaMantra                     if !flag {
271*2069cc0dSBrahmaMantra                         val.next_elapse = Some(Instant::now() + val.val);
272*2069cc0dSBrahmaMantra                     }
273*2069cc0dSBrahmaMantra                 }
274*2069cc0dSBrahmaMantra                 _ => {}
275*2069cc0dSBrahmaMantra             }
276*2069cc0dSBrahmaMantra         }
277*2069cc0dSBrahmaMantra     }
278*2069cc0dSBrahmaMantra }
279*2069cc0dSBrahmaMantra unsafe impl Sync for TimerUnit {}
280*2069cc0dSBrahmaMantra 
281*2069cc0dSBrahmaMantra unsafe impl Send for TimerUnit {}
282*2069cc0dSBrahmaMantra #[allow(dead_code)]
283*2069cc0dSBrahmaMantra #[derive(Debug, Clone)]
284*2069cc0dSBrahmaMantra pub struct TimerPart {
285*2069cc0dSBrahmaMantra     //TODO! 因此时DragonReach未实现时间事件源的相关功能,目前还是循环确认Timer的情况
286*2069cc0dSBrahmaMantra     ///@brief 存储触发计时器的时间集合
287*2069cc0dSBrahmaMantra     value: Vec<TimerVal>,
288*2069cc0dSBrahmaMantra 
289*2069cc0dSBrahmaMantra     ///@brief 相对于该单元自身被启动的时间点
290*2069cc0dSBrahmaMantra     on_active_sec: Duration,
291*2069cc0dSBrahmaMantra 
292*2069cc0dSBrahmaMantra     ///@brief 相对于机器被启动的时间点
293*2069cc0dSBrahmaMantra     on_boot_sec: Duration,
294*2069cc0dSBrahmaMantra 
295*2069cc0dSBrahmaMantra     ///@brief 相对于systemd被首次启动的时间点,也就是内核启动init进程的时间点
296*2069cc0dSBrahmaMantra     on_start_up_sec: Duration,
297*2069cc0dSBrahmaMantra 
298*2069cc0dSBrahmaMantra     ///@brief 相对于匹配单元最后一次被启动的时间点
299*2069cc0dSBrahmaMantra     on_unit_active_sec: Duration,
300*2069cc0dSBrahmaMantra 
301*2069cc0dSBrahmaMantra     ///@brief 相对于匹配单元 最后一次被停止的时间点
302*2069cc0dSBrahmaMantra     on_unit_inactive_sec: Duration,
303*2069cc0dSBrahmaMantra 
304*2069cc0dSBrahmaMantra     ///@brief 定义基于挂钟时间(wallclock)的日历定时器,值是一个日历事件表达式
305*2069cc0dSBrahmaMantra     on_calendar: CalendarStandard,
306*2069cc0dSBrahmaMantra 
307*2069cc0dSBrahmaMantra     ///@brief 设置定时器的触发精度,默认1min
308*2069cc0dSBrahmaMantra     accuarcy_sec: usize,
309*2069cc0dSBrahmaMantra 
310*2069cc0dSBrahmaMantra     ///@brief 随机延迟一小段时间,默认0表示不延迟
311*2069cc0dSBrahmaMantra     randomized_delay_sec: usize,
312*2069cc0dSBrahmaMantra 
313*2069cc0dSBrahmaMantra     ///@brief
314*2069cc0dSBrahmaMantra     fixed_random_delay: bool,
315*2069cc0dSBrahmaMantra 
316*2069cc0dSBrahmaMantra     ///@brief
317*2069cc0dSBrahmaMantra     on_clock_change: bool,
318*2069cc0dSBrahmaMantra 
319*2069cc0dSBrahmaMantra     ///@brief
320*2069cc0dSBrahmaMantra     on_timezone_change: bool,
321*2069cc0dSBrahmaMantra 
322*2069cc0dSBrahmaMantra     ///@brief 默认值是 与此定时器单元同名的服务单元
323*2069cc0dSBrahmaMantra     unit: usize,
324*2069cc0dSBrahmaMantra 
325*2069cc0dSBrahmaMantra     ///@brief 若设为"yes",则表示将匹配单元的上次触发时间永久保存在磁盘上,默认no
326*2069cc0dSBrahmaMantra     persistent: bool,
327*2069cc0dSBrahmaMantra 
328*2069cc0dSBrahmaMantra     ///@brief 若设为"yes", 则表示当某个定时器到达触发时间点时, 唤醒正在休眠的系统并阻止系统进入休眠状态,默认no
329*2069cc0dSBrahmaMantra     wake_system: bool,
330*2069cc0dSBrahmaMantra 
331*2069cc0dSBrahmaMantra     ///@brief 若设为"yes" ,那么该定时器将不会被再次触发,也就是可以确保仅被触发一次;默认yes
332*2069cc0dSBrahmaMantra     remain_after_elapse: bool, //默认yes
333*2069cc0dSBrahmaMantra 
334*2069cc0dSBrahmaMantra     ///@brief 表示计时器下次实时时间触发的时间戳
335*2069cc0dSBrahmaMantra     next_elapse_realtime: Instant,
336*2069cc0dSBrahmaMantra 
337*2069cc0dSBrahmaMantra     ///@brief 表示计时器下次单调时间或引导时间触发的时间戳
338*2069cc0dSBrahmaMantra     next_elapse_monotonic_or_boottime: Option<Instant>, //None表示无限大
339*2069cc0dSBrahmaMantra 
340*2069cc0dSBrahmaMantra     ///@brief 用于存储计时器最后一次触发的时间戳。
341*2069cc0dSBrahmaMantra     last_trigger: Instant,
342*2069cc0dSBrahmaMantra 
343*2069cc0dSBrahmaMantra     ///@brief 用于表示当前的时间。
344*2069cc0dSBrahmaMantra     now_time: Instant,
345*2069cc0dSBrahmaMantra }
346*2069cc0dSBrahmaMantra 
347*2069cc0dSBrahmaMantra impl Default for TimerPart {
default() -> Self348*2069cc0dSBrahmaMantra     fn default() -> Self {
349*2069cc0dSBrahmaMantra         Self {
350*2069cc0dSBrahmaMantra             value: Default::default(),
351*2069cc0dSBrahmaMantra             on_active_sec: Default::default(),
352*2069cc0dSBrahmaMantra             on_boot_sec: Default::default(),
353*2069cc0dSBrahmaMantra             on_start_up_sec: Default::default(),
354*2069cc0dSBrahmaMantra             on_unit_active_sec: Default::default(),
355*2069cc0dSBrahmaMantra             on_unit_inactive_sec: Default::default(),
356*2069cc0dSBrahmaMantra             on_calendar: CalendarStandard::default(),
357*2069cc0dSBrahmaMantra             accuarcy_sec: 60, // 默认设置为 60 秒
358*2069cc0dSBrahmaMantra             randomized_delay_sec: 0,
359*2069cc0dSBrahmaMantra             fixed_random_delay: false,
360*2069cc0dSBrahmaMantra             on_clock_change: false,
361*2069cc0dSBrahmaMantra             on_timezone_change: false,
362*2069cc0dSBrahmaMantra             unit: Default::default(),
363*2069cc0dSBrahmaMantra             persistent: false,
364*2069cc0dSBrahmaMantra             wake_system: false,
365*2069cc0dSBrahmaMantra             remain_after_elapse: true,
366*2069cc0dSBrahmaMantra 
367*2069cc0dSBrahmaMantra             next_elapse_realtime: Instant::now(),
368*2069cc0dSBrahmaMantra             next_elapse_monotonic_or_boottime: None,
369*2069cc0dSBrahmaMantra             last_trigger: Instant::now(),
370*2069cc0dSBrahmaMantra             now_time: Instant::now(),
371*2069cc0dSBrahmaMantra         }
372*2069cc0dSBrahmaMantra     }
373*2069cc0dSBrahmaMantra }
374*2069cc0dSBrahmaMantra 
375*2069cc0dSBrahmaMantra impl TimerPart {
376*2069cc0dSBrahmaMantra     /// 更新下一次的触发时间
update_next_trigger(&mut self)377*2069cc0dSBrahmaMantra     pub fn update_next_trigger(&mut self) {
378*2069cc0dSBrahmaMantra         self.now_time = Instant::now();
379*2069cc0dSBrahmaMantra 
380*2069cc0dSBrahmaMantra         //let unit_is_running=UnitManager::is_running_unit(&self.unit);
381*2069cc0dSBrahmaMantra         //检查并更新value
382*2069cc0dSBrahmaMantra         let mut index = 0;
383*2069cc0dSBrahmaMantra         while index < self.value.len() {
384*2069cc0dSBrahmaMantra             let val = &mut self.value[index];
385*2069cc0dSBrahmaMantra             match val.attr {
386*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnUnitInactiveSec | TimerUnitAttr::OnUnitActiveSec => {
387*2069cc0dSBrahmaMantra                     //更新OnUnitInactiveSec和OnUnitActiveSec类型的值
388*2069cc0dSBrahmaMantra                     if val.disabled || val.next_elapse == None {
389*2069cc0dSBrahmaMantra                         //None表示此时无法确认下次触发时间
390*2069cc0dSBrahmaMantra                         index = index + 1;
391*2069cc0dSBrahmaMantra                         continue;
392*2069cc0dSBrahmaMantra                     } else if val.next_elapse.unwrap() < self.now_time {
393*2069cc0dSBrahmaMantra                         self.next_elapse_monotonic_or_boottime = val.next_elapse;
394*2069cc0dSBrahmaMantra                         val.next_elapse = None;
395*2069cc0dSBrahmaMantra                         // println!("Update the time!");
396*2069cc0dSBrahmaMantra                         return;
397*2069cc0dSBrahmaMantra                     }
398*2069cc0dSBrahmaMantra                 }
399*2069cc0dSBrahmaMantra 
400*2069cc0dSBrahmaMantra                 TimerUnitAttr::OnActiveSec | TimerUnitAttr::OnBootSec => {
401*2069cc0dSBrahmaMantra                     if val.next_elapse.unwrap() < self.now_time {
402*2069cc0dSBrahmaMantra                         self.next_elapse_monotonic_or_boottime = val.next_elapse;
403*2069cc0dSBrahmaMantra                         self.value.remove(index); //在这一步准备把index从value里弹出去
404*2069cc0dSBrahmaMantra                         return;
405*2069cc0dSBrahmaMantra                     }
406*2069cc0dSBrahmaMantra                 }
407*2069cc0dSBrahmaMantra                 //TimerUnitAttr::OnStartUpSec => todo!(),
408*2069cc0dSBrahmaMantra                 //TimerUnitAttr::OnCalendar => todo!(),
409*2069cc0dSBrahmaMantra                 _ => todo!(), //暂未支持
410*2069cc0dSBrahmaMantra             }
411*2069cc0dSBrahmaMantra             index += 1;
412*2069cc0dSBrahmaMantra         }
413*2069cc0dSBrahmaMantra         // 对value排序,使得最早的定时器时间在最前面,且None类型在最后面
414*2069cc0dSBrahmaMantra         self.value.sort_by//(|a, b| a.next_elapse.cmp(&b.next_elapse));
415*2069cc0dSBrahmaMantra         (|a, b| match (a.next_elapse, b.next_elapse) {
416*2069cc0dSBrahmaMantra         (None, None) => std::cmp::Ordering::Equal,
417*2069cc0dSBrahmaMantra         (None, Some(_)) => std::cmp::Ordering::Greater,
418*2069cc0dSBrahmaMantra         (Some(_), None) => std::cmp::Ordering::Less,
419*2069cc0dSBrahmaMantra         (Some(a), Some(b)) => a.cmp(&b),
420*2069cc0dSBrahmaMantra     });
421*2069cc0dSBrahmaMantra         if self.value.is_empty() || self.value[0].next_elapse == None {
422*2069cc0dSBrahmaMantra             //无法得到下次触发的具体时间
423*2069cc0dSBrahmaMantra             return;
424*2069cc0dSBrahmaMantra         }
425*2069cc0dSBrahmaMantra 
426*2069cc0dSBrahmaMantra         // 从已排序的Vec中获取最早的定时器时间
427*2069cc0dSBrahmaMantra         self.next_elapse_monotonic_or_boottime = self.value[0].next_elapse;
428*2069cc0dSBrahmaMantra 
429*2069cc0dSBrahmaMantra         return;
430*2069cc0dSBrahmaMantra     }
431*2069cc0dSBrahmaMantra     /// &str->attr的parse
set_attr(&mut self, attr: &TimerUnitAttr, val: &str) -> Result<(), ParseError>432*2069cc0dSBrahmaMantra     pub fn set_attr(&mut self, attr: &TimerUnitAttr, val: &str) -> Result<(), ParseError> {
433*2069cc0dSBrahmaMantra         match attr {
434*2069cc0dSBrahmaMantra             TimerUnitAttr::OnActiveSec => {
435*2069cc0dSBrahmaMantra                 self.on_active_sec = {
436*2069cc0dSBrahmaMantra                     if let Ok(duration) = parse_duration(val) {
437*2069cc0dSBrahmaMantra                         duration
438*2069cc0dSBrahmaMantra                     } else {
439*2069cc0dSBrahmaMantra                         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
440*2069cc0dSBrahmaMantra                     }
441*2069cc0dSBrahmaMantra                 }
442*2069cc0dSBrahmaMantra             }
443*2069cc0dSBrahmaMantra 
444*2069cc0dSBrahmaMantra             TimerUnitAttr::OnBootSec => {
445*2069cc0dSBrahmaMantra                 self.on_boot_sec = {
446*2069cc0dSBrahmaMantra                     if let Ok(duration) = parse_duration(val) {
447*2069cc0dSBrahmaMantra                         duration
448*2069cc0dSBrahmaMantra                     } else {
449*2069cc0dSBrahmaMantra                         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
450*2069cc0dSBrahmaMantra                     }
451*2069cc0dSBrahmaMantra                 }
452*2069cc0dSBrahmaMantra             }
453*2069cc0dSBrahmaMantra 
454*2069cc0dSBrahmaMantra             TimerUnitAttr::OnStartUpSec => {
455*2069cc0dSBrahmaMantra                 self.on_start_up_sec = {
456*2069cc0dSBrahmaMantra                     if let Ok(duration) = parse_duration(val) {
457*2069cc0dSBrahmaMantra                         duration
458*2069cc0dSBrahmaMantra                     } else {
459*2069cc0dSBrahmaMantra                         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
460*2069cc0dSBrahmaMantra                     }
461*2069cc0dSBrahmaMantra                 }
462*2069cc0dSBrahmaMantra             }
463*2069cc0dSBrahmaMantra             TimerUnitAttr::OnUnitInactiveSec => {
464*2069cc0dSBrahmaMantra                 self.on_unit_inactive_sec = {
465*2069cc0dSBrahmaMantra                     if let Ok(duration) = parse_duration(val) {
466*2069cc0dSBrahmaMantra                         duration
467*2069cc0dSBrahmaMantra                     } else {
468*2069cc0dSBrahmaMantra                         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
469*2069cc0dSBrahmaMantra                     }
470*2069cc0dSBrahmaMantra                 }
471*2069cc0dSBrahmaMantra             }
472*2069cc0dSBrahmaMantra             TimerUnitAttr::OnUnitActiveSec => {
473*2069cc0dSBrahmaMantra                 self.on_unit_active_sec = {
474*2069cc0dSBrahmaMantra                     if let Ok(duration) = parse_duration(val) {
475*2069cc0dSBrahmaMantra                         duration
476*2069cc0dSBrahmaMantra                     } else {
477*2069cc0dSBrahmaMantra                         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
478*2069cc0dSBrahmaMantra                     }
479*2069cc0dSBrahmaMantra                 }
480*2069cc0dSBrahmaMantra             }
481*2069cc0dSBrahmaMantra             //  TimerUnitAttr::OnCalendar=>self.on_calendar={
482*2069cc0dSBrahmaMantra             //     if let Ok(calendar) = parse_calendar(val) {
483*2069cc0dSBrahmaMantra             //         calendar
484*2069cc0dSBrahmaMantra             //     } else {
485*2069cc0dSBrahmaMantra             //         return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
486*2069cc0dSBrahmaMantra             //     }
487*2069cc0dSBrahmaMantra             //  },
488*2069cc0dSBrahmaMantra             TimerUnitAttr::Persistent => {
489*2069cc0dSBrahmaMantra                 self.persistent = {
490*2069cc0dSBrahmaMantra                     match val {
491*2069cc0dSBrahmaMantra                         "true" => true,
492*2069cc0dSBrahmaMantra                         "false" => false,
493*2069cc0dSBrahmaMantra                         _ => return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0)),
494*2069cc0dSBrahmaMantra                     }
495*2069cc0dSBrahmaMantra                 }
496*2069cc0dSBrahmaMantra             }
497*2069cc0dSBrahmaMantra             TimerUnitAttr::Unit => self.unit = UnitManager::get_id_with_path(val).unwrap(),
498*2069cc0dSBrahmaMantra             _ => {
499*2069cc0dSBrahmaMantra                 return Err(ParseError::new(ParseErrorType::EINVAL, String::new(), 0));
500*2069cc0dSBrahmaMantra             }
501*2069cc0dSBrahmaMantra         }
502*2069cc0dSBrahmaMantra         Ok(())
503*2069cc0dSBrahmaMantra     }
504*2069cc0dSBrahmaMantra }
505*2069cc0dSBrahmaMantra #[derive(Debug, Clone, Copy)]
506909e4d10SGnoCiYeH pub enum TimerUnitAttr {
507*2069cc0dSBrahmaMantra     //TimerBase
508*2069cc0dSBrahmaMantra     // State,
509*2069cc0dSBrahmaMantra     // Result,
510909e4d10SGnoCiYeH     OnActiveSec,
511909e4d10SGnoCiYeH     OnBootSec,
512909e4d10SGnoCiYeH     OnStartUpSec,
513909e4d10SGnoCiYeH     OnUnitInactiveSec,
514*2069cc0dSBrahmaMantra     OnUnitActiveSec,
515909e4d10SGnoCiYeH     OnCalendar,
516909e4d10SGnoCiYeH     AccuarcySec,
517909e4d10SGnoCiYeH     RandomizedDelaySec,
518909e4d10SGnoCiYeH     FixedRandomDelay,
519909e4d10SGnoCiYeH     OnClockChange,
520909e4d10SGnoCiYeH     OnTimeZoneChange,
521909e4d10SGnoCiYeH     Unit,
522909e4d10SGnoCiYeH     Persistent,
523909e4d10SGnoCiYeH     WakeSystem,
524909e4d10SGnoCiYeH     RemainAfterElapse,
525909e4d10SGnoCiYeH }
526*2069cc0dSBrahmaMantra impl Default for TimerUnitAttr {
default() -> Self527*2069cc0dSBrahmaMantra     fn default() -> Self {
528*2069cc0dSBrahmaMantra         TimerUnitAttr::OnActiveSec
529*2069cc0dSBrahmaMantra     }
530*2069cc0dSBrahmaMantra }
531*2069cc0dSBrahmaMantra 
532*2069cc0dSBrahmaMantra #[derive(Debug, Clone)]
533*2069cc0dSBrahmaMantra pub struct TimerVal {
534*2069cc0dSBrahmaMantra     attr: TimerUnitAttr,
535*2069cc0dSBrahmaMantra     disabled: bool,
536*2069cc0dSBrahmaMantra     val: Duration,
537*2069cc0dSBrahmaMantra     //calendar_standard:Vec<CalendarStandard>,//只针对calendar事件
538*2069cc0dSBrahmaMantra     next_elapse: Option<Instant>,
539*2069cc0dSBrahmaMantra }
540*2069cc0dSBrahmaMantra 
541*2069cc0dSBrahmaMantra impl TimerVal {
new( attr: TimerUnitAttr, disabled: bool, val: Duration, _calendar_standard: Vec<CalendarStandard>, next_elapse: Option<Instant>, ) -> TimerVal542*2069cc0dSBrahmaMantra     pub fn new(
543*2069cc0dSBrahmaMantra         attr: TimerUnitAttr,
544*2069cc0dSBrahmaMantra         disabled: bool,
545*2069cc0dSBrahmaMantra         val: Duration,
546*2069cc0dSBrahmaMantra         _calendar_standard: Vec<CalendarStandard>, //等待后续迭代
547*2069cc0dSBrahmaMantra         next_elapse: Option<Instant>,
548*2069cc0dSBrahmaMantra     ) -> TimerVal {
549*2069cc0dSBrahmaMantra         TimerVal {
550*2069cc0dSBrahmaMantra             attr,
551*2069cc0dSBrahmaMantra             disabled,
552*2069cc0dSBrahmaMantra             val,
553*2069cc0dSBrahmaMantra             //calendar_standard,
554*2069cc0dSBrahmaMantra             next_elapse,
555*2069cc0dSBrahmaMantra         }
556*2069cc0dSBrahmaMantra     }
557*2069cc0dSBrahmaMantra }
558