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