using System; using System.Diagnostics; using System.Linq; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; using System.Threading; using System.Windows; using System.Windows.Threading; using Vinno.IDCardReader; namespace Vinno.IdentificationCardApp { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow { private bool _bTimeToStop; private Thread _workThread; private readonly ManualResetEvent _workStopEvent; private readonly IIdCardListener _idListener; private readonly IDCardManager _idCardManager; private readonly DispatcherTimer _timer; private bool _mainIsExisting = true; private const double MilliSeconds = 500;//ms public MainWindow() { InitializeComponent(); Visibility = Visibility.Hidden; _idCardManager = new IDCardManager(); _idCardManager.OpenPort(); var ipcChannel = new IpcClientChannel(); ChannelServices.RegisterChannel(ipcChannel, false); _idListener = (IIdCardListener)Activator.GetObject(typeof(IIdCardListener), "ipc://IdCard/IdCardListener"); _workThread = new Thread(ThreadWorkFunction) { IsBackground = true }; _workStopEvent = new ManualResetEvent(false); _workThread.Start(); _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(MilliSeconds) }; _timer.Tick += OnTimerTick; _timer.Start(); Logger.Info("Identification read tool started"); } private void OnTimerTick(object sender, EventArgs eventArgs) { if (_mainIsExisting == false) { Close(); } } private void ThreadWorkFunction() { while (_workStopEvent.WaitOne(Convert.ToInt32(MilliSeconds)) == false) { try { //Shut down the process of Read identification tool _mainIsExisting = Process.GetProcessesByName("vStation").Any(); if (_mainIsExisting == false) { break; } if (_idCardManager.PortIsOpened) { var readCardCode = _idCardManager.ReadIcCard(); if (readCardCode == ReadCardReturnCodeEnum.Ok) { SendData(); } else if (readCardCode == ReadCardReturnCodeEnum.DeviceConnectionError) { if (_idCardManager.ClosePort()) { _idCardManager.OpenPort(); } } } else { _idCardManager.OpenPort(); } } catch (Exception ex) { Logger.Error("ThreadWorkFunction", ex); } } } private void BtnClick(object sender, RoutedEventArgs e) { if (_bTimeToStop) { _workThread = new Thread(ThreadWorkFunction) { IsBackground = true }; _workThread.Start(); _bTimeToStop = false; btnReadCard.Content = "STOP"; } else { _bTimeToStop = true; btnReadCard.Content = "START"; } } public void SendData() { try { CardInfo cardInfo = new CardInfo(); cardInfo.Id = _idCardManager.IDCardInfo.Idc; cardInfo.Name = _idCardManager.IDCardInfo.Name; cardInfo.Birthday = _idCardManager.IDCardInfo.Birthday; cardInfo.Gender = _idCardManager.IDCardInfo.SexCode == "1" ? IDGenderType.Male : IDGenderType.Female; cardInfo.Address = _idCardManager.IDCardInfo.Address; cardInfo.SignAddress = _idCardManager.IDCardInfo.SignAddress; cardInfo.People = _idCardManager.IDCardInfo.PeopleCode; cardInfo.SamId = _idCardManager.IDCardInfo.PeriodOfValidityCode; cardInfo.ValidDateFrom = _idCardManager.IDCardInfo.StartDate; cardInfo.ValidDateTo = _idCardManager.IDCardInfo.EndDate; cardInfo.ImageBytes = _idCardManager.IDCardInfo.PicByte; Logger.Info(string.Format("SendData: Name:{0}, ID:{1}, Birthday:{2}, Gender:{3} Address:{4}", cardInfo.Name, cardInfo.Id, cardInfo.Birthday, cardInfo.Gender, cardInfo.Address)); _idListener.SetCardInfo(cardInfo); } catch (Exception ex) { Logger.Error("SendData", ex); } } private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e) { _timer.Stop(); _workStopEvent.Set(); } } }