SCConfigItem对象新增函数SafeSetValue和SetValue,用于处理系统设置项参数写入逻辑;从SystemConfigManager中移除相关逻辑,以简化代码。
SCConfigItem中新增OnValueChanged事件,设置值发生变化时的回调函数在此处理,不再有SystemConfigManager处理,以简化代码结构。
移除ISCManager接口及其实现中的SetItemValueStringFormat和SetItemValueFromString函数。
This commit is contained in:
DESKTOP-1N1NK8A\auvkk 2023-04-20 15:03:58 +08:00
parent 76467deb9b
commit b5dd5532ea
5 changed files with 129 additions and 197 deletions

View File

@ -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);

View File

@ -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
}
}

View File

@ -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);

View File

@ -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
}

View File

@ -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));
}