From 02de1f45521ef9b87203649d969374daef1c3941 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 3 Mar 2026 15:41:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0ValueType=E6=9E=9A?= =?UTF-8?q?=E4=B8=BE=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/telemetry.rs | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/telemetry.rs b/src/telemetry.rs index 79c1ddf..3cba9ed 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -4,6 +4,20 @@ use uuid::Uuid; use crate::model::ScanMode; +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum ValueType { + Null, + Bool, + Int, + UInt, + Float, + Text, + Bytes, + Array, + Object, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum PointQuality { @@ -69,7 +83,7 @@ pub struct PointMonitorInfo { pub timestamp: Option>, pub quality: PointQuality, pub value: Option, - pub value_type: Option, + pub value_type: Option, pub value_text: Option, } @@ -85,7 +99,7 @@ pub struct PointValueChangeEvent { pub point_id: Option, pub client_handle: u32, pub value: Option, - pub value_type: Option, + pub value_type: Option, pub value_text: Option, pub quality: PointQuality, pub protocol: String, @@ -101,7 +115,7 @@ pub struct WsPointMonitorInfo { pub timestamp: Option, pub quality: PointQuality, pub value: Option, - pub value_type: Option, + pub value_type: Option, } impl From<&PointMonitorInfo> for WsPointMonitorInfo { @@ -146,9 +160,17 @@ pub fn opcua_variant_to_data(value: &opcua::types::Variant) -> DataValue { } } -pub fn opcua_variant_type(value: &opcua::types::Variant) -> String { - match value.scalar_type_id() { - Some(t) => t.to_string(), - None => "unknown".to_string(), +pub fn opcua_variant_type(value: &opcua::types::Variant) -> ValueType { + use opcua::types::Variant; + match value { + Variant::Empty => ValueType::Null, + Variant::Boolean(_) => ValueType::Bool, + Variant::SByte(_) | Variant::Int16(_) | Variant::Int32(_) | Variant::Int64(_) => ValueType::Int, + Variant::Byte(_) | Variant::UInt16(_) | Variant::UInt32(_) | Variant::UInt64(_) => ValueType::UInt, + Variant::Float(_) | Variant::Double(_) => ValueType::Float, + Variant::String(_) => ValueType::Text, + Variant::ByteString(_) => ValueType::Bytes, + Variant::Array(_) => ValueType::Array, + _ => ValueType::Text, } }