修改与网口通信相关代码
This commit is contained in:
parent
e75f04beaf
commit
ee624a7c0d
|
@ -98,6 +98,7 @@ namespace DM_Weight
|
||||||
|
|
||||||
// 串口工具
|
// 串口工具
|
||||||
containerRegistry.RegisterSingleton<PortUtil>();
|
containerRegistry.RegisterSingleton<PortUtil>();
|
||||||
|
containerRegistry.RegisterSingleton<SocketHelper>();
|
||||||
// 指纹机工具
|
// 指纹机工具
|
||||||
containerRegistry.RegisterSingleton<FingerprintUtil>();
|
containerRegistry.RegisterSingleton<FingerprintUtil>();
|
||||||
// 组态屏工具
|
// 组态屏工具
|
||||||
|
|
|
@ -67,13 +67,16 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Common.Logging" Version="3.4.1" />
|
||||||
<PackageReference Include="FluentModbus" Version="5.3.0" />
|
<PackageReference Include="FluentModbus" Version="5.3.0" />
|
||||||
<PackageReference Include="log4net" Version="2.0.15" />
|
<PackageReference Include="log4net" Version="2.0.15" />
|
||||||
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
|
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
|
||||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />
|
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />
|
||||||
|
<PackageReference Include="Mina" Version="2.0.12" />
|
||||||
<PackageReference Include="NModbus4.NetCore" Version="2.0.1" />
|
<PackageReference Include="NModbus4.NetCore" Version="2.0.1" />
|
||||||
<PackageReference Include="Polly" Version="8.4.1" />
|
<PackageReference Include="Polly" Version="8.4.1" />
|
||||||
<PackageReference Include="Prism.Unity" Version="8.1.97" />
|
<PackageReference Include="Prism.Unity" Version="8.1.97" />
|
||||||
|
<PackageReference Include="SharpPromise" Version="1.7.0" />
|
||||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
|
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
|
||||||
<PackageReference Include="SuperSimpleTcp" Version="3.0.10" />
|
<PackageReference Include="SuperSimpleTcp" Version="3.0.10" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
||||||
|
|
|
@ -19,15 +19,15 @@ namespace DM_Weight.Finger
|
||||||
public class FingerprintUtil
|
public class FingerprintUtil
|
||||||
{
|
{
|
||||||
|
|
||||||
private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil));
|
private static ILog logger = LogManager.GetLogger(typeof(FingerprintUtil));
|
||||||
public zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass();
|
public static zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass();
|
||||||
public bool bIsConnected = false;
|
public static bool bIsConnected = false;
|
||||||
|
|
||||||
private string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString();
|
private static string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString();
|
||||||
private int fingerPort = 4370;
|
private static int fingerPort = 4370;
|
||||||
private int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString());
|
private static int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString());
|
||||||
private int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString());
|
private static int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString());
|
||||||
private readonly IEventAggregator _eventAggregator;
|
private static IEventAggregator _eventAggregator;
|
||||||
public FingerprintUtil(IEventAggregator eventAggregator)
|
public FingerprintUtil(IEventAggregator eventAggregator)
|
||||||
{
|
{
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
|
@ -38,7 +38,7 @@ namespace DM_Weight.Finger
|
||||||
//});
|
//});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ConnectionMain()
|
public static void ConnectionMain()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -49,13 +49,15 @@ namespace DM_Weight.Finger
|
||||||
{
|
{
|
||||||
if (axCZKEM1.RegEvent(machineNumber, 9))
|
if (axCZKEM1.RegEvent(machineNumber, 9))
|
||||||
{
|
{
|
||||||
this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
|
axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
|
||||||
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
|
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
|
||||||
this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
|
axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.Info($"连接指纹机2");
|
||||||
|
|
||||||
_eventAggregator.GetEvent<FingerprintEvent>().Publish(new FingerprintMsg()
|
_eventAggregator.GetEvent<FingerprintEvent>().Publish(new FingerprintMsg()
|
||||||
{
|
{
|
||||||
Message = "CONNECT",
|
Message = "CONNECT",
|
||||||
|
@ -70,13 +72,13 @@ namespace DM_Weight.Finger
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用于退出登录重连指纹机
|
/// 用于退出登录重连指纹机
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void FingerDisconnect()
|
public static void FingerDisconnect()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
axCZKEM1.Disconnect();
|
axCZKEM1.Disconnect();
|
||||||
this.axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
|
axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
|
||||||
this.axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
|
axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
|
||||||
ConnectionMain();
|
ConnectionMain();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -87,7 +89,7 @@ namespace DM_Weight.Finger
|
||||||
}
|
}
|
||||||
|
|
||||||
//If your fingerprint(or your card) passes the verification,this event will be triggered
|
//If your fingerprint(or your card) passes the verification,this event will be triggered
|
||||||
private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode)
|
private static void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode)
|
||||||
{
|
{
|
||||||
FingerprintMsg message = new FingerprintMsg()
|
FingerprintMsg message = new FingerprintMsg()
|
||||||
{
|
{
|
||||||
|
@ -100,7 +102,7 @@ namespace DM_Weight.Finger
|
||||||
}
|
}
|
||||||
|
|
||||||
//When you are enrolling your finger,this event will be triggered.
|
//When you are enrolling your finger,this event will be triggered.
|
||||||
private void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
|
private static void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
|
||||||
{
|
{
|
||||||
FingerprintMsg message = new FingerprintMsg()
|
FingerprintMsg message = new FingerprintMsg()
|
||||||
{
|
{
|
||||||
|
@ -117,7 +119,7 @@ namespace DM_Weight.Finger
|
||||||
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
|
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
|
private static void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
|
||||||
{
|
{
|
||||||
FingerprintMsg message = new FingerprintMsg()
|
FingerprintMsg message = new FingerprintMsg()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
using Common.Logging;
|
||||||
|
using Mina.Core.Future;
|
||||||
|
using Mina.Filter.Codec;
|
||||||
|
using Mina.Transport.Socket;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
public class FingerHelper
|
||||||
|
{
|
||||||
|
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
|
||||||
|
AsyncSocketConnector acceptor = new AsyncSocketConnector();
|
||||||
|
IConnectFuture iConnectFuture;
|
||||||
|
string ip = ConfigurationManager.AppSettings["fingerIp"].ToString();
|
||||||
|
public FingerHelper()
|
||||||
|
{
|
||||||
|
acceptor.ExceptionCaught += (o, e) => logger.Error(e.Exception);
|
||||||
|
|
||||||
|
//acceptor.FilterChain.AddLast("logger", new LoggingFilter());
|
||||||
|
acceptor.FilterChain.AddLast("encoding", new ProtocolCodecFilter(new MyMinaCodecFactory()));
|
||||||
|
|
||||||
|
acceptor.SessionIdle += (o, e) => logger.Info("IDLE " + e.Session.GetIdleCount(e.IdleStatus));
|
||||||
|
|
||||||
|
acceptor.MessageReceived += (o, e) =>
|
||||||
|
{
|
||||||
|
logger.Info("MessageReceived>>>>>>>>>>>>>>>>");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
acceptor.SessionClosed += (o, e) =>
|
||||||
|
{
|
||||||
|
logger.Info("SessionClosed");
|
||||||
|
Task.Delay(50).Wait();
|
||||||
|
SocketConnect();
|
||||||
|
};
|
||||||
|
this.SocketConnect();
|
||||||
|
}
|
||||||
|
public void SocketConnect()
|
||||||
|
{
|
||||||
|
iConnectFuture = acceptor.Connect(new IPEndPoint(IPAddress.Parse(ip), 4370)).Await();
|
||||||
|
|
||||||
|
Console.WriteLine(iConnectFuture.Connected.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendMessage(MyBaseMessage baseMessage)
|
||||||
|
{
|
||||||
|
iConnectFuture.Session.Write(baseMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using DM_Weight.msg;
|
using DM_Weight.Finger;
|
||||||
|
using DM_Weight.msg;
|
||||||
using DM_Weight.ViewModels;
|
using DM_Weight.ViewModels;
|
||||||
using log4net;
|
using log4net;
|
||||||
using log4net.Repository.Hierarchy;
|
using log4net.Repository.Hierarchy;
|
||||||
|
@ -30,11 +31,14 @@ namespace DM_Weight.Port
|
||||||
private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel));
|
private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel));
|
||||||
string ip = ConfigurationManager.AppSettings["modbusIp"].ToString();
|
string ip = ConfigurationManager.AppSettings["modbusIp"].ToString();
|
||||||
int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]);
|
int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]);
|
||||||
|
private static object _lock = new object();
|
||||||
public static bool BoxOperate { get; set; }
|
public static bool BoxOperate { get; set; }
|
||||||
private ModbusHelper()
|
private ModbusHelper()
|
||||||
{
|
{
|
||||||
logger.Info("ModbusHelper");
|
logger.Info("ModbusHelper");
|
||||||
|
|
||||||
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port);
|
socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port);
|
||||||
|
|
||||||
//socket = CreateSocket();
|
//socket = CreateSocket();
|
||||||
client = new TcpClient();
|
client = new TcpClient();
|
||||||
client.Client = socket;
|
client.Client = socket;
|
||||||
|
@ -43,11 +47,14 @@ namespace DM_Weight.Port
|
||||||
}
|
}
|
||||||
public static ModbusHelper GetInstance()
|
public static ModbusHelper GetInstance()
|
||||||
{
|
{
|
||||||
if (instance == null)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
instance = new ModbusHelper();
|
if (instance == null)
|
||||||
|
{
|
||||||
|
instance = new ModbusHelper();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
return instance;
|
|
||||||
}
|
}
|
||||||
private void SetModusIpMaster()
|
private void SetModusIpMaster()
|
||||||
{
|
{
|
||||||
|
@ -102,74 +109,82 @@ namespace DM_Weight.Port
|
||||||
// }
|
// }
|
||||||
// return flags;
|
// return flags;
|
||||||
// });
|
// });
|
||||||
bool successFlag = true;
|
lock (_lock)
|
||||||
bool[] bools = new bool[18];
|
|
||||||
int iCount = 0;
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
try
|
bool successFlag = true;
|
||||||
|
bool[] bools = new bool[18];
|
||||||
|
int iCount = 0;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
bool[] flags = new bool[18];
|
try
|
||||||
if (master == null)
|
|
||||||
{
|
{
|
||||||
|
bool[] flags = new bool[18];
|
||||||
|
if (master == null)
|
||||||
|
{
|
||||||
|
this.SetModusIpMaster();
|
||||||
|
}
|
||||||
|
var result = master.ReadInputRegisters(1, 0x0033, 2);
|
||||||
|
var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0');
|
||||||
|
var r2 = r1.ToCharArray();
|
||||||
|
logger.Info("r2=>" + string.Join(", ", r2));
|
||||||
|
//var r2=new char[18] { '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
|
||||||
|
for (int i = 0; i < 18; i++)
|
||||||
|
{
|
||||||
|
bools[i] = r2[17 - i] == '1' ? true : false;
|
||||||
|
}
|
||||||
|
logger.Info($"获取所有箱子门状态返回:{string.Join(',', bools)};");
|
||||||
|
successFlag = true;
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
if (iCount >= 3)
|
||||||
|
break;
|
||||||
|
iCount++;
|
||||||
|
successFlag = false;
|
||||||
|
this.Dispose();
|
||||||
|
//Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception);
|
||||||
|
logger.Info($"获取所有箱子门状态出错,第{iCount}次重试,异常信息{exception}");
|
||||||
|
Thread.Sleep(500);
|
||||||
this.SetModusIpMaster();
|
this.SetModusIpMaster();
|
||||||
|
BoxOperate = false;
|
||||||
|
FingerprintUtil.FingerDisconnect();
|
||||||
}
|
}
|
||||||
var result = master.ReadInputRegisters(1, 0x0033, 2);
|
} while (!successFlag);
|
||||||
var r1 = Convert.ToString(((int)result[0] >> 14) | ((int)result[1] << 2), 2).PadLeft(18, '0');
|
return bools;
|
||||||
var r2 = r1.ToCharArray();
|
}
|
||||||
logger.Info("r2=>" + string.Join(", ", r2));
|
|
||||||
//var r2=new char[18] { '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' };
|
|
||||||
for (int i = 0; i < 18; i++)
|
|
||||||
{
|
|
||||||
bools[i] = r2[17 - i] == '1' ? true : false;
|
|
||||||
}
|
|
||||||
logger.Info($"获取所有箱子门状态返回:{string.Join(',', bools)};");
|
|
||||||
successFlag = true;
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
if (iCount >= 3)
|
|
||||||
break;
|
|
||||||
iCount++;
|
|
||||||
successFlag = false;
|
|
||||||
this.Dispose();
|
|
||||||
//Debug.WriteLine($"获取所有箱子门状态出错,第{retryCount}次重试", exception);
|
|
||||||
logger.Info($"获取所有箱子门状态出错,第{iCount}次重试,异常信息{exception}");
|
|
||||||
Thread.Sleep(500);
|
|
||||||
this.SetModusIpMaster();
|
|
||||||
BoxOperate = false;
|
|
||||||
}
|
|
||||||
} while (!successFlag);
|
|
||||||
return bools;
|
|
||||||
}
|
}
|
||||||
public bool OpenBoxDoor(int boxNum)
|
public bool OpenBoxDoor(int boxNum)
|
||||||
{
|
{
|
||||||
BoxOperate = true;
|
lock (_lock)
|
||||||
//if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
|
|
||||||
//{
|
|
||||||
// return true;
|
|
||||||
//}
|
|
||||||
bool bFlag = false;
|
|
||||||
Thread.Sleep(50);
|
|
||||||
Policy.Handle<Exception>().Retry(3, ((exception, retryCount) =>
|
|
||||||
{
|
{
|
||||||
this.Dispose();
|
BoxOperate = true;
|
||||||
//Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception);
|
//if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
|
||||||
logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}");
|
//{
|
||||||
//SpeakAsync("药箱连接失败,正在尝试重新打开");
|
// return true;
|
||||||
Thread.Sleep(500);
|
//}
|
||||||
this.SetModusIpMaster();
|
bool bFlag = false;
|
||||||
//return TimeSpan.FromSeconds (1);
|
Thread.Sleep(50);
|
||||||
})).Execute(() =>
|
Policy.Handle<Exception>().Retry(3, ((exception, retryCount) =>
|
||||||
{
|
{
|
||||||
logger.Info($"正在打开{boxNum}号药箱");
|
this.Dispose();
|
||||||
master.WriteSingleRegister(1, (ushort)boxNum, 0);
|
//Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception);
|
||||||
logger.Info($"开门指令已发送{(ushort)boxNum}");
|
logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}");
|
||||||
SpeakAsync("药箱已打开,请及时关闭");
|
//SpeakAsync("药箱连接失败,正在尝试重新打开");
|
||||||
//Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
|
Thread.Sleep(500);
|
||||||
bFlag = true;
|
this.SetModusIpMaster();
|
||||||
});
|
//return TimeSpan.FromSeconds (1);
|
||||||
return bFlag;
|
})).Execute(() =>
|
||||||
|
{
|
||||||
|
logger.Info($"正在打开{boxNum}号药箱");
|
||||||
|
master.WriteSingleRegister(1, (ushort)boxNum, 20);
|
||||||
|
logger.Info($"开门指令已发送{(ushort)boxNum}");
|
||||||
|
SpeakAsync("请及时关闭药箱");
|
||||||
|
//Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
|
||||||
|
bFlag = true;
|
||||||
|
FingerprintUtil.FingerDisconnect();
|
||||||
|
});
|
||||||
|
return bFlag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private void Dispose()
|
private void Dispose()
|
||||||
{
|
{
|
||||||
|
@ -181,6 +196,7 @@ namespace DM_Weight.Port
|
||||||
private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
|
private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
|
||||||
public static void SpeakAsync(string textinfo)
|
public static void SpeakAsync(string textinfo)
|
||||||
{
|
{
|
||||||
|
speechSynthesizer.Rate = 2;
|
||||||
speechSynthesizer.SpeakAsync(textinfo);
|
speechSynthesizer.SpeakAsync(textinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
public class MyBaseMessage
|
||||||
|
{
|
||||||
|
public int addr { get; set; } = 1;
|
||||||
|
public short lockNo { get; set; }
|
||||||
|
public short delay { get; set; } = 20;
|
||||||
|
public int functionCode { get; set; } = 6;
|
||||||
|
|
||||||
|
|
||||||
|
public MyBaseMessage() { }
|
||||||
|
public MyBaseMessage(short lockNo, int addr = 1, short delay = 20, int functionCode = 6)
|
||||||
|
{
|
||||||
|
this.addr = addr;
|
||||||
|
this.lockNo = lockNo;
|
||||||
|
this.delay = delay;
|
||||||
|
this.functionCode = functionCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
using Mina.Filter.Codec.Demux;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
public class MyMinaCodecFactory : DemuxingProtocolCodecFactory
|
||||||
|
{
|
||||||
|
|
||||||
|
public MyMinaCodecFactory()
|
||||||
|
{
|
||||||
|
AddMessageEncoder(new MyMinaEncoder());
|
||||||
|
AddMessageDecoder(new MyMinaDecoder());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
using log4net;
|
||||||
|
using Mina.Core.Buffer;
|
||||||
|
using Mina.Core.Session;
|
||||||
|
using Mina.Filter.Codec;
|
||||||
|
using Mina.Filter.Codec.Demux;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
internal class MyMinaDecoder : IMessageDecoder
|
||||||
|
{
|
||||||
|
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
|
||||||
|
public MessageDecoderResult Decodable(IoSession session, IoBuffer input)
|
||||||
|
{
|
||||||
|
logger.Info("Decodable");
|
||||||
|
return MessageDecoderResult.OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageDecoderResult Decode(IoSession session, IoBuffer input, IProtocolDecoderOutput output)
|
||||||
|
{
|
||||||
|
|
||||||
|
logger.Info("Decode");
|
||||||
|
int length = input.Remaining;
|
||||||
|
byte functionCode = input.Get(7);
|
||||||
|
if (functionCode == 4)
|
||||||
|
{
|
||||||
|
int a = input.Get(length - 2);
|
||||||
|
int b = input.Get(length - 1);
|
||||||
|
Console.WriteLine("a");
|
||||||
|
Console.WriteLine(a);
|
||||||
|
Console.WriteLine("b");
|
||||||
|
Console.WriteLine(b);
|
||||||
|
var r = Convert.ToString((a >> 14) | (b << 2), 2).PadLeft(18, '0').ToCharArray();
|
||||||
|
bool f = r.Any(c => c == '1');
|
||||||
|
output.Write(f);
|
||||||
|
}
|
||||||
|
input.Position = length;
|
||||||
|
return MessageDecoderResult.OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FinishDecode(IoSession session, IProtocolDecoderOutput output)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
using Mina.Core.Buffer;
|
||||||
|
using Mina.Core.Session;
|
||||||
|
using Mina.Filter.Codec;
|
||||||
|
using Mina.Filter.Codec.Demux;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
public class MyMinaEncoder : IMessageEncoder<MyBaseMessage>
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
private short accumulate = 0;
|
||||||
|
public void Encode(IoSession session, MyBaseMessage message, IProtocolEncoderOutput output)
|
||||||
|
{
|
||||||
|
IoBuffer input = IoBuffer.Allocate(12);
|
||||||
|
input.AutoExpand = true;
|
||||||
|
input.PutInt16(accumulate);
|
||||||
|
input.PutInt16(0);
|
||||||
|
input.PutInt16(6);
|
||||||
|
input.Put((byte)message.addr);
|
||||||
|
// 功能码
|
||||||
|
input.Put((byte)message.functionCode);
|
||||||
|
// 锁号
|
||||||
|
input.PutInt16(message.lockNo);
|
||||||
|
// 开锁时间
|
||||||
|
input.PutInt16(message.delay);
|
||||||
|
input.Flip();
|
||||||
|
accumulate += 1;
|
||||||
|
session.Write(input);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Encode(IoSession session, object message, IProtocolEncoderOutput output)
|
||||||
|
{
|
||||||
|
IoBuffer input = IoBuffer.Allocate(12);
|
||||||
|
input.AutoExpand = true;
|
||||||
|
if (message is MyBaseMessage)
|
||||||
|
{
|
||||||
|
var m = message as MyBaseMessage;
|
||||||
|
input.PutInt16(accumulate);
|
||||||
|
input.PutInt16(0);
|
||||||
|
input.PutInt16(6);
|
||||||
|
input.Put((byte)m.addr);
|
||||||
|
// 功能码
|
||||||
|
input.Put((byte)m.functionCode);
|
||||||
|
// 锁号
|
||||||
|
input.PutInt16(m.lockNo);
|
||||||
|
// 开锁时间
|
||||||
|
input.PutInt16(m.delay);
|
||||||
|
input.Flip();
|
||||||
|
accumulate += 1;
|
||||||
|
}
|
||||||
|
session.Write(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
using DM_Weight.ViewModels;
|
||||||
|
using log4net;
|
||||||
|
using Mina.Core.Future;
|
||||||
|
using Mina.Filter.Codec;
|
||||||
|
using Mina.Filter.Logging;
|
||||||
|
using Mina.Transport.Socket;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.Port
|
||||||
|
{
|
||||||
|
public class SocketHelper
|
||||||
|
{
|
||||||
|
private readonly ILog logger = LogManager.GetLogger(typeof(SocketHelper));
|
||||||
|
AsyncSocketConnector acceptor = new AsyncSocketConnector();
|
||||||
|
IConnectFuture iConnectFuture;
|
||||||
|
public bool OpenStatus=false;
|
||||||
|
string ip = ConfigurationManager.AppSettings["modbusIp"].ToString();
|
||||||
|
int port =Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]);
|
||||||
|
public SocketHelper()
|
||||||
|
{
|
||||||
|
acceptor.ExceptionCaught += (o, e) => logger.Error(e.Exception);
|
||||||
|
|
||||||
|
//acceptor.FilterChain.AddLast("logger", new LoggingFilter());
|
||||||
|
acceptor.FilterChain.AddLast("encoding", new ProtocolCodecFilter(new MyMinaCodecFactory()));
|
||||||
|
|
||||||
|
acceptor.SessionIdle += (o, e) => logger.Info("IDLE " + e.Session.GetIdleCount(e.IdleStatus));
|
||||||
|
|
||||||
|
acceptor.MessageReceived += (o, e) =>
|
||||||
|
{
|
||||||
|
OpenStatus = (bool)e.Message;
|
||||||
|
logger.Info("MessageReceived>>>>>>>>>>>>>>>>" + OpenStatus);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
acceptor.SessionClosed += (o, e) =>
|
||||||
|
{
|
||||||
|
logger.Info("SessionClosed");
|
||||||
|
Task.Delay(50).Wait();
|
||||||
|
SocketConnect();
|
||||||
|
};
|
||||||
|
this.SocketConnect();
|
||||||
|
}
|
||||||
|
public void SocketConnect()
|
||||||
|
{
|
||||||
|
|
||||||
|
iConnectFuture = acceptor.Connect(new IPEndPoint(IPAddress.Parse(ip), port)).Await();
|
||||||
|
|
||||||
|
logger.Info(iConnectFuture.Connected.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendMessage(MyBaseMessage baseMessage)
|
||||||
|
{
|
||||||
|
iConnectFuture.Session.Write(baseMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -231,11 +231,13 @@ namespace DM_Weight.ViewModels
|
||||||
}
|
}
|
||||||
|
|
||||||
IEventAggregator _eventAggregator;
|
IEventAggregator _eventAggregator;
|
||||||
private PortUtil _portUtil;
|
//private PortUtil _portUtil;
|
||||||
public CheckOrderNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
|
SocketHelper _socketHelper;
|
||||||
|
public CheckOrderNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||||||
{
|
{
|
||||||
_portUtil = portUtil;
|
//_portUtil = portUtil;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
|
_socketHelper = socketHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 按钮归属变量
|
#region 按钮归属变量
|
||||||
|
@ -831,9 +833,9 @@ namespace DM_Weight.ViewModels
|
||||||
// Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
// Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
||||||
// return;
|
// return;
|
||||||
//}
|
//}
|
||||||
if (ModbusHelper.BoxOperate)
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
ModbusHelper.SpeakAsync("请关闭药箱后再打开");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DrawerNo = Convert.ToInt32(strDrawerNo);
|
DrawerNo = Convert.ToInt32(strDrawerNo);
|
||||||
|
@ -854,27 +856,62 @@ namespace DM_Weight.ViewModels
|
||||||
ModbusHelper.SpeakAsync($"正在打开{DrawerNo + 1}号药箱");
|
ModbusHelper.SpeakAsync($"正在打开{DrawerNo + 1}号药箱");
|
||||||
//记录开药箱日志
|
//记录开药箱日志
|
||||||
SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand();
|
SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand();
|
||||||
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo);
|
|
||||||
Task.Factory.StartNew(async () =>
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
|
||||||
|
_socketHelper.OpenStatus = true;
|
||||||
|
|
||||||
|
int i = 10;
|
||||||
|
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
|
||||||
{
|
{
|
||||||
bool loop = true;
|
i--;
|
||||||
while (loop)
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
await Task.Delay(5000);
|
|
||||||
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
bool state = Array.TrueForAll(boolsl, b => b == false);
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
|
||||||
if (state)
|
|
||||||
|
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
|
||||||
|
//bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
loop = false;
|
if (i == 0)
|
||||||
ModbusHelper.BoxOperate = false;
|
{
|
||||||
|
ModbusHelper.SpeakAsync("请及时关闭药箱");
|
||||||
|
i = 10;
|
||||||
|
}
|
||||||
|
next();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ModbusHelper.BoxOperate = true;
|
stop();
|
||||||
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stop();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo);
|
||||||
|
//Task.Factory.StartNew(async () =>
|
||||||
|
//{
|
||||||
|
// bool loop = true;
|
||||||
|
// while (loop)
|
||||||
|
// {
|
||||||
|
// await Task.Delay(5000);
|
||||||
|
// bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
|
// bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
// if (state)
|
||||||
|
// {
|
||||||
|
// loop = false;
|
||||||
|
// ModbusHelper.BoxOperate = false;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// ModbusHelper.BoxOperate = true;
|
||||||
|
// ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,8 +154,8 @@ namespace DM_Weight.ViewModels
|
||||||
}
|
}
|
||||||
private void SelectChildNavigate(PremissionDm SelectedChildMenu)
|
private void SelectChildNavigate(PremissionDm SelectedChildMenu)
|
||||||
{
|
{
|
||||||
if (!_portUtil.Operate)
|
//if (!_portUtil.Operate)
|
||||||
{
|
//{
|
||||||
if (SelectedChildMenu != null)
|
if (SelectedChildMenu != null)
|
||||||
{
|
{
|
||||||
if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
|
if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow"))
|
||||||
|
@ -233,7 +233,7 @@ namespace DM_Weight.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PremissionDm? SelectedMenu
|
public PremissionDm? SelectedMenu
|
||||||
|
@ -290,7 +290,7 @@ namespace DM_Weight.ViewModels
|
||||||
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
//bool allTrue = Array.TrueForAll(boolArrs, b => b);
|
//bool allTrue = Array.TrueForAll(boolArrs, b => b);
|
||||||
//false是关着,true是开着
|
//false是关着,true是开着
|
||||||
if (!ModbusHelper.BoxOperate)
|
if (!_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
logger.Info($"用户【{Operator?.Nickname}】退出登录");
|
logger.Info($"用户【{Operator?.Nickname}】退出登录");
|
||||||
Operator = null;
|
Operator = null;
|
||||||
|
@ -309,10 +309,10 @@ namespace DM_Weight.ViewModels
|
||||||
{
|
{
|
||||||
//SelectedMenu.Children = SelectedMenu.Children;
|
//SelectedMenu.Children = SelectedMenu.Children;
|
||||||
//SelectedChildMenu = SelectedMenu.Children[0];
|
//SelectedChildMenu = SelectedMenu.Children[0];
|
||||||
if (!_portUtil.Operate)
|
//if (!_portUtil.Operate)
|
||||||
{
|
//{
|
||||||
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
|
_regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#region 子菜单点击
|
#region 子菜单点击
|
||||||
|
@ -344,13 +344,15 @@ namespace DM_Weight.ViewModels
|
||||||
//private CHKFunction _chkFunction;
|
//private CHKFunction _chkFunction;
|
||||||
IEventAggregator _eventAggregator;
|
IEventAggregator _eventAggregator;
|
||||||
//private ModbusHelper _modbusHelper;
|
//private ModbusHelper _modbusHelper;
|
||||||
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IUnityContainer container, IDialogService dialogService, IEventAggregator eventAggregator)
|
SocketHelper _socketHelper;
|
||||||
|
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IUnityContainer container, IDialogService dialogService, IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||||||
{
|
{
|
||||||
_portUtil = portUtil;
|
_portUtil = portUtil;
|
||||||
_regionManager = iRegionManager;
|
_regionManager = iRegionManager;
|
||||||
_dialogService = dialogService;
|
_dialogService = dialogService;
|
||||||
_container = container;
|
_container = container;
|
||||||
this._eventAggregator = eventAggregator;
|
this._eventAggregator = eventAggregator;
|
||||||
|
_socketHelper = socketHelper;
|
||||||
//_chkFunction = cHKFunction;
|
//_chkFunction = cHKFunction;
|
||||||
//_modbusHelper = modbusHelper;
|
//_modbusHelper = modbusHelper;
|
||||||
}
|
}
|
||||||
|
@ -528,7 +530,7 @@ namespace DM_Weight.ViewModels
|
||||||
{
|
{
|
||||||
|
|
||||||
_eventAggregator.GetEvent<LoginOutEvent>().Subscribe(SetLoginOut);
|
_eventAggregator.GetEvent<LoginOutEvent>().Subscribe(SetLoginOut);
|
||||||
_portUtil.dateTime = DateTime.Now;
|
//_portUtil.dateTime = DateTime.Now;
|
||||||
//取出user
|
//取出user
|
||||||
UserList = navigationContext.Parameters.GetValue<UserList>("operator");
|
UserList = navigationContext.Parameters.GetValue<UserList>("operator");
|
||||||
Operator = UserList;
|
Operator = UserList;
|
||||||
|
|
|
@ -62,7 +62,7 @@ namespace DM_Weight.ViewModels
|
||||||
}
|
}
|
||||||
private HkcChangeShifts listHkcChangeShifts=new HkcChangeShifts();
|
private HkcChangeShifts listHkcChangeShifts=new HkcChangeShifts();
|
||||||
|
|
||||||
private FingerprintUtil _fingerprintUtil;
|
//private FingerprintUtil _fingerprintUtil;
|
||||||
|
|
||||||
private PortUtil _portUtil;
|
private PortUtil _portUtil;
|
||||||
|
|
||||||
|
@ -114,16 +114,17 @@ namespace DM_Weight.ViewModels
|
||||||
// _regionManager = regionManager;
|
// _regionManager = regionManager;
|
||||||
// _eventAggregator = eventAggregator;
|
// _eventAggregator = eventAggregator;
|
||||||
//}
|
//}
|
||||||
public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil, FingerprintUtil fingerprintUtil)
|
public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil)
|
||||||
{
|
{
|
||||||
_fingerprintUtil = fingerprintUtil;
|
//_fingerprintUtil = fingerprintUtil;
|
||||||
_portUtil = portUtil;
|
_portUtil = portUtil;
|
||||||
_regionManager = regionManager;
|
_regionManager = regionManager;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
FingerMsg = _fingerprintUtil.bIsConnected;
|
//FingerMsg = !_fingerprintUtil.bIsConnected;
|
||||||
|
FingerMsg = !FingerprintUtil.bIsConnected;
|
||||||
_eventAggregator.GetEvent<FingerprintEvent>().Subscribe(LoginEvent);
|
_eventAggregator.GetEvent<FingerprintEvent>().Subscribe(LoginEvent);
|
||||||
logger.Info($"LoginWindowViewModel;FingerMsg:{FingerMsg}");
|
logger.Info($"LoginWindowViewModel;FingerMsg:{FingerprintUtil.bIsConnected}");
|
||||||
_fingerprintUtil.FingerDisconnect();
|
//_fingerprintUtil.FingerDisconnect();
|
||||||
}
|
}
|
||||||
private DelegateCommand? _loginCommand;
|
private DelegateCommand? _loginCommand;
|
||||||
|
|
||||||
|
|
|
@ -62,17 +62,17 @@ namespace DM_Weight.ViewModels
|
||||||
// this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
|
// this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
|
||||||
// _screenUtil = screenUtil;
|
// _screenUtil = screenUtil;
|
||||||
//}
|
//}
|
||||||
//private FingerprintUtil _fingerprintUtil;
|
private FingerprintUtil _fingerprintUtil;
|
||||||
IRegionManager _regionManager;
|
IRegionManager _regionManager;
|
||||||
IUnityContainer _container;
|
IUnityContainer _container;
|
||||||
//private CHKFunction _cHKFunction;
|
//private CHKFunction _cHKFunction;
|
||||||
private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
|
private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
|
||||||
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator)
|
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil)
|
||||||
{
|
{
|
||||||
//_portUtil = portUtil;
|
//_portUtil = portUtil;
|
||||||
this.eventAggregator = eventAggregator;
|
this.eventAggregator = eventAggregator;
|
||||||
this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
|
this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
|
||||||
//_fingerprintUtil = fingerprintUtil;
|
_fingerprintUtil = fingerprintUtil;
|
||||||
_regionManager = regionManager;
|
_regionManager = regionManager;
|
||||||
_container = container;
|
_container = container;
|
||||||
//_cHKFunction = cHKFunction;
|
//_cHKFunction = cHKFunction;
|
||||||
|
@ -81,9 +81,9 @@ namespace DM_Weight.ViewModels
|
||||||
//{
|
//{
|
||||||
|
|
||||||
_container.RegisterType<object, LoginWindow>("LoginWindow");
|
_container.RegisterType<object, LoginWindow>("LoginWindow");
|
||||||
_regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow");
|
_regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow");
|
||||||
|
|
||||||
//}));
|
//}));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ using System.Windows.Media;
|
||||||
|
|
||||||
namespace DM_Weight.ViewModels
|
namespace DM_Weight.ViewModels
|
||||||
{
|
{
|
||||||
public class OpenBoxNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
|
public class OpenBoxNewWindowViewModel : BindableBase, IRegionMemberLifetime//, INavigationAware
|
||||||
{
|
{
|
||||||
//定时查询药箱状态
|
//定时查询药箱状态
|
||||||
//System.Timers.Timer StateTimer = new System.Timers.Timer(5000);
|
//System.Timers.Timer StateTimer = new System.Timers.Timer(5000);
|
||||||
|
@ -112,9 +112,11 @@ namespace DM_Weight.ViewModels
|
||||||
//public static int iNumber = 1;
|
//public static int iNumber = 1;
|
||||||
//private PortUtil _portUtil;
|
//private PortUtil _portUtil;
|
||||||
IEventAggregator _eventAggregator;
|
IEventAggregator _eventAggregator;
|
||||||
public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator)
|
SocketHelper _socketHelper;
|
||||||
|
public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||||||
{
|
{
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
|
_socketHelper = socketHelper;
|
||||||
}
|
}
|
||||||
#region 抽屉按钮
|
#region 抽屉按钮
|
||||||
private Brush _button1Color = Brushes.White;
|
private Brush _button1Color = Brushes.White;
|
||||||
|
@ -621,9 +623,9 @@ namespace DM_Weight.ViewModels
|
||||||
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
//bool allFalse = Array.TrueForAll(bools, b => b == false);
|
//bool allFalse = Array.TrueForAll(bools, b => b == false);
|
||||||
//if (!allFalse)
|
//if (!allFalse)
|
||||||
if (ModbusHelper.BoxOperate)
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
ModbusHelper.SpeakAsync("请关闭药箱后再打开");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iList = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo)
|
iList = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo)
|
||||||
|
@ -667,29 +669,63 @@ namespace DM_Weight.ViewModels
|
||||||
ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱");
|
ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱");
|
||||||
}
|
}
|
||||||
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
|
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
|
||||||
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
|
||||||
|
_socketHelper.OpenStatus = true;
|
||||||
|
|
||||||
Task.Factory.StartNew(async() =>
|
int i = 10;
|
||||||
|
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
|
||||||
{
|
{
|
||||||
bool loop = true;
|
i--;
|
||||||
while (loop)
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
await Task.Delay(5000);
|
|
||||||
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
bool state = Array.TrueForAll(boolsl, b => b == false);
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
|
||||||
if(state)
|
|
||||||
|
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
|
||||||
|
//bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
loop = false;
|
if (i == 0)
|
||||||
ModbusHelper.BoxOperate = false;
|
{
|
||||||
|
ModbusHelper.SpeakAsync("请及时关闭药箱");
|
||||||
|
i = 10;
|
||||||
|
}
|
||||||
|
next();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ModbusHelper.BoxOperate = true;
|
stop();
|
||||||
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stop();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//Task.Factory.StartNew(async() =>
|
||||||
|
//{
|
||||||
|
// int i = 0;
|
||||||
|
// while (_socketHelper.OpenStatus)
|
||||||
|
// {
|
||||||
|
// await Task.Delay(5000);
|
||||||
|
// //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
|
// _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
|
||||||
|
|
||||||
|
// //bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
// if(_socketHelper.OpenStatus&&i==0)
|
||||||
|
// {
|
||||||
|
// ModbusHelper.SpeakAsync("请及时关闭药箱");
|
||||||
|
// }
|
||||||
|
// i++;
|
||||||
|
// if(i==5)
|
||||||
|
// {
|
||||||
|
// i = 0;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//});
|
||||||
|
|
||||||
|
|
||||||
//StateTimer.Start();
|
//StateTimer.Start();
|
||||||
SelfStatus = 0;
|
SelfStatus = 0;
|
||||||
|
@ -714,29 +750,29 @@ namespace DM_Weight.ViewModels
|
||||||
// //Console.Beep(800, 1100);
|
// //Console.Beep(800, 1100);
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
void DoMyPrismEvent(DeviceMsg msg)
|
//void DoMyPrismEvent(DeviceMsg msg)
|
||||||
{
|
//{
|
||||||
switch (msg.EventType)
|
// switch (msg.EventType)
|
||||||
{
|
// {
|
||||||
case EventType.DRAWERCLOSE:
|
// case EventType.DRAWERCLOSE:
|
||||||
SelfEnable = false;
|
// SelfEnable = false;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
public void OnNavigatedTo(NavigationContext navigationContext)
|
//public void OnNavigatedTo(NavigationContext navigationContext)
|
||||||
{
|
//{
|
||||||
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
|
// _eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
|
||||||
RequestData();
|
// RequestData();
|
||||||
}
|
//}
|
||||||
|
|
||||||
public bool IsNavigationTarget(NavigationContext navigationContext)
|
//public bool IsNavigationTarget(NavigationContext navigationContext)
|
||||||
{
|
//{
|
||||||
return true;
|
// return true;
|
||||||
}
|
//}
|
||||||
|
|
||||||
public void OnNavigatedFrom(NavigationContext navigationContext)
|
//public void OnNavigatedFrom(NavigationContext navigationContext)
|
||||||
{
|
//{
|
||||||
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
|
// _eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,11 +105,13 @@ namespace DM_Weight.ViewModels
|
||||||
|
|
||||||
private PortUtil _portUtil;
|
private PortUtil _portUtil;
|
||||||
IEventAggregator _eventAggregator;
|
IEventAggregator _eventAggregator;
|
||||||
public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
|
SocketHelper _socketHelper;
|
||||||
|
public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||||||
{
|
{
|
||||||
|
|
||||||
_portUtil = portUtil;
|
_portUtil = portUtil;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
|
_socketHelper = socketHelper;
|
||||||
BindUserList();
|
BindUserList();
|
||||||
}
|
}
|
||||||
private void BindUserList()
|
private void BindUserList()
|
||||||
|
@ -201,7 +203,7 @@ namespace DM_Weight.ViewModels
|
||||||
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] bools = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
//bool allFalse = Array.TrueForAll(bools, b => b == false);
|
//bool allFalse = Array.TrueForAll(bools, b => b == false);
|
||||||
//if (!allFalse)
|
//if (!allFalse)
|
||||||
if (ModbusHelper.BoxOperate)
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); });
|
||||||
return;
|
return;
|
||||||
|
@ -221,32 +223,69 @@ namespace DM_Weight.ViewModels
|
||||||
Type = 55,
|
Type = 55,
|
||||||
InvoiceId = $"打开{DrawerNo}号药箱",
|
InvoiceId = $"打开{DrawerNo}号药箱",
|
||||||
}).ExecuteCommand();
|
}).ExecuteCommand();
|
||||||
ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
|
|
||||||
//if (bFlag)
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });
|
||||||
|
_socketHelper.OpenStatus = true;
|
||||||
|
|
||||||
|
int i = 10;
|
||||||
|
new PromiseUtil<int>().taskAsyncLoop(500, 0, async (options, next, stop) =>
|
||||||
{
|
{
|
||||||
IsEnable = true;
|
i--;
|
||||||
Status = 0;
|
if (_socketHelper.OpenStatus)
|
||||||
}
|
|
||||||
Task.Factory.StartNew(async () =>
|
|
||||||
{
|
|
||||||
bool loop = true;
|
|
||||||
while (loop)
|
|
||||||
{
|
{
|
||||||
await Task.Delay(5000);
|
|
||||||
bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
bool state = Array.TrueForAll(boolsl, b => b == false);
|
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
|
||||||
if (state)
|
|
||||||
|
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
|
||||||
|
//bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
if (_socketHelper.OpenStatus)
|
||||||
{
|
{
|
||||||
loop = false;
|
IsEnable = true;
|
||||||
ModbusHelper.BoxOperate = false;
|
Status = 0;
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
ModbusHelper.SpeakAsync("请及时关闭药箱");
|
||||||
|
i = 10;
|
||||||
|
}
|
||||||
|
next();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ModbusHelper.BoxOperate = true;
|
stop();
|
||||||
ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stop();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
//ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
|
||||||
|
////if (bFlag)
|
||||||
|
//{
|
||||||
|
// IsEnable = true;
|
||||||
|
// Status = 0;
|
||||||
|
//}
|
||||||
|
//Task.Factory.StartNew(async () =>
|
||||||
|
//{
|
||||||
|
// bool loop = true;
|
||||||
|
// while (loop)
|
||||||
|
// {
|
||||||
|
// await Task.Delay(5000);
|
||||||
|
// bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
|
// bool state = Array.TrueForAll(boolsl, b => b == false);
|
||||||
|
// if (state)
|
||||||
|
// {
|
||||||
|
// loop = false;
|
||||||
|
// ModbusHelper.BoxOperate = false;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// ModbusHelper.BoxOperate = true;
|
||||||
|
// ModbusHelper.SpeakAsync("药箱已打开,请及时关闭");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,12 +33,13 @@ namespace DM_Weight.Views
|
||||||
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
|
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
|
||||||
System.Timers.Timer idleTimer;//= new System.Timers.Timer(60000);
|
System.Timers.Timer idleTimer;//= new System.Timers.Timer(60000);
|
||||||
IEventAggregator _eventAggregator;
|
IEventAggregator _eventAggregator;
|
||||||
public HomeWindow(IEventAggregator eventAggregator)
|
SocketHelper _socketHelper;
|
||||||
|
public HomeWindow(IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
if (autoExit > 0)
|
if (autoExit > 0)
|
||||||
{
|
{
|
||||||
idleTimer = new System.Timers.Timer(autoExit*1000);
|
idleTimer = new System.Timers.Timer(autoExit * 1000);
|
||||||
idleTimer.Elapsed += OnTimerElapsed;
|
idleTimer.Elapsed += OnTimerElapsed;
|
||||||
this.MouseDown += OnUserActivity;
|
this.MouseDown += OnUserActivity;
|
||||||
this.MouseMove += OnUserActivity;
|
this.MouseMove += OnUserActivity;
|
||||||
|
@ -46,6 +47,7 @@ namespace DM_Weight.Views
|
||||||
idleTimer.Start();
|
idleTimer.Start();
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
}
|
}
|
||||||
|
_socketHelper = socketHelper;
|
||||||
}
|
}
|
||||||
private void OnUserActivity(object sender, EventArgs e)
|
private void OnUserActivity(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
@ -57,8 +59,8 @@ namespace DM_Weight.Views
|
||||||
// 串口无人操作
|
// 串口无人操作
|
||||||
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
|
//bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState();
|
||||||
//bool allTrue = Array.TrueForAll(boolArrs, b => b == false);
|
//bool allTrue = Array.TrueForAll(boolArrs, b => b == false);
|
||||||
logger.Info($"进入自动退出定时方法{ModbusHelper.BoxOperate}");
|
logger.Info($"进入自动退出定时方法{_socketHelper.OpenStatus}");
|
||||||
if (ModbusHelper.BoxOperate && idleTimer.Enabled)
|
if (_socketHelper.OpenStatus && idleTimer.Enabled)
|
||||||
{
|
{
|
||||||
idleTimer.Stop();
|
idleTimer.Stop();
|
||||||
//无人操作,自动退出
|
//无人操作,自动退出
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
using SharpPromise;
|
||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DM_Weight.util
|
||||||
|
{
|
||||||
|
public class PromiseUtil<T>
|
||||||
|
{
|
||||||
|
|
||||||
|
public int _delay { get; set; }
|
||||||
|
|
||||||
|
public T? _data { get; set; }
|
||||||
|
|
||||||
|
public async Task taskAsyncLoop(int delay, T data, Action<PromiseUtil<T>, Action, Action> action)
|
||||||
|
{
|
||||||
|
_data = data;
|
||||||
|
_delay = 0;
|
||||||
|
while (_delay >= 0)
|
||||||
|
{
|
||||||
|
await new Promise(async (Action onResolve, Action onReject) =>
|
||||||
|
{
|
||||||
|
await Task.Delay(_delay);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(() => action(this, onResolve, onReject));
|
||||||
|
} catch (Exception ex)
|
||||||
|
{
|
||||||
|
onReject();
|
||||||
|
}
|
||||||
|
}).Then(() =>
|
||||||
|
{
|
||||||
|
_delay = delay;
|
||||||
|
}).Catch((Exception e) =>
|
||||||
|
{
|
||||||
|
_delay = -1;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue