[Common]
SCConfigItem对象新增函数SafeSetValue和SetValue,用于处理系统设置项参数写入逻辑;从SystemConfigManager中移除相关逻辑,以简化代码。 SCConfigItem中新增OnValueChanged事件,设置值发生变化时的回调函数在此处理,不再有SystemConfigManager处理,以简化代码结构。 移除ISCManager接口及其实现中的SetItemValueStringFormat和SetItemValueFromString函数。
This commit is contained in:
parent
76467deb9b
commit
b5dd5532ea
|
@ -16,11 +16,6 @@ namespace Aitex.Core.RT.SCCore
|
|||
Manager?.SetItemValue(name, value);
|
||||
}
|
||||
|
||||
public static void SetItemValueStringFormat(string name, string value)
|
||||
{
|
||||
Manager?.SetItemValueStringFormat(name, value);
|
||||
}
|
||||
|
||||
public static void SetItemValue(string name, bool value)
|
||||
{
|
||||
Manager?.SetItemValue(name, value);
|
||||
|
@ -41,11 +36,6 @@ namespace Aitex.Core.RT.SCCore
|
|||
Manager?.SetItemValue(name, value);
|
||||
}
|
||||
|
||||
public static void SetItemValueFromString(string name, string value)
|
||||
{
|
||||
Manager?.SetItemValueFromString(name, value);
|
||||
}
|
||||
|
||||
public static SCConfigItem GetConfigItem(string name)
|
||||
{
|
||||
return Manager?.GetConfigItem(name);
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
using System;
|
||||
using Aitex.Core.RT.Event;
|
||||
using Aitex.Core.RT.Log;
|
||||
|
||||
namespace Aitex.Core.RT.SCCore
|
||||
{
|
||||
|
@ -54,40 +56,111 @@ namespace Aitex.Core.RT.SCCore
|
|||
|
||||
public string StringValue { get; set; }
|
||||
|
||||
public bool SetValue(object value)
|
||||
#region Methods
|
||||
|
||||
public bool SafeSetValue(object value)
|
||||
{
|
||||
var isChanged = false;
|
||||
var result = false;
|
||||
switch (Type)
|
||||
{
|
||||
case "Bool":
|
||||
{
|
||||
var bValue = (bool)value;
|
||||
if (bValue != BoolValue)
|
||||
if (bool.TryParse(value.ToString(), out var result2) && result2 != BoolValue)
|
||||
{
|
||||
BoolValue = bValue;
|
||||
isChanged = true;
|
||||
BoolValue = result2;
|
||||
result = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "Integer":
|
||||
{
|
||||
var intValue = (int)value;
|
||||
if (intValue != IntValue)
|
||||
if (int.TryParse(value.ToString(), out var result6) && result6 != IntValue)
|
||||
{
|
||||
IntValue = intValue;
|
||||
isChanged = true;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "Double":
|
||||
{
|
||||
var dblValue = (double)value;
|
||||
if (Math.Abs(dblValue - DoubleValue) > 0.0001)
|
||||
if (double.TryParse(value.ToString(), out var dbValue))
|
||||
{
|
||||
DoubleValue = dblValue;
|
||||
isChanged = true;
|
||||
if (Math.Abs(dbValue - DoubleValue) > 0.0001)
|
||||
{
|
||||
DoubleValue = dbValue;
|
||||
isValueChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -98,14 +171,19 @@ namespace Aitex.Core.RT.SCCore
|
|||
if (strValue != StringValue)
|
||||
{
|
||||
StringValue = strValue;
|
||||
isChanged = true;
|
||||
isValueChanged = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return isChanged;
|
||||
if (isValueChanged)
|
||||
{
|
||||
HandleOnValueChangedEvent(Value);
|
||||
}
|
||||
|
||||
return isValueChanged;
|
||||
}
|
||||
|
||||
public SCConfigItem Clone()
|
||||
|
@ -129,5 +207,11 @@ namespace Aitex.Core.RT.SCCore
|
|||
};
|
||||
}
|
||||
|
||||
private void HandleOnValueChangedEvent(object newValue)
|
||||
{
|
||||
OnValueChanged?.Invoke(this, newValue);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,8 +12,6 @@ namespace MECF.Framework.Common.SCCore
|
|||
|
||||
void SetItemValue(string name, object value);
|
||||
|
||||
void SetItemValueStringFormat(string name, string value);
|
||||
|
||||
void SetItemValue(string name, bool value);
|
||||
|
||||
void SetItemValue(string name, int value);
|
||||
|
@ -22,8 +20,6 @@ namespace MECF.Framework.Common.SCCore
|
|||
|
||||
void SetItemValue(string name, string value);
|
||||
|
||||
void SetItemValueFromString(string name, string value);
|
||||
|
||||
SCConfigItem GetConfigItem(string name);
|
||||
|
||||
bool ContainsItem(string name);
|
||||
|
|
|
@ -99,7 +99,6 @@ namespace MECF.Framework.Common.SCCore
|
|||
if (InitializeItemValue(_items[scName], scValue))
|
||||
{
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(scName, _items[scName].Value);
|
||||
EV.PostInfoLog("System", $"SC {scName} value changed from {configValueAsObject} to {parameters[1]}");
|
||||
}
|
||||
return true;
|
||||
|
@ -396,74 +395,9 @@ namespace MECF.Framework.Common.SCCore
|
|||
return _items.Values.ToList();
|
||||
}
|
||||
|
||||
public void SetItemValueFromString(string name, string value)
|
||||
{
|
||||
if (InitializeItemValue(_items[name], value))
|
||||
{
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
private bool InitializeItemValue(SCConfigItem scItem, object value)
|
||||
{ var result = false;
|
||||
|
||||
switch (scItem.Type)
|
||||
{
|
||||
case "Bool":
|
||||
{
|
||||
if (bool.TryParse(value.ToString(), out var result2) && result2 != scItem.BoolValue)
|
||||
{
|
||||
scItem.BoolValue = result2;
|
||||
result = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Integer":
|
||||
{
|
||||
if (int.TryParse(value.ToString(), out var result6) && result6 != scItem.IntValue)
|
||||
{
|
||||
int.TryParse(scItem.Min, out var result7);
|
||||
int.TryParse(scItem.Max, out var result8);
|
||||
if (result6 < result7 || result6 > result8)
|
||||
{
|
||||
EV.PostWarningLog("System", $"SC {scItem.PathName} value {result6} out of setting range ({scItem.Min}, {scItem.Max})");
|
||||
}
|
||||
else
|
||||
{
|
||||
scItem.IntValue = result6;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Double":
|
||||
{
|
||||
if (double.TryParse(value.ToString(), out var result3) && Math.Abs(result3 - scItem.DoubleValue) > 0.0001)
|
||||
{
|
||||
double.TryParse(scItem.Min, out var result4);
|
||||
double.TryParse(scItem.Max, out var result5);
|
||||
if (result3 < result4 || result3 > result5)
|
||||
{
|
||||
EV.PostWarningLog("System", $"SC {scItem.PathName} value {result3} out of setting range ({scItem.Min}, {scItem.Max})");
|
||||
}
|
||||
else
|
||||
{
|
||||
scItem.DoubleValue = result3;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "String":
|
||||
if (value.ToString() != scItem.StringValue)
|
||||
{
|
||||
scItem.StringValue = value.ToString();
|
||||
result = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
{
|
||||
return scItem?.SafeSetValue(value) ?? false;
|
||||
}
|
||||
|
||||
public void SetItemValue(string name, object value)
|
||||
|
@ -475,62 +409,6 @@ namespace MECF.Framework.Common.SCCore
|
|||
if (_items[name].SetValue(value))
|
||||
{
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetItemValueStringFormat(string name, string value)
|
||||
{
|
||||
Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);
|
||||
if (!_items.ContainsKey(name))
|
||||
{
|
||||
return;
|
||||
}
|
||||
var isChanged = false;
|
||||
switch (_items[name].Type)
|
||||
{
|
||||
case "Bool":
|
||||
{
|
||||
var flag2 = Convert.ToBoolean(value);
|
||||
if (flag2 != _items[name].BoolValue)
|
||||
{
|
||||
_items[name].BoolValue = flag2;
|
||||
isChanged = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Integer":
|
||||
{
|
||||
var num = Convert.ToInt32(value);
|
||||
if (num != _items[name].IntValue)
|
||||
{
|
||||
_items[name].IntValue = num;
|
||||
isChanged = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "Double":
|
||||
{
|
||||
var num2 = Convert.ToDouble(value);
|
||||
if (Math.Abs(num2 - _items[name].DoubleValue) > 0.0001)
|
||||
{
|
||||
_items[name].DoubleValue = num2;
|
||||
isChanged = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "String":
|
||||
if (value != _items[name].StringValue)
|
||||
{
|
||||
_items[name].StringValue = value;
|
||||
isChanged = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (isChanged)
|
||||
{
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -538,11 +416,10 @@ namespace MECF.Framework.Common.SCCore
|
|||
{
|
||||
Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);
|
||||
Debug.Assert(_items[name].Type == "Bool", "sc type not bool, defined as" + _items[name].Type);
|
||||
if (value != _items[name].BoolValue)
|
||||
|
||||
if (_items[name].SetValue(value))
|
||||
{
|
||||
_items[name].BoolValue = value;
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -550,11 +427,9 @@ namespace MECF.Framework.Common.SCCore
|
|||
{
|
||||
Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);
|
||||
Debug.Assert(_items[name].Type == "Integer", "sc type not bool, defined as" + _items[name].Type);
|
||||
if (value != _items[name].IntValue)
|
||||
if (_items[name].SetValue(value))
|
||||
{
|
||||
_items[name].IntValue = value;
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -562,22 +437,18 @@ namespace MECF.Framework.Common.SCCore
|
|||
{
|
||||
Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);
|
||||
Debug.Assert(_items[name].Type == "Double", "sc type not bool, defined as" + _items[name].Type);
|
||||
if (Math.Abs(value - _items[name].DoubleValue) > 0.0001)
|
||||
if (_items[name].SetValue(value))
|
||||
{
|
||||
_items[name].DoubleValue = value;
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetItemValue(string name, string value)
|
||||
{
|
||||
Debug.Assert(_items.ContainsKey(name), "can not find sc name, " + name);
|
||||
if (value != _items[name].StringValue)
|
||||
if (_items[name].SetValue(value))
|
||||
{
|
||||
_items[name].StringValue = value;
|
||||
GenerateDataFile();
|
||||
HandleValueChanged(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -588,30 +459,21 @@ namespace MECF.Framework.Common.SCCore
|
|||
/// <param name="callback"></param>
|
||||
public void RegisterValueChangedCallback(string name, Action<object> callback)
|
||||
{
|
||||
if (_dicValueChangedCallback.TryGetValue(name, out var actions))
|
||||
actions.Add(callback);
|
||||
else
|
||||
_dicValueChangedCallback.Add(name, new List<Action<object>>(new[] { callback }));
|
||||
if (_items.TryGetValue(name, out var scItem))
|
||||
{
|
||||
scItem.OnValueChanged += (sender, newValue) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
callback.Invoke(newValue);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LOG.Write(ex);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleValueChanged<T>(string name, T newValue)
|
||||
{
|
||||
if (_dicValueChangedCallback.TryGetValue(name, out var actions))
|
||||
{
|
||||
actions.ForEach(a =>
|
||||
{
|
||||
try
|
||||
{
|
||||
a.Invoke(newValue);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LOG.Error(ex.Message, ex);
|
||||
EV.PostWarningLog(ModuleName.System.ToString(), $"Callback function for '{name}' error");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
|
|
@ -74,19 +74,19 @@ namespace MECF.Framework.RT.Core.Backend
|
|||
ReloadCommand = new DelegateCommand<string>(Reload);
|
||||
}
|
||||
|
||||
private void SetSc(string obj)
|
||||
private void SetSc(string name)
|
||||
{
|
||||
NotifiableSCConfigItem item = ScItemList.First(x => x.PathName == obj);
|
||||
NotifiableSCConfigItem item = ScItemList.First(x => x.PathName == name);
|
||||
|
||||
if (item.Type != SCConfigType.String.ToString() && string.IsNullOrEmpty(item.SetPoint))
|
||||
return;
|
||||
|
||||
SC.SetItemValueFromString(obj, item.SetPoint == null ? "" : item.SetPoint);
|
||||
SC.SetItemValue(name, item.SetPoint == null ? "" : item.SetPoint);
|
||||
|
||||
item.BoolValue = SC.GetConfigItem(obj).BoolValue;
|
||||
item.IntValue = SC.GetConfigItem(obj).IntValue;
|
||||
item.StringValue = SC.GetConfigItem(obj).StringValue;
|
||||
item.DoubleValue = SC.GetConfigItem(obj).DoubleValue;
|
||||
item.BoolValue = SC.GetConfigItem(name).BoolValue;
|
||||
item.IntValue = SC.GetConfigItem(name).IntValue;
|
||||
item.StringValue = SC.GetConfigItem(name).StringValue;
|
||||
item.DoubleValue = SC.GetConfigItem(name).DoubleValue;
|
||||
item.InvokePropertyChanged(nameof(item.Value));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue