2023-04-13 11:51:03 +08:00
|
|
|
using System;
|
2023-04-20 15:03:58 +08:00
|
|
|
using Aitex.Core.RT.Event;
|
|
|
|
using Aitex.Core.RT.Log;
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
|
|
namespace Aitex.Core.RT.SCCore
|
|
|
|
{
|
|
|
|
public class SCConfigItem
|
|
|
|
{
|
2023-04-20 14:26:02 +08:00
|
|
|
public event EventHandler<object> OnValueChanged;
|
|
|
|
|
2023-04-13 11:51:03 +08:00
|
|
|
public string Name { get; set; }
|
|
|
|
|
|
|
|
public string Path { get; set; }
|
|
|
|
|
|
|
|
public string Default { get; set; }
|
|
|
|
|
|
|
|
public string Min { get; set; }
|
|
|
|
|
|
|
|
public string Max { get; set; }
|
|
|
|
|
|
|
|
public string Unit { get; set; }
|
|
|
|
|
|
|
|
public string Type { get; set; }
|
|
|
|
|
|
|
|
public string Tag { get; set; }
|
|
|
|
|
|
|
|
public string Parameter { get; set; }
|
|
|
|
|
|
|
|
public string Description { get; set; }
|
|
|
|
|
2023-10-09 17:26:45 +08:00
|
|
|
public bool Visible { get; set; } = true;
|
|
|
|
|
|
|
|
public object Value => Type switch
|
2023-04-13 11:51:03 +08:00
|
|
|
{
|
|
|
|
"Bool" => BoolValue,
|
|
|
|
"Double" => DoubleValue,
|
|
|
|
"String" => StringValue,
|
|
|
|
"Integer" => IntValue,
|
|
|
|
_ => null,
|
|
|
|
};
|
|
|
|
|
|
|
|
public Type Typeof => Type switch
|
|
|
|
{
|
|
|
|
"Bool" => typeof(bool),
|
|
|
|
"Double" => typeof(double),
|
|
|
|
"String" => typeof(string),
|
|
|
|
"Integer" => typeof(int),
|
|
|
|
_ => null,
|
|
|
|
};
|
|
|
|
|
|
|
|
public string PathName => string.IsNullOrEmpty(Path) ? Name : (Path + "." + Name);
|
|
|
|
|
|
|
|
public int IntValue { get; set; }
|
|
|
|
|
|
|
|
public double DoubleValue { get; set; }
|
|
|
|
|
|
|
|
public bool BoolValue { get; set; }
|
|
|
|
|
|
|
|
public string StringValue { get; set; }
|
|
|
|
|
2023-04-20 15:03:58 +08:00
|
|
|
#region Methods
|
|
|
|
|
|
|
|
public bool SafeSetValue(object value)
|
2023-04-20 14:26:02 +08:00
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
var result = false;
|
2023-04-20 14:26:02 +08:00
|
|
|
switch (Type)
|
|
|
|
{
|
|
|
|
case "Bool":
|
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
if (bool.TryParse(value.ToString(), out var result2) && result2 != BoolValue)
|
2023-04-20 14:26:02 +08:00
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
BoolValue = result2;
|
|
|
|
result = true;
|
2023-04-20 14:26:02 +08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "Integer":
|
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
if (int.TryParse(value.ToString(), out var result6) && result6 != IntValue)
|
|
|
|
{
|
|
|
|
int.TryParse(Min, out var result7);
|
|
|
|
int.TryParse(Max, out var result8);
|
|
|
|
if (result6 < result7 || result6 > result8)
|
|
|
|
{
|
|
|
|
EV.PostWarningLog("System", $"SC {PathName} value {result6} out of setting range ({Min}, {Max})");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
IntValue = result6;
|
|
|
|
result = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "Double":
|
|
|
|
{
|
|
|
|
if (double.TryParse(value.ToString(), out var result3) && Math.Abs(result3 - DoubleValue) > 0.0001)
|
2023-04-20 14:26:02 +08:00
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
double.TryParse(Min, out var result4);
|
|
|
|
double.TryParse(Max, out var result5);
|
|
|
|
if (result3 < result4 || result3 > result5)
|
|
|
|
{
|
|
|
|
EV.PostWarningLog("System", $"SC {PathName} value {result3} out of setting range ({Min}, {Max})");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DoubleValue = result3;
|
|
|
|
result = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "String":
|
|
|
|
if (value.ToString() != StringValue)
|
|
|
|
{
|
|
|
|
StringValue = value.ToString();
|
|
|
|
result = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
HandleOnValueChangedEvent(Value);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool SetValue(object value)
|
|
|
|
{
|
|
|
|
var isValueChanged = false;
|
|
|
|
switch (Type)
|
|
|
|
{
|
|
|
|
case "Bool":
|
|
|
|
|
|
|
|
if (bool.TryParse(value.ToString(), out var bValue))
|
|
|
|
{
|
|
|
|
if (bValue != BoolValue)
|
|
|
|
{
|
|
|
|
BoolValue = bValue;
|
|
|
|
isValueChanged = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Integer":
|
|
|
|
{
|
|
|
|
if (int.TryParse(value.ToString(), out var iValue))
|
|
|
|
{
|
|
|
|
if (iValue != IntValue)
|
|
|
|
{
|
|
|
|
IntValue = iValue;
|
|
|
|
isValueChanged = true;
|
|
|
|
}
|
2023-04-20 14:26:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "Double":
|
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
if (double.TryParse(value.ToString(), out var dbValue))
|
2023-04-20 14:26:02 +08:00
|
|
|
{
|
2023-04-20 15:03:58 +08:00
|
|
|
if (Math.Abs(dbValue - DoubleValue) > 0.0001)
|
|
|
|
{
|
|
|
|
DoubleValue = dbValue;
|
|
|
|
isValueChanged = true;
|
|
|
|
}
|
2023-04-20 14:26:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "String":
|
|
|
|
{
|
|
|
|
var strValue = (string)value;
|
|
|
|
if (strValue != StringValue)
|
|
|
|
{
|
|
|
|
StringValue = strValue;
|
2023-04-20 15:03:58 +08:00
|
|
|
isValueChanged = true;
|
2023-04-20 14:26:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-20 15:03:58 +08:00
|
|
|
if (isValueChanged)
|
|
|
|
{
|
|
|
|
HandleOnValueChangedEvent(Value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return isValueChanged;
|
2023-04-20 14:26:02 +08:00
|
|
|
}
|
2023-10-04 16:10:17 +08:00
|
|
|
|
|
|
|
public bool ValueEquals(object value)
|
|
|
|
{
|
|
|
|
switch (Type)
|
|
|
|
{
|
|
|
|
case "Bool":
|
|
|
|
{
|
|
|
|
if (bool.TryParse(value.ToString(), out var result2) && result2 == BoolValue)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "Integer":
|
|
|
|
{
|
|
|
|
if (int.TryParse(value.ToString(), out var result6) && result6 == IntValue)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "Double":
|
|
|
|
{
|
|
|
|
if (double.TryParse(value.ToString(), out var result3) && Math.Abs(result3 - DoubleValue) <= 0.0001)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case "String":
|
|
|
|
if (value.ToString() == StringValue)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public SCConfigItem Clone()
|
2023-04-13 11:51:03 +08:00
|
|
|
{
|
|
|
|
return new SCConfigItem
|
|
|
|
{
|
|
|
|
Name = Name,
|
|
|
|
Path = Path,
|
|
|
|
Default = Default,
|
|
|
|
Min = Min,
|
|
|
|
Max = Max,
|
|
|
|
Unit = Unit,
|
|
|
|
Type = Type,
|
|
|
|
Tag = Tag,
|
|
|
|
Parameter = Parameter,
|
|
|
|
Description = Description,
|
|
|
|
StringValue = StringValue,
|
|
|
|
IntValue = IntValue,
|
|
|
|
DoubleValue = DoubleValue,
|
|
|
|
BoolValue = BoolValue
|
|
|
|
};
|
|
|
|
}
|
2023-04-20 14:26:02 +08:00
|
|
|
|
2023-04-20 15:03:58 +08:00
|
|
|
private void HandleOnValueChangedEvent(object newValue)
|
|
|
|
{
|
|
|
|
OnValueChanged?.Invoke(this, newValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
2023-04-13 11:51:03 +08:00
|
|
|
}
|
|
|
|
}
|