using HMI.Core.Util;
using HMI.UI.Entity;
using HMI.UI.Util;
using HMI.Util;
using Panuon.WPF.UI;
using System;
using System.ComponentModel;
using System.IO.Ports;
using System.Windows;
namespace Plugin.StandardTest
{
public class BarcodeEventArg
{
public string name { get; private set; }
public string positionCode { get; private set; }
public string snrCode { get; private set; }
public BarcodeEventArg(string name, string positionCode, string snrCode)
{
this.name = name;
this.positionCode = positionCode;
this.snrCode = snrCode;
}
}
///
/// 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;
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("", "Config");
string portName = IniFileHelper.ReadIniData(section, "PortName", "","");
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)
{
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)
{
MessageBox.Show($"{this.lang("Tr.GetGunData")}: {ex.StackTrace}");
}
}
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
{
FinishBarcode.Invoke(this, new BarcodeEventArg(Tag.ToString(), position, snr));
//positionText.Text = "";
//snrText.Text = "";
positionText.Focus();
}
catch (Exception 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
{
FinishBarcode.Invoke(this, new BarcodeEventArg(Tag.ToString(), position, snr));
this.Close();
}
catch (Exception ex)
{
ToastHelper.Warning(this, ex.Message);
}
}
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.UTF8.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)
{
}
}
}
}