From ee624a7c0ddf2b68436133155801ce672c5fc9e2 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Mon, 16 Dec 2024 16:44:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8E=E7=BD=91=E5=8F=A3?= =?UTF-8?q?=E9=80=9A=E4=BF=A1=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/App.xaml.cs | 1 + DM_Weight/DM_Weight.csproj | 3 + DM_Weight/Finger/FingerprintUtil.cs | 36 ++--- DM_Weight/Port/FingerHelper.cs | 56 +++++++ DM_Weight/Port/ModbusHelper.cs | 142 ++++++++++-------- DM_Weight/Port/MyBaseMessage.cs | 26 ++++ DM_Weight/Port/MyMinaCodecFactory.cs | 19 +++ DM_Weight/Port/MyMinaDecoder.cs | 49 ++++++ DM_Weight/Port/MyMinaEncoder.cs | 61 ++++++++ DM_Weight/Port/SocketHelper.cs | 63 ++++++++ .../CheckOrderNewWindowViewModel.cs | 71 ++++++--- DM_Weight/ViewModels/HomeWindowViewModel.cs | 20 +-- DM_Weight/ViewModels/LoginWindowViewModel.cs | 13 +- DM_Weight/ViewModels/MainWindowViewModel.cs | 10 +- .../ViewModels/OpenBoxNewWindowViewModel.cs | 112 +++++++++----- .../ViewModels/SettingBoxWindowViewModel.cs | 77 +++++++--- DM_Weight/Views/HomeWindow.xaml.cs | 10 +- DM_Weight/util/PromiseUtil.cs | 40 +++++ 18 files changed, 631 insertions(+), 178 deletions(-) create mode 100644 DM_Weight/Port/FingerHelper.cs create mode 100644 DM_Weight/Port/MyBaseMessage.cs create mode 100644 DM_Weight/Port/MyMinaCodecFactory.cs create mode 100644 DM_Weight/Port/MyMinaDecoder.cs create mode 100644 DM_Weight/Port/MyMinaEncoder.cs create mode 100644 DM_Weight/Port/SocketHelper.cs create mode 100644 DM_Weight/util/PromiseUtil.cs diff --git a/DM_Weight/App.xaml.cs b/DM_Weight/App.xaml.cs index 817e5a2..7f5d5ea 100644 --- a/DM_Weight/App.xaml.cs +++ b/DM_Weight/App.xaml.cs @@ -98,6 +98,7 @@ namespace DM_Weight // 串口工具 containerRegistry.RegisterSingleton(); + containerRegistry.RegisterSingleton(); // 指纹机工具 containerRegistry.RegisterSingleton(); // 组态屏工具 diff --git a/DM_Weight/DM_Weight.csproj b/DM_Weight/DM_Weight.csproj index 5fc575a..bf5f1b1 100644 --- a/DM_Weight/DM_Weight.csproj +++ b/DM_Weight/DM_Weight.csproj @@ -67,13 +67,16 @@ + + + diff --git a/DM_Weight/Finger/FingerprintUtil.cs b/DM_Weight/Finger/FingerprintUtil.cs index bb861c1..502a6c1 100644 --- a/DM_Weight/Finger/FingerprintUtil.cs +++ b/DM_Weight/Finger/FingerprintUtil.cs @@ -19,15 +19,15 @@ namespace DM_Weight.Finger public class FingerprintUtil { - private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); - public zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass(); - public bool bIsConnected = false; + private static ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); + public static zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass(); + public static bool bIsConnected = false; - private string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString(); - private int fingerPort = 4370; - private int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString()); - private int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString()); - private readonly IEventAggregator _eventAggregator; + private static string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString(); + private static int fingerPort = 4370; + private static int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString()); + private static int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString()); + private static IEventAggregator _eventAggregator; public FingerprintUtil(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; @@ -38,7 +38,7 @@ namespace DM_Weight.Finger //}); } - public void ConnectionMain() + public static void ConnectionMain() { try { @@ -49,13 +49,15 @@ namespace DM_Weight.Finger { 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.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); + axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); } } + logger.Info($"连接指纹机2"); + _eventAggregator.GetEvent().Publish(new FingerprintMsg() { Message = "CONNECT", @@ -70,13 +72,13 @@ namespace DM_Weight.Finger /// /// 用于退出登录重连指纹机 /// - public void FingerDisconnect() + public static void FingerDisconnect() { try { axCZKEM1.Disconnect(); - this.axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); - this.axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); + axCZKEM1.OnAttTransactionEx -= new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); + axCZKEM1.OnEnrollFingerEx -= new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx); ConnectionMain(); } 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 - 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() { @@ -100,7 +102,7 @@ namespace DM_Weight.Finger } //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() { @@ -117,7 +119,7 @@ namespace DM_Weight.Finger _eventAggregator.GetEvent().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() { diff --git a/DM_Weight/Port/FingerHelper.cs b/DM_Weight/Port/FingerHelper.cs new file mode 100644 index 0000000..c4f3a46 --- /dev/null +++ b/DM_Weight/Port/FingerHelper.cs @@ -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); + } + } +} diff --git a/DM_Weight/Port/ModbusHelper.cs b/DM_Weight/Port/ModbusHelper.cs index 4f8b00b..23158bd 100644 --- a/DM_Weight/Port/ModbusHelper.cs +++ b/DM_Weight/Port/ModbusHelper.cs @@ -1,4 +1,5 @@ -using DM_Weight.msg; +using DM_Weight.Finger; +using DM_Weight.msg; using DM_Weight.ViewModels; using log4net; using log4net.Repository.Hierarchy; @@ -30,11 +31,14 @@ namespace DM_Weight.Port private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); string ip = ConfigurationManager.AppSettings["modbusIp"].ToString(); int port = Convert.ToInt32(ConfigurationManager.AppSettings["modbusPort"]); + private static object _lock = new object(); public static bool BoxOperate { get; set; } private ModbusHelper() { logger.Info("ModbusHelper"); + socket = KeepALiveSocket.MakeKeepALiveSocket(ip, port); + //socket = CreateSocket(); client = new TcpClient(); client.Client = socket; @@ -43,11 +47,14 @@ namespace DM_Weight.Port } 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() { @@ -102,74 +109,82 @@ namespace DM_Weight.Port // } // return flags; // }); - bool successFlag = true; - bool[] bools = new bool[18]; - int iCount = 0; - do + lock (_lock) { - try + bool successFlag = true; + bool[] bools = new bool[18]; + int iCount = 0; + do { - bool[] flags = new bool[18]; - if (master == null) + try { + 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(); + BoxOperate = false; + FingerprintUtil.FingerDisconnect(); } - 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(); - BoxOperate = false; - } - } while (!successFlag); - return bools; + } while (!successFlag); + return bools; + } } public bool OpenBoxDoor(int boxNum) { - BoxOperate = true; - //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y") - //{ - // return true; - //} - bool bFlag = false; - Thread.Sleep(50); - Policy.Handle().Retry(3, ((exception, retryCount) => + lock (_lock) { - this.Dispose(); - //Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception); - logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}"); - //SpeakAsync("药箱连接失败,正在尝试重新打开"); - Thread.Sleep(500); - this.SetModusIpMaster(); - //return TimeSpan.FromSeconds (1); - })).Execute(() => - { - logger.Info($"正在打开{boxNum}号药箱"); - master.WriteSingleRegister(1, (ushort)boxNum, 0); - logger.Info($"开门指令已发送{(ushort)boxNum}"); - SpeakAsync("药箱已打开,请及时关闭"); - //Console.WriteLine($"开门指令已发送{(ushort)boxNum}"); - bFlag = true; - }); - return bFlag; + BoxOperate = true; + //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y") + //{ + // return true; + //} + bool bFlag = false; + Thread.Sleep(50); + Policy.Handle().Retry(3, ((exception, retryCount) => + { + this.Dispose(); + //Debug.WriteLine($"打开箱子出错,第{retryCount}次重试", exception); + logger.Info($"打开箱子出错,第{retryCount}次重试,异常信息{exception}"); + //SpeakAsync("药箱连接失败,正在尝试重新打开"); + Thread.Sleep(500); + this.SetModusIpMaster(); + //return TimeSpan.FromSeconds (1); + })).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() { @@ -181,6 +196,7 @@ namespace DM_Weight.Port private static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); public static void SpeakAsync(string textinfo) { + speechSynthesizer.Rate = 2; speechSynthesizer.SpeakAsync(textinfo); } diff --git a/DM_Weight/Port/MyBaseMessage.cs b/DM_Weight/Port/MyBaseMessage.cs new file mode 100644 index 0000000..4a849cd --- /dev/null +++ b/DM_Weight/Port/MyBaseMessage.cs @@ -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; + } + } +} diff --git a/DM_Weight/Port/MyMinaCodecFactory.cs b/DM_Weight/Port/MyMinaCodecFactory.cs new file mode 100644 index 0000000..ed45444 --- /dev/null +++ b/DM_Weight/Port/MyMinaCodecFactory.cs @@ -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()); + } + } +} \ No newline at end of file diff --git a/DM_Weight/Port/MyMinaDecoder.cs b/DM_Weight/Port/MyMinaDecoder.cs new file mode 100644 index 0000000..9676c88 --- /dev/null +++ b/DM_Weight/Port/MyMinaDecoder.cs @@ -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) + { + } + } +} diff --git a/DM_Weight/Port/MyMinaEncoder.cs b/DM_Weight/Port/MyMinaEncoder.cs new file mode 100644 index 0000000..770900c --- /dev/null +++ b/DM_Weight/Port/MyMinaEncoder.cs @@ -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 + { + + + 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); + } + } +} diff --git a/DM_Weight/Port/SocketHelper.cs b/DM_Weight/Port/SocketHelper.cs new file mode 100644 index 0000000..cfce5be --- /dev/null +++ b/DM_Weight/Port/SocketHelper.cs @@ -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); + } + } +} diff --git a/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs b/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs index 9c59277..e979a1e 100644 --- a/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckOrderNewWindowViewModel.cs @@ -231,11 +231,13 @@ namespace DM_Weight.ViewModels } IEventAggregator _eventAggregator; - private PortUtil _portUtil; - public CheckOrderNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) + //private PortUtil _portUtil; + SocketHelper _socketHelper; + public CheckOrderNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper) { - _portUtil = portUtil; + //_portUtil = portUtil; _eventAggregator = eventAggregator; + _socketHelper = socketHelper; } #region 按钮归属变量 @@ -831,9 +833,9 @@ namespace DM_Weight.ViewModels // Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); // return; //} - if (ModbusHelper.BoxOperate) + if (_socketHelper.OpenStatus) { - Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + ModbusHelper.SpeakAsync("请关闭药箱后再打开"); return; } DrawerNo = Convert.ToInt32(strDrawerNo); @@ -854,27 +856,62 @@ namespace DM_Weight.ViewModels ModbusHelper.SpeakAsync($"正在打开{DrawerNo + 1}号药箱"); //记录开药箱日志 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().taskAsyncLoop(500, 0, async (options, next, stop) => { - bool loop = true; - while (loop) + i--; + if (_socketHelper.OpenStatus) { - await Task.Delay(5000); - bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); - bool state = Array.TrueForAll(boolsl, b => b == false); - if (state) + + //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + + //ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}"); + //bool state = Array.TrueForAll(boolsl, b => b == false); + if (_socketHelper.OpenStatus) { - loop = false; - ModbusHelper.BoxOperate = false; + if (i == 0) + { + ModbusHelper.SpeakAsync("请及时关闭药箱"); + i = 10; + } + next(); } else { - ModbusHelper.BoxOperate = true; - ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + stop(); } } + 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("药箱已打开,请及时关闭"); + // } + // } + //}); } } diff --git a/DM_Weight/ViewModels/HomeWindowViewModel.cs b/DM_Weight/ViewModels/HomeWindowViewModel.cs index 801b638..2e9fbb1 100644 --- a/DM_Weight/ViewModels/HomeWindowViewModel.cs +++ b/DM_Weight/ViewModels/HomeWindowViewModel.cs @@ -154,8 +154,8 @@ namespace DM_Weight.ViewModels } private void SelectChildNavigate(PremissionDm SelectedChildMenu) { - if (!_portUtil.Operate) - { + //if (!_portUtil.Operate) + //{ if (SelectedChildMenu != null) { if (SelectedChildMenu.PremissionPath.Equals("TakeRecordWindow")) @@ -233,7 +233,7 @@ namespace DM_Weight.ViewModels } } } - } + //} } public PremissionDm? SelectedMenu @@ -290,7 +290,7 @@ namespace DM_Weight.ViewModels //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); //bool allTrue = Array.TrueForAll(boolArrs, b => b); //false是关着,true是开着 - if (!ModbusHelper.BoxOperate) + if (!_socketHelper.OpenStatus) { logger.Info($"用户【{Operator?.Nickname}】退出登录"); Operator = null; @@ -309,10 +309,10 @@ namespace DM_Weight.ViewModels { //SelectedMenu.Children = SelectedMenu.Children; //SelectedChildMenu = SelectedMenu.Children[0]; - if (!_portUtil.Operate) - { + //if (!_portUtil.Operate) + //{ _regionManager.RequestNavigate("ContentRegion", SelectedMenu.Children[0].PremissionPath); - } + //} } } #region 子菜单点击 @@ -344,13 +344,15 @@ namespace DM_Weight.ViewModels //private CHKFunction _chkFunction; IEventAggregator _eventAggregator; //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; _regionManager = iRegionManager; _dialogService = dialogService; _container = container; this._eventAggregator = eventAggregator; + _socketHelper = socketHelper; //_chkFunction = cHKFunction; //_modbusHelper = modbusHelper; } @@ -528,7 +530,7 @@ namespace DM_Weight.ViewModels { _eventAggregator.GetEvent().Subscribe(SetLoginOut); - _portUtil.dateTime = DateTime.Now; + //_portUtil.dateTime = DateTime.Now; //取出user UserList = navigationContext.Parameters.GetValue("operator"); Operator = UserList; diff --git a/DM_Weight/ViewModels/LoginWindowViewModel.cs b/DM_Weight/ViewModels/LoginWindowViewModel.cs index af35290..9893856 100644 --- a/DM_Weight/ViewModels/LoginWindowViewModel.cs +++ b/DM_Weight/ViewModels/LoginWindowViewModel.cs @@ -62,7 +62,7 @@ namespace DM_Weight.ViewModels } private HkcChangeShifts listHkcChangeShifts=new HkcChangeShifts(); - private FingerprintUtil _fingerprintUtil; + //private FingerprintUtil _fingerprintUtil; private PortUtil _portUtil; @@ -114,16 +114,17 @@ namespace DM_Weight.ViewModels // _regionManager = regionManager; // _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; _regionManager = regionManager; _eventAggregator = eventAggregator; - FingerMsg = _fingerprintUtil.bIsConnected; + //FingerMsg = !_fingerprintUtil.bIsConnected; + FingerMsg = !FingerprintUtil.bIsConnected; _eventAggregator.GetEvent().Subscribe(LoginEvent); - logger.Info($"LoginWindowViewModel;FingerMsg:{FingerMsg}"); - _fingerprintUtil.FingerDisconnect(); + logger.Info($"LoginWindowViewModel;FingerMsg:{FingerprintUtil.bIsConnected}"); + //_fingerprintUtil.FingerDisconnect(); } private DelegateCommand? _loginCommand; diff --git a/DM_Weight/ViewModels/MainWindowViewModel.cs b/DM_Weight/ViewModels/MainWindowViewModel.cs index 173a791..c49e6cd 100644 --- a/DM_Weight/ViewModels/MainWindowViewModel.cs +++ b/DM_Weight/ViewModels/MainWindowViewModel.cs @@ -62,17 +62,17 @@ namespace DM_Weight.ViewModels // this.eventAggregator.GetEvent().Subscribe(doMyPrismEvent2); // _screenUtil = screenUtil; //} - //private FingerprintUtil _fingerprintUtil; + private FingerprintUtil _fingerprintUtil; IRegionManager _regionManager; IUnityContainer _container; //private CHKFunction _cHKFunction; 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; this.eventAggregator = eventAggregator; this.eventAggregator.GetEvent().Subscribe(doMyPrismEvent2); - //_fingerprintUtil = fingerprintUtil; + _fingerprintUtil = fingerprintUtil; _regionManager = regionManager; _container = container; //_cHKFunction = cHKFunction; @@ -81,9 +81,9 @@ namespace DM_Weight.ViewModels //{ _container.RegisterType("LoginWindow"); - _regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow"); + _regionManager.RegisterViewWithRegion("MainRegion", "LoginWindow"); - //})); + //})); } diff --git a/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs b/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs index 524c3ab..36bd713 100644 --- a/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/OpenBoxNewWindowViewModel.cs @@ -22,7 +22,7 @@ using System.Windows.Media; 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); @@ -112,9 +112,11 @@ namespace DM_Weight.ViewModels //public static int iNumber = 1; //private PortUtil _portUtil; IEventAggregator _eventAggregator; - public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator) + SocketHelper _socketHelper; + public OpenBoxNewWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper) { _eventAggregator = eventAggregator; + _socketHelper = socketHelper; } #region 抽屉按钮 private Brush _button1Color = Brushes.White; @@ -621,9 +623,9 @@ namespace DM_Weight.ViewModels //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); //bool allFalse = Array.TrueForAll(bools, b => b == false); //if (!allFalse) - if (ModbusHelper.BoxOperate) + if (_socketHelper.OpenStatus) { - Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); + ModbusHelper.SpeakAsync("请关闭药箱后再打开"); return; } iList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerType == this.DrawerType && cl.DrawerNo == DrawerNo) @@ -667,29 +669,63 @@ namespace DM_Weight.ViewModels ModbusHelper.SpeakAsync($"正在打开{DrawerNo}号药箱"); } //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().taskAsyncLoop(500, 0, async (options, next, stop) => { - bool loop = true; - while (loop) + i--; + if (_socketHelper.OpenStatus) { - await Task.Delay(5000); - bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); - bool state = Array.TrueForAll(boolsl, b => b == false); - if(state) + + //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + + //ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}"); + //bool state = Array.TrueForAll(boolsl, b => b == false); + if (_socketHelper.OpenStatus) { - loop = false; - ModbusHelper.BoxOperate = false; + if (i == 0) + { + ModbusHelper.SpeakAsync("请及时关闭药箱"); + i = 10; + } + next(); } else { - ModbusHelper.BoxOperate = true; - ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + stop(); } } + 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(); SelfStatus = 0; @@ -714,29 +750,29 @@ namespace DM_Weight.ViewModels // //Console.Beep(800, 1100); // } //} - void DoMyPrismEvent(DeviceMsg msg) - { - switch (msg.EventType) - { - case EventType.DRAWERCLOSE: - SelfEnable = false; - break; - } - } - public void OnNavigatedTo(NavigationContext navigationContext) - { - _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); - RequestData(); - } + //void DoMyPrismEvent(DeviceMsg msg) + //{ + // switch (msg.EventType) + // { + // case EventType.DRAWERCLOSE: + // SelfEnable = false; + // break; + // } + //} + //public void OnNavigatedTo(NavigationContext navigationContext) + //{ + // _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); + // RequestData(); + //} - public bool IsNavigationTarget(NavigationContext navigationContext) - { - return true; - } + //public bool IsNavigationTarget(NavigationContext navigationContext) + //{ + // return true; + //} - public void OnNavigatedFrom(NavigationContext navigationContext) - { - _eventAggregator.GetEvent().Unsubscribe(DoMyPrismEvent); - } + //public void OnNavigatedFrom(NavigationContext navigationContext) + //{ + // _eventAggregator.GetEvent().Unsubscribe(DoMyPrismEvent); + //} } } diff --git a/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs b/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs index b7d7283..bfb42c5 100644 --- a/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs +++ b/DM_Weight/ViewModels/SettingBoxWindowViewModel.cs @@ -105,11 +105,13 @@ namespace DM_Weight.ViewModels private PortUtil _portUtil; IEventAggregator _eventAggregator; - public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) + SocketHelper _socketHelper; + public SettingBoxWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator, SocketHelper socketHelper) { _portUtil = portUtil; _eventAggregator = eventAggregator; + _socketHelper = socketHelper; BindUserList(); } private void BindUserList() @@ -201,7 +203,7 @@ namespace DM_Weight.ViewModels //bool[] bools = ModbusHelper.GetInstance().GetAllBoxState(); //bool allFalse = Array.TrueForAll(bools, b => b == false); //if (!allFalse) - if (ModbusHelper.BoxOperate) + if (_socketHelper.OpenStatus) { Task.Factory.StartNew(() => { ModbusHelper.SpeakAsync("请关闭药箱后再打开"); }); return; @@ -221,32 +223,69 @@ namespace DM_Weight.ViewModels Type = 55, InvoiceId = $"打开{DrawerNo}号药箱", }).ExecuteCommand(); - ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1); - //if (bFlag) + + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) }); + _socketHelper.OpenStatus = true; + + int i = 10; + new PromiseUtil().taskAsyncLoop(500, 0, async (options, next, stop) => { - IsEnable = true; - Status = 0; - } - Task.Factory.StartNew(async () => - { - bool loop = true; - while (loop) + i--; + if (_socketHelper.OpenStatus) { - await Task.Delay(5000); - bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); - bool state = Array.TrueForAll(boolsl, b => b == false); - if (state) + + //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + + //ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}"); + //bool state = Array.TrueForAll(boolsl, b => b == false); + if (_socketHelper.OpenStatus) { - loop = false; - ModbusHelper.BoxOperate = false; + IsEnable = true; + Status = 0; + if (i == 0) + { + ModbusHelper.SpeakAsync("请及时关闭药箱"); + i = 10; + } + next(); } else { - ModbusHelper.BoxOperate = true; - ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); + stop(); } } + 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("药箱已打开,请及时关闭"); + // } + // } + //}); } }); } diff --git a/DM_Weight/Views/HomeWindow.xaml.cs b/DM_Weight/Views/HomeWindow.xaml.cs index c046a3c..8a61075 100644 --- a/DM_Weight/Views/HomeWindow.xaml.cs +++ b/DM_Weight/Views/HomeWindow.xaml.cs @@ -33,12 +33,13 @@ namespace DM_Weight.Views int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0"); System.Timers.Timer idleTimer;//= new System.Timers.Timer(60000); IEventAggregator _eventAggregator; - public HomeWindow(IEventAggregator eventAggregator) + SocketHelper _socketHelper; + public HomeWindow(IEventAggregator eventAggregator, SocketHelper socketHelper) { InitializeComponent(); if (autoExit > 0) { - idleTimer = new System.Timers.Timer(autoExit*1000); + idleTimer = new System.Timers.Timer(autoExit * 1000); idleTimer.Elapsed += OnTimerElapsed; this.MouseDown += OnUserActivity; this.MouseMove += OnUserActivity; @@ -46,6 +47,7 @@ namespace DM_Weight.Views idleTimer.Start(); _eventAggregator = eventAggregator; } + _socketHelper = socketHelper; } private void OnUserActivity(object sender, EventArgs e) { @@ -57,8 +59,8 @@ namespace DM_Weight.Views // 串口无人操作 //bool[] boolArrs = ModbusHelper.GetInstance().GetAllBoxState(); //bool allTrue = Array.TrueForAll(boolArrs, b => b == false); - logger.Info($"进入自动退出定时方法{ModbusHelper.BoxOperate}"); - if (ModbusHelper.BoxOperate && idleTimer.Enabled) + logger.Info($"进入自动退出定时方法{_socketHelper.OpenStatus}"); + if (_socketHelper.OpenStatus && idleTimer.Enabled) { idleTimer.Stop(); //无人操作,自动退出 diff --git a/DM_Weight/util/PromiseUtil.cs b/DM_Weight/util/PromiseUtil.cs new file mode 100644 index 0000000..6f2ab21 --- /dev/null +++ b/DM_Weight/util/PromiseUtil.cs @@ -0,0 +1,40 @@ +using SharpPromise; +using System; +using System.Threading.Tasks; + +namespace DM_Weight.util +{ + public class PromiseUtil + { + + public int _delay { get; set; } + + public T? _data { get; set; } + + public async Task taskAsyncLoop(int delay, T data, Action, 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; + }); + } + } + } +}