diff --git a/src/event.rs b/src/event.rs index 0e6af8a..93a85f0 100644 --- a/src/event.rs +++ b/src/event.rs @@ -131,6 +131,18 @@ impl EventManager { }; if let Some(point_id) = point_id { + // 从缓存中读取旧值 + let monitor_data = connection_manager.get_point_monitor_data_read_guard().await; + let old_monitor_info = monitor_data.get(&point_id); + + let (old_value, old_timestamp, value_changed) = if let Some(old_info) = old_monitor_info { + let changed = old_info.value != payload.value || + old_info.timestamp != payload.timestamp; + (old_info.value.clone(), old_info.timestamp, changed) + } else { + (None, None, false) + }; + let monitor = crate::telemetry::PointMonitorInfo { protocol: payload.protocol.clone(), source_id, @@ -142,6 +154,9 @@ impl EventManager { value: payload.value.clone(), value_type: payload.value_type.clone(), value_text: payload.value_text.clone(), + old_value, + old_timestamp, + value_changed, }; if let Err(e) = connection_manager.update_point_monitor_data(monitor.clone()).await { diff --git a/src/telemetry.rs b/src/telemetry.rs index 0dca3b2..fc1f211 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -43,6 +43,7 @@ impl PointQuality { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "kind", content = "value", rename_all = "snake_case")] +#[derive(PartialEq)] pub enum DataValue { Null, Bool(bool), @@ -85,6 +86,9 @@ pub struct PointMonitorInfo { pub value: Option, pub value_type: Option, pub value_text: Option, + pub old_value: Option, + pub old_timestamp: Option>, + pub value_changed: bool, } impl PointMonitorInfo {