using HMI.Core.Util; using HMI.UI.MDI; using HMI.UI.Util; using HMI.Util; using Panuon.WPF.UI; using Plugin.TestResult.Model; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO.Ports; using System.Windows; using System.Windows.Input; namespace Plugin.TestResult_WPF { public class BarcodeEventArg { public string name { get; private set; } public string positionCode { get; private set; } public string snrCode { get; private set; } public string oldPosition { get; private set; } public int oldIndex { get; private set; } public BarcodeEventArg(string name, string positionCode, string snrCode, string oldPosition, int oldIndex) { this.name = name; this.positionCode = positionCode; this.snrCode = snrCode; this.oldPosition = oldPosition; this.oldIndex = oldIndex; } } /// /// Scanner.xaml 的交互逻辑 /// public partial class Scanner : WindowX { private string _title; public string title { get { return _title; } set => Set(ref _title, value); } public event EventHandler FinishBarcode; public event EventHandler ComplateClick; private static Dictionary snrCache = new Dictionary(); private static Dictionary snrIndex = new Dictionary(); private DataTable dataTable; SerialPort serialPort; public Scanner(string title) { this.title = title; this.DataContext = this; InitializeComponent(); Loaded += Scanner_Loaded; } private void Scanner_Loaded(object sender, RoutedEventArgs e) { InitScanner(); Loaded -= Scanner_Loaded; } /// /// 设置扫码枪 /// private void InitScanner() { string comStr = ""; if (serialPort != null) return; string section = this.Tag.ToString(); ScannerConfig common = ScannerConfig.ReadFromIni(ViewControl.SannerIniFile, "Config"); string portName = IniFileHelper.ReadIniData(section, "PortName", "", ViewControl.SannerIniFile); if (string.IsNullOrEmpty(portName)) { if (section.StartsWith("A")) { portName = "COM1"; } else { portName = "COM2"; } } common.PortName = portName; // 配置串口 serialPort = new SerialPort { PortName = common.PortName, BaudRate = common.BaudRate, Parity = Parity.None, DataBits = common.DataBits, StopBits = common.StopBits, Handshake = Handshake.None, DtrEnable = common.DtrEnable, RtsEnable = common.RtsEnable //ReadTimeout = 500, //WriteTimeout = 500, //ReciveBufferSize=4096 }; try { // 打开串口 serialPort.Open(); // 注册接收数据事件 serialPort.DataReceived += SerialPort_DataReceived; } catch (Exception ex) { ViewControl.Logger.Error("Init Scan Gun Failed.", ex); MsgBoxHelper.Error(this, $"{this.lang("Tr.InitGunFailed")}: {ex.StackTrace}"); } } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { SerialPort sp = (SerialPort)sender; string barcode = ReadDataFrom(sp); //string barcode = Dispatcher.Invoke(() => { if (snrText.IsFocused) { snrText.Text = barcode; Con_Click(null, null); } else { positionText.Text = barcode; //positionText.Focus(); //snrText.Text = ""; snrText.Focus(); } }); } catch (Exception ex) { ViewControl.Logger.Error("Get Scan Gun Data Failed.", ex); MessageBox.Show($"{this.lang("Tr.GetGunData")}: {ex.StackTrace}"); } } public static void InsertNewCode(string snr, string position, int index) { snrCache[snr] = position; snrIndex[snr] = index; } public static void RemoveSNR(string snr) { snrCache.Remove(snr); snrIndex.Remove(snr); } private void SendCode(string tag, string position, string snr) { if (snrCache.ContainsKey(snr)) { var oldPosition = snrCache[snr]; if (MsgBoxHelper2.WarnChoose($"条码[{snr}]已放置于[{oldPosition}]中,是否清除?") == MessageBoxResult.OK) { try { FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, null, oldPosition, snrIndex[snr])); snrCache.Remove(snr); snrIndex.Remove(snr); FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null, -1)); } catch (Exception ex) { ToastHelper.Error(ex.Message); } } } else { FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null, -1)); } } private void Con_Click(object sender, RoutedEventArgs e) { Dispatcher.Invoke(() => { string position = positionText.Text, snr = snrText.Text; if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr)) { ToastHelper.Warning(this, this.lang("Tr.PleaseInputSnrs")); return; } try { SendCode(Tag.ToString(), position, snr); positionText.Text = ""; snrText.Text = ""; positionText.Focus(); } catch (Exception ex) { ViewControl.Logger.Error("Con_Click Failed.", ex); ToastHelper.Warning(this, ex.Message); } }); } /// /// 原来的完成扫描逻辑 /// /// /// //private void Ok_Click(object sender, RoutedEventArgs e) //{ // string position = positionText.Text, snr = snrText.Text; // if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr)) // { // ToastHelper.Warning(this, this.lang("Tr.PleaseInputSnrs")); // return; // } // try // { // SendCode(Tag.ToString(), position, snr); // this.Close(); // } // catch (Exception ex) // { // ViewControl.Logger.Error("Con_Click Failed.", ex); // ToastHelper.Warning(this, ex.Message); // } //} private void Ok_Click(object sender, RoutedEventArgs e) { ComplateClick?.Invoke(this, e); this.Close(); } private string ReadDataFrom(SerialPort sp) { string barcode = ""; while (sp.BytesToRead > 0) { byte[] buffer = new byte[sp.BytesToRead]; sp.Read(buffer, 0, buffer.Length); barcode += System.Text.Encoding.ASCII.GetString(buffer); System.Threading.Thread.Sleep(50); } return barcode; } private void Window_Closing(object sender, CancelEventArgs e) { try { serialPort.Close(); serialPort = null; } catch (Exception ex) { } } private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == Key.Enter) { //string barcode = Dispatcher.Invoke(() => { if (snrText.IsFocused) { Con_Click(null, null); } else { snrText.Focus(); } }); } } } }