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