mod node_manager;
mod server;
pub use node_manager::{DiagnosticsNodeManager, DiagnosticsNodeManagerBuilder, NamespaceMetadata};
use opcua_core::sync::Mutex;
use opcua_types::{DataValue, DateTime, IntoVariant};
pub use server::{ServerDiagnostics, ServerDiagnosticsSummary};
#[derive(Default)]
pub struct LocalValue<T> {
inner: Mutex<LocalValueInner<T>>,
}
#[derive(Default)]
struct LocalValueInner<T> {
pub value: T,
pub timestamp: DateTime,
}
impl<T: Clone + IntoVariant> LocalValue<T> {
pub fn new(value: T) -> Self {
Self {
inner: Mutex::new(LocalValueInner {
value,
timestamp: DateTime::now(),
}),
}
}
pub fn modify(&self, fun: impl FnOnce(&mut T)) {
let mut inner = self.inner.lock();
fun(&mut inner.value);
inner.timestamp = DateTime::now();
}
pub fn set(&self, value: T) {
let mut inner = self.inner.lock();
inner.value = value;
inner.timestamp = DateTime::now();
}
pub fn sample(&self) -> DataValue {
let inner = self.inner.lock();
DataValue::new_at(inner.value.clone().into_variant(), inner.timestamp)
}
pub fn get(&self) -> T {
let inner = self.inner.lock();
inner.value.clone()
}
pub fn get_with_time(&self) -> (T, DateTime) {
let inner = self.inner.lock();
(inner.value.clone(), inner.timestamp)
}
}
impl LocalValue<u32> {
pub fn increment(&self) {
self.modify(|v| *v += 1);
}
pub fn decrement(&self) {
self.modify(|v| {
*v = v.saturating_sub(1);
});
}
}