xous-core/services/llio/src/lib.rs
bunnie ee695d0181 turn off time init check after it returns true
this reduces a bit of message chatter for a call that may be
called quite frequently.
2022-03-27 17:08:16 +08:00

82 lines
No EOL
2.8 KiB
Rust

#![cfg_attr(target_os = "none", no_std)]
/// This is the API that other servers use to call the COM. Read this code as if you
/// are calling these functions inside a different process.
pub mod api;
pub use api::*;
pub mod i2c_lib;
pub use i2c_lib::I2c;
pub mod llio_lib;
pub use llio_lib::Llio;
use core::sync::atomic::{AtomicU32, Ordering};
static TIME_REFCOUNT: AtomicU32 = AtomicU32::new(0);
pub struct LocalTime {
conn: xous::CID,
warn_count: u32,
time_init: bool,
}
impl LocalTime {
pub fn new() -> LocalTime {
TIME_REFCOUNT.fetch_add(1, Ordering::Relaxed);
let conn = xous::connect(xous::SID::from_bytes(b"timeserverpublic").unwrap()).unwrap();
LocalTime {
conn,
warn_count: 0,
time_init: false,
}
}
/// Returns the local time as milliseconds since EPOCH, assuming the time zone is set
/// This is provided because we don't have a `libc` to do time zone lookups with `Chrono`.
pub fn get_local_time_ms(&mut self) -> Option<u64> {
if !self.time_init {
match xous::send_message(self.conn,
xous::Message::new_blocking_scalar(
6, // WallClockTimeInit -- this should not change because it's a libstd mapping
0, 0, 0, 0
)
).expect("couldn't get init status") {
xous::Result::Scalar1(is_init) => {
if is_init == 0 {
if self.warn_count < 10 || (self.warn_count & 0xff) == 0 {
log::warn!("Time offsets are not initialized, can't report local time");
}
self.warn_count += 1;
return None;
}
}
_ => {
log::error!("error retrieving time");
return None;
}
}
}
// if we got here, time was initialized. Set a flag so we don't check again in the future.
// this reduces the chatter of messages that may routinely happen, e.g. for getting seconds updates on the RTC.
self.time_init = true;
match xous::send_message(self.conn,
xous::Message::new_blocking_scalar(
4,
0, 0, 0, 0
)
).expect("couldn't get time") {
xous::Result::Scalar2(hi, lo) => {
Some((hi as u64) << 32 | (lo as u64))
}
_ => {
log::error!("error retrieving time");
return None;
}
}
}
// Note: to get the UTC time since EPOCH, use the std::SystemTime::now()
}
impl Drop for LocalTime {
fn drop(&mut self) {
if TIME_REFCOUNT.fetch_sub(1, Ordering::Relaxed) == 1 {
unsafe{xous::disconnect(self.conn).unwrap();}
}
}
}