修改与网口通信相关代码

This commit is contained in:
maqiao 2024-12-16 16:44:02 +08:00
parent e75f04beaf
commit ee624a7c0d
18 changed files with 631 additions and 178 deletions

View File

@ -98,6 +98,7 @@ namespace DM_Weight
// 串口工具
containerRegistry.RegisterSingleton<PortUtil>();
containerRegistry.RegisterSingleton<SocketHelper>();
// 指纹机工具
containerRegistry.RegisterSingleton<FingerprintUtil>();
// 组态屏工具

View File

@ -67,13 +67,16 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Common.Logging" Version="3.4.1" />
<PackageReference Include="FluentModbus" Version="5.3.0" />
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
<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="Polly" Version="8.4.1" />
<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="SuperSimpleTcp" Version="3.0.10" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />

View File

@ -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<FingerprintEvent>().Publish(new FingerprintMsg()
{
Message = "CONNECT",
@ -70,13 +72,13 @@ namespace DM_Weight.Finger
/// <summary>
/// 用于退出登录重连指纹机
/// </summary>
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<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()
{

View File

@ -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);
}
}
}

View File

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

View File

@ -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;
}
}
}

View File

@ -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());
}
}
}

View File

@ -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)
{
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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<int>().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("药箱已打开,请及时关闭");
// }
// }
//});
}
}

View File

@ -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<LoginOutEvent>().Subscribe(SetLoginOut);
_portUtil.dateTime = DateTime.Now;
//_portUtil.dateTime = DateTime.Now;
//取出user
UserList = navigationContext.Parameters.GetValue<UserList>("operator");
Operator = UserList;

View File

@ -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<FingerprintEvent>().Subscribe(LoginEvent);
logger.Info($"LoginWindowViewModel;FingerMsg{FingerMsg}");
_fingerprintUtil.FingerDisconnect();
logger.Info($"LoginWindowViewModel;FingerMsg{FingerprintUtil.bIsConnected}");
//_fingerprintUtil.FingerDisconnect();
}
private DelegateCommand? _loginCommand;

View File

@ -62,17 +62,17 @@ namespace DM_Weight.ViewModels
// this.eventAggregator.GetEvent<SnackbarEvent>().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<SnackbarEvent>().Subscribe(doMyPrismEvent2);
//_fingerprintUtil = fingerprintUtil;
_fingerprintUtil = fingerprintUtil;
_regionManager = regionManager;
_container = container;
//_cHKFunction = cHKFunction;

View File

@ -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<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.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;
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<PortUtilEvent>().Subscribe(DoMyPrismEvent);
RequestData();
}
//void DoMyPrismEvent(DeviceMsg msg)
//{
// switch (msg.EventType)
// {
// case EventType.DRAWERCLOSE:
// SelfEnable = false;
// break;
// }
//}
//public void OnNavigatedTo(NavigationContext navigationContext)
//{
// _eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
// RequestData();
//}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//public bool IsNavigationTarget(NavigationContext navigationContext)
//{
// return true;
//}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
//public void OnNavigatedFrom(NavigationContext navigationContext)
//{
// _eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
//}
}
}

View File

@ -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<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;
Status = 0;
if (i == 0)
{
ModbusHelper.SpeakAsync("请及时关闭药箱");
i = 10;
}
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;
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("药箱已打开,请及时关闭");
// }
// }
//});
}
});
}

View File

@ -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();
//无人操作,自动退出

View File

@ -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;
});
}
}
}
}