1*01876902SGou Ngai #![allow(dead_code)] 2*01876902SGou Ngai use crate::include::bindings::bindings::{rtc_get_cmos_time, rtc_time_t}; 3*01876902SGou Ngai 4*01876902SGou Ngai #[allow(non_camel_case_types)] 5*01876902SGou Ngai pub type ktime_t = i64; 6*01876902SGou Ngai 7*01876902SGou Ngai // @brief 将ktime_t类型转换为纳秒类型 8*01876902SGou Ngai #[inline] 9*01876902SGou Ngai fn ktime_to_ns(kt: ktime_t) -> i64 { 10*01876902SGou Ngai return kt as i64; 11*01876902SGou Ngai } 12*01876902SGou Ngai 13*01876902SGou Ngai /// @brief 从RTC获取当前时间,然后计算时间戳。 14*01876902SGou Ngai /// 时间戳为从UTC+0 1970-01-01 00:00到当前UTC+0时间,所经过的纳秒数。 15*01876902SGou Ngai /// 注意,由于当前未引入时区,因此本函数默认时区为UTC+8来计算 16*01876902SGou Ngai fn ktime_get_real() -> ktime_t { 17*01876902SGou Ngai let mut rtc_time: rtc_time_t = rtc_time_t { 18*01876902SGou Ngai second: (0), 19*01876902SGou Ngai minute: (0), 20*01876902SGou Ngai hour: (0), 21*01876902SGou Ngai day: (0), 22*01876902SGou Ngai month: (0), 23*01876902SGou Ngai year: (0), 24*01876902SGou Ngai }; 25*01876902SGou Ngai 26*01876902SGou Ngai unsafe { 27*01876902SGou Ngai //调用rtc.h里面的函数 28*01876902SGou Ngai rtc_get_cmos_time(&mut rtc_time); 29*01876902SGou Ngai } 30*01876902SGou Ngai 31*01876902SGou Ngai let mut day_count: i32 = 0; 32*01876902SGou Ngai for year in 1970..rtc_time.year { 33*01876902SGou Ngai let leap: bool = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); 34*01876902SGou Ngai if leap { 35*01876902SGou Ngai day_count += 366; 36*01876902SGou Ngai } else { 37*01876902SGou Ngai day_count += 365; 38*01876902SGou Ngai } 39*01876902SGou Ngai //println!("{},{}",year,day_count); 40*01876902SGou Ngai } 41*01876902SGou Ngai //println!("day count1: {}",day_count); 42*01876902SGou Ngai for month in 1..rtc_time.month { 43*01876902SGou Ngai match month { 44*01876902SGou Ngai 1 | 3 | 5 | 7 | 8 | 10 | 12 => day_count += 31, 45*01876902SGou Ngai 2 => day_count += 28, 46*01876902SGou Ngai 4 | 6 | 9 | 11 => day_count += 30, 47*01876902SGou Ngai _ => day_count += 0, 48*01876902SGou Ngai } 49*01876902SGou Ngai //println!("{}:{}",month,day_count); 50*01876902SGou Ngai } 51*01876902SGou Ngai 52*01876902SGou Ngai day_count += rtc_time.day - 1; 53*01876902SGou Ngai //println!("day count2: {}",day_count); 54*01876902SGou Ngai //转换成纳秒 55*01876902SGou Ngai let timestamp: ktime_t = day_count as i64 * 86_400_000_000_000i64 56*01876902SGou Ngai + (rtc_time.hour - 8) as i64 * 3_600_000_000_000i64 57*01876902SGou Ngai + rtc_time.minute as i64 * 60_000_000_000i64 58*01876902SGou Ngai + rtc_time.second as i64 * 1_000_000_000i64 as ktime_t; 59*01876902SGou Ngai 60*01876902SGou Ngai return timestamp; 61*01876902SGou Ngai } 62*01876902SGou Ngai 63*01876902SGou Ngai /// @brief 暴露给外部使用的接口,返回一个时间戳 64*01876902SGou Ngai #[inline] 65*01876902SGou Ngai pub fn ktime_get_real_ns() -> i64 { 66*01876902SGou Ngai let kt: ktime_t = ktime_get_real(); 67*01876902SGou Ngai return ktime_to_ns(kt); 68*01876902SGou Ngai } 69