using Bro.Common.Interface;
|
using Newtonsoft.Json;
|
using System;
|
using System.Threading;
|
|
namespace Bro.Common.Base
|
{
|
public class InputConfigBase : IInputConfig
|
{
|
//public InputConfigBase()
|
//{
|
// StateMachine.OnDeviceInput += OnDeviceInput;
|
//}
|
|
//[JsonIgnore]
|
//public AutoResetEvent InputHanlder { get; set; } = new AutoResetEvent(false);
|
|
// [JsonIgnore]
|
//public string IConfigId = Guid.NewGuid().ToString();
|
|
//[JsonIgnore]
|
//public Dictionary<string, AutoResetEvent> InputHanlderDict { get; set; } = new Dictionary<string, AutoResetEvent>();
|
|
//[JsonIgnore]
|
//public Dictionary<string, bool> InputFlagDict { get; set; } = new Dictionary<string, bool>();
|
|
//[JsonIgnore]
|
//public ConcurrentDictionary<string, AutoResetEvent> InputHanlderDict { get; set; } = new ConcurrentDictionary<string, AutoResetEvent>();
|
|
//[JsonIgnore]
|
//public ConcurrentDictionary<string, bool> InputFlagDict { get; set; } = new ConcurrentDictionary<string, bool>();
|
|
[JsonIgnore]
|
public bool BoundFlag { get; set; } = false;
|
|
public bool IsInputNeed { get; set; } = false;
|
|
public string InputMethodName { get; set; }
|
|
/// <summary>
|
/// 第三方设备输入参数
|
/// </summary>
|
[JsonIgnore]
|
public dynamic InputPara { get; set; }
|
|
private string processId;
|
[JsonIgnore]
|
public string ProcessId
|
{
|
get
|
{
|
return processId;
|
}
|
set
|
{
|
if (processId != value)
|
{
|
//仅在工序编号赋值后建立消息连接
|
processId = value;
|
|
//if (conn == null)
|
//{
|
// conn = new HubConnection(GlobalVar.SignalRServer);
|
|
// proxy = conn.CreateHubProxy("DeviceHub");
|
// proxy.On<InputPara>("OnDeviceInput", OnDeviceInput);
|
|
// conn.Start().Wait();
|
//}
|
//lock (this)
|
{
|
//InputHanlderDict[processId] = new AutoResetEvent(false);
|
//InputFlagDict[processId] = false;
|
//InputHanlderDict.AddOrUpdate(processId, new AutoResetEvent(false), (a, b) => { return new AutoResetEvent(false); });
|
//InputFlagDict.AddOrUpdate(processId, false, (a, b) => { return false; });
|
|
InputHandle = new AutoResetEvent(false);
|
//StateMachine.OnDeviceInput += OnDeviceInput;
|
}
|
|
//if (StateMachine.OnDeviceInput != null)
|
//{
|
// var list = StateMachine.OnDeviceInput.GetInvocationList().ToList();
|
// if (list != null)
|
// {
|
// if (!list.Any(d =>
|
// {
|
// InputConfigBase icb = d.Target as InputConfigBase;
|
// return icb.ProcessId == ProcessId;
|
// }))
|
// {
|
// StateMachine.OnDeviceInput += OnDeviceInput;
|
// }
|
// }
|
// else
|
// {
|
// StateMachine.OnDeviceInput += OnDeviceInput;
|
// }
|
//}
|
//else
|
//{
|
//StateMachine.OnDeviceInput += OnDeviceInput;
|
//PubSubCenter.GetInstance().Subscribe(processId, OnDeviceInput);
|
//}
|
}
|
}
|
}
|
|
[JsonIgnore]
|
public AutoResetEvent InputHandle { get; set; } = new AutoResetEvent(false);
|
|
public string ProcessName { get; set; }
|
|
|
|
//HubConnection conn;
|
//IHubProxy proxy;
|
|
/// <summary>
|
/// 适用于第三方的信号输入
|
/// </summary>
|
/// <param name="obj"></param>
|
//private object OnDeviceInput(ISubscriber sub, object param1, object param2)
|
private void OnDeviceInput(InputPara obj)
|
{
|
//Debug.WriteLine(DateTime.Now.ToString("mm:ss.fff") + "\t输入流程:" + obj.ProcessId + ";\t本流程编号:" + ProcessId);
|
//输入参数必须有一个字段是ProcessId,保存工序编号
|
//string processId = obj.ProcessId;
|
|
//if (obj.ProcessId == ProcessId)
|
//{
|
// InputPara = obj.ParaObj;
|
// InputHanlderDict[].Set();
|
// BoundFlag = false;
|
//}
|
|
//InputPara obj = param1 as InputPara;
|
|
//lock (this)
|
{
|
try
|
{
|
//if (InputHanlderDict.Keys.Contains(obj.ProcessId))
|
if (ProcessId == obj.ProcessId)
|
{
|
//Debug.WriteLine(DateTime.Now.ToString("mm:ss.fff") + "\t流程编号:" + obj.ProcessId);
|
//InputHanlderDict[obj.ProcessId].Set();
|
//InputFlagDict[obj.ProcessId] = true;
|
InputHandle.Set();
|
//InputHanlderDict.Remove(obj.ProcessId);
|
//StateMachine.OnDeviceInput -= OnDeviceInput;
|
//PubSubCenter.GetInstance().RemoveSubscriber(ProcessId, OnDeviceInput);
|
}
|
}
|
catch (Exception)
|
{
|
}
|
|
//return null;
|
}
|
}
|
|
public virtual void Dispose()
|
{
|
//foreach (var handle in InputHanlderDict)
|
//{
|
// handle.Value.Set();
|
//}
|
|
//StateMachine.OnDeviceInput -= OnDeviceInput;
|
|
//InputHanlderDict = new ConcurrentDictionary<string, AutoResetEvent>();
|
//InputFlagDict = new ConcurrentDictionary<string, bool>();
|
|
//GC.Collect();
|
}
|
|
}
|
|
[Serializable]
|
public class InputPara : IProcessID
|
{
|
public string ProcessId { get; set; }
|
|
//[DataMember]
|
public dynamic ParaObj { get; set; }
|
|
public string ProcessName { get; set; }
|
}
|
}
|