修改与网口通信相关代码
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;
 | 
				
			||||||
| 
						 | 
					@ -42,6 +46,8 @@ namespace DM_Weight.Port
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static ModbusHelper GetInstance()
 | 
					        public static ModbusHelper GetInstance()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            lock (_lock)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (instance == null)
 | 
					                if (instance == null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
| 
						 | 
					@ -49,6 +55,7 @@ namespace DM_Weight.Port
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return instance;
 | 
					                return instance;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        private void SetModusIpMaster()
 | 
					        private void SetModusIpMaster()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            logger.Info("SetModusIpMaster");
 | 
					            logger.Info("SetModusIpMaster");
 | 
				
			||||||
| 
						 | 
					@ -102,6 +109,8 @@ namespace DM_Weight.Port
 | 
				
			||||||
            //        }
 | 
					            //        }
 | 
				
			||||||
            //        return flags;
 | 
					            //        return flags;
 | 
				
			||||||
            //    });
 | 
					            //    });
 | 
				
			||||||
 | 
					            lock (_lock)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                bool successFlag = true;
 | 
					                bool successFlag = true;
 | 
				
			||||||
                bool[] bools = new bool[18];
 | 
					                bool[] bools = new bool[18];
 | 
				
			||||||
                int iCount = 0;
 | 
					                int iCount = 0;
 | 
				
			||||||
| 
						 | 
					@ -138,11 +147,15 @@ namespace DM_Weight.Port
 | 
				
			||||||
                        Thread.Sleep(500);
 | 
					                        Thread.Sleep(500);
 | 
				
			||||||
                        this.SetModusIpMaster();
 | 
					                        this.SetModusIpMaster();
 | 
				
			||||||
                        BoxOperate = false;
 | 
					                        BoxOperate = false;
 | 
				
			||||||
 | 
					                        FingerprintUtil.FingerDisconnect();
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } while (!successFlag);
 | 
					                } while (!successFlag);
 | 
				
			||||||
                return bools;
 | 
					                return bools;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        public bool OpenBoxDoor(int boxNum)
 | 
					        public bool OpenBoxDoor(int boxNum)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            lock (_lock)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                BoxOperate = true;
 | 
					                BoxOperate = true;
 | 
				
			||||||
                //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
 | 
					                //if (ConfigurationManager.AppSettings["test"]!=null&& ConfigurationManager.AppSettings["test"].ToString()=="Y")
 | 
				
			||||||
| 
						 | 
					@ -163,14 +176,16 @@ namespace DM_Weight.Port
 | 
				
			||||||
                })).Execute(() =>
 | 
					                })).Execute(() =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    logger.Info($"正在打开{boxNum}号药箱");
 | 
					                    logger.Info($"正在打开{boxNum}号药箱");
 | 
				
			||||||
                master.WriteSingleRegister(1, (ushort)boxNum, 0);
 | 
					                    master.WriteSingleRegister(1, (ushort)boxNum, 20);
 | 
				
			||||||
                    logger.Info($"开门指令已发送{(ushort)boxNum}");
 | 
					                    logger.Info($"开门指令已发送{(ushort)boxNum}");
 | 
				
			||||||
                SpeakAsync("药箱已打开,请及时关闭");
 | 
					                    SpeakAsync("请及时关闭药箱");
 | 
				
			||||||
                    //Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
 | 
					                    //Console.WriteLine($"开门指令已发送{(ushort)boxNum}");
 | 
				
			||||||
                    bFlag = true;
 | 
					                    bFlag = true;
 | 
				
			||||||
 | 
					                    FingerprintUtil.FingerDisconnect();
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
                return bFlag;
 | 
					                return bFlag;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        private void Dispose()
 | 
					        private void Dispose()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            socket.Shutdown(SocketShutdown.Both);
 | 
					            socket.Shutdown(SocketShutdown.Both);
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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) =>
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        i--;
 | 
				
			||||||
 | 
					                        if (_socketHelper.OpenStatus)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            //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)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                IsEnable = true;
 | 
					                                IsEnable = true;
 | 
				
			||||||
                                Status = 0;
 | 
					                                Status = 0;
 | 
				
			||||||
 | 
					                                if (i == 0)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    ModbusHelper.SpeakAsync("请及时关闭药箱");
 | 
				
			||||||
 | 
					                                    i = 10;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                    Task.Factory.StartNew(async () =>
 | 
					                                next();
 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        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
 | 
					                            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,7 +33,8 @@ 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)
 | 
				
			||||||
| 
						 | 
					@ -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