using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Persistent.Reservoirs;
using MECF.Framework.Common.RecipeCenter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Devices.Reservoir
{
public class ReservoirDiReplenHelper
{
#region 内部变量
///
/// 模块名称
///
private string _module;
///
/// 持久化对象
///
private ReservoirsPersistentValue _persistentValue;
///
/// 锁
///
private object _locker = new object();
#endregion
///
/// 构造函数
///
///
///
///
public ReservoirDiReplenHelper(string module,ReservoirsPersistentValue persistentValue)
{
_module = module;
_persistentValue = persistentValue;
}
///
/// 监控
///
public void MonitorPeriodTime()
{
double levelHysteresis = SC.GetValue("Reservoir.LevelHysteresis");
double diValveMaxOnTimePeriod = SC.GetValue($"Reservoir.{_module}.DIValveMaxOnTimePeriod");
//没有在注水
if (_persistentValue != null && !_persistentValue.IsDiReplenOn)
{
//超过时间
if (DateTime.Now.Subtract(_persistentValue.PeriodStartTime).TotalMinutes >= diValveMaxOnTimePeriod * 60)
{
_persistentValue.PeriodStartTime = DateTime.Now;
_persistentValue.TotalReplen = 0;
_persistentValue.LastTotalReplen = 0;
ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module);
}
}
}
///
/// 监控手动注水
///
public bool MonitorManualDiReplenComplete(int replenSecond, Func direplenOffAction)
{
lock (_locker)
{
_persistentValue.TotalReplen = _persistentValue.LastTotalReplen + (int)DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds;
}
if(DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds >= replenSecond)
{
bool result = direplenOffAction("",null);
if(result)
{
_persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
_persistentValue.IsDiReplenOn = false;
ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module);
LOG.WriteLog(eEvent.INFO_RESERVOIR, _module, "Manual Direplen complete");
}
return result;
}
return false;
}
///
/// 单次自动注水超时
///
///
public bool AutoDiReplenMonitorTimeOut(Func direplenOffAction)
{
lock (_locker)
{
_persistentValue.TotalReplen = _persistentValue.LastTotalReplen+(int)DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds;
}
double diValveMaxOnTimePerFill = SC.GetValue($"Reservoir.{_module}.DIValveMaxOnTimePerFill");
if(DateTime.Now.Subtract(_persistentValue.DiReplenTime).TotalSeconds >= diValveMaxOnTimePerFill * 60)
{
bool result = direplenOffAction("", null);
if(result)
{
LOG.WriteLog(eEvent.WARN_RESERVOIR, _module, $"Direplen time over {diValveMaxOnTimePerFill}");
_persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
_persistentValue.IsDiReplenOn = false;
ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module);
}
return result;
}
return false;
}
///
/// 自动注水是否结束
///
///
///
///
///
public bool AutoDiReplenMonitorComplete(double level,double recipeLevel,ResRecipe _recipe,Func direplenOffAction)
{
double levelHysteresis = SC.GetValue("Reservoir.LevelHysteresis");
//按液位补水
if (_recipe.DIReplenEnable && _recipe.DIReplenTimeRate == 0 && _recipe.DIReplenCurrentRate == 0 &&
level >= recipeLevel)
{
LOG.WriteLog(eEvent.INFO_RESERVOIR, _module, "Auto replen complete");
bool result= direplenOffAction("",null);
if(result)
{
_persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
_persistentValue.IsDiReplenOn = false;
ReservoirsPersistentManager.Instance.UpdatePersistentValue(_module);
}
}
return false;
}
}
}