Files
lserp_cs_6.0/其他程序/RFIDManagement/RFIDManagement/FrmMain.cs
T
cyf ab56a9bcf7 基线 SVN r240
SVN-Revision: r240
2025-02-06 06:46:06 +00:00

682 lines
26 KiB
C#

using Lskj.Business.Impl;
using Lskj.Control;
using Lskj.Control.Model;
using Lskj.Core;
using ReaderApi;
using ReaderApi.Data;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using static ReaderApi.DeviceManagement;
namespace RFIDManagement
{
public partial class FrmMain : BaseForm
{
public FrmMain()
{
InitializeComponent();
this.Load += OnFormLoad;
this.FormClosing += OnFrmMainFormClosing;
}
/// <summary>
/// 连接驱动
/// </summary>
public DeviceManagement Device;
/// <summary>
/// 连接数
/// </summary>
public List<Reader> Readers;
/// <summary>
/// 消息
/// </summary>
public List<Tag> Tags;
/// <summary>
/// 标记
/// </summary>
public bool StartFlag;
/// <summary>
/// 更新数据Timer
/// </summary>
public System.Windows.Forms.Timer UpdateTagTimer;
/// <summary>
/// 展示视频Timer
/// </summary>
public System.Windows.Forms.Timer ShowTimer;
/// <summary>
/// 界面上下文
/// </summary>
public SynchronizationContext SyncContext;
/// <summary>
/// 当前连接
/// </summary>
public Reader SelectReader;
/// <summary>
/// 数据源
/// </summary>
public DataTable SourceTable;
/// <summary>
/// 写入数据窗口
/// </summary>
FrmDataWrite DataWriteForm;
/// <summary>
/// 初始化界面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFormLoad(object sender, EventArgs e)
{
this.startLinkBtn.Enabled = true;
this.stopLinkBtn.Enabled = true;
this.startReadBtn.Enabled = false;
this.stopReadBtn.Enabled = false;
this.writeBtn.Enabled = false;
if (!DBConfig.Instance.CreateConnection())
{
MessageUtil.Show("网络连接失败");
Close();
}
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.AppendLine($"if not exists(select top 1 * from sysObjects where Id = object_id(N'P_RfidInfoTab') and xtype = 'U')");
sqlBuilder.AppendLine($"begin");
sqlBuilder.AppendLine($"create table P_RfidInfoTab(id int IDENTITY(1, 1) NOT NULL,epc varchar(100) NULL,url varchar(200) NULL,fileType int NULL,nextTime int NULL,orderId int NULL,nowCount int NULL,allCount int NULL)");
sqlBuilder.AppendLine($"end");
sqlBuilder.AppendLine($"else begin");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'epc')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add epc varchar(100) end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'url')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add url varchar(200) end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'fileType')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add fileType int end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'nextTime')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add nextTime int end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'orderId')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add orderId int end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'nowCount')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add nowCount int end");
sqlBuilder.AppendLine($"if not exists(select top 1 * from syscolumns where id = object_id(N'P_RfidInfoTab') and name = 'allCount')");
sqlBuilder.AppendLine($"begin alter table P_RfidInfoTab add allCount int end");
sqlBuilder.AppendLine($"end");
SqlHelper.ExecuteNonQuery(sqlBuilder.ToString());
SqlHelper.ExecuteNonQuery("update P_RfidInfoTab set nowCount = '0'");
UpdateTagTimer = new System.Windows.Forms.Timer();
UpdateTagTimer.Interval = 200;
UpdateTagTimer.Tick += OnUpdateTagTimerTick;
UpdateTagTimer.Enabled = true;
ShowTimer = new System.Windows.Forms.Timer();
ShowTimer.Interval = 100;
ShowTimer.Tick += OnShowTimerTick;
ShowTimer.Enabled = true;
SyncContext = SynchronizationContext.Current;
Device = new DeviceManagement();
Tags = new List<Tag>();
Readers = new List<Reader>();
Device.OnDeviceState += new DeviceEventHandle(OnDeviceEventHandle);
Device.OnRecvMessage += new MessageReceivedEventHandle(OnRecvMessageEventHandle);
this.startLinkBtn.Click += OnStartLinkBtnClick;
this.stopLinkBtn.Click += OnStopLinkBtnClick;
this.startReadBtn.Click += OnStartReadBtnClick;
this.stopReadBtn.Click += OnStopReadBtnClick;
this.writeBtn.Click += OnWriteBtnClick;
this.refushBtn.Click += OnRefushBtnClick; ;
this.com_LinkType.SelectedIndexChanged += OnComLinkTypeSelectedIndexChanged;
string linkType = IniHelper.Read("LinkType");
int selectIndex = com_LinkType.Properties.Items.IndexOf(linkType);
com_LinkType.SelectedIndex = selectIndex;
InitSourceTable();
}
/// <summary>
/// 开始连接按钮点击时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnStartLinkBtnClick(object sender, EventArgs e)
{
string connectMode = com_LinkType.Text;
string connectStr = com_LinkPms.Text;
try
{
ConnectDevice(connectMode, connectStr, 1);
}
catch (Exception ex)
{
MessageUtil.Show(ex.Message);
}
}
/// <summary>
/// 断开连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnStopLinkBtnClick(object sender, EventArgs e)
{
ConnectClose();
lb_LinkTips.Text = "未连接";
lb_LinkTips.ForeColor = Color.Gray;
startLinkBtn.Enabled = true;
stopLinkBtn.Enabled = true;
startReadBtn.Enabled = false;
stopReadBtn.Enabled = false;
writeBtn.Enabled = false;
}
/// <summary>
/// 开始读取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnStartReadBtnClick(object sender, EventArgs e)
{
if (lb_LinkTips.Text.Equals("已连接"))
{
Tags.Clear();
var result = SelectReader?.Send(new InventoryPara(InventoryMode.EPC));
if (result != null)
{
GlobalPara.tagDisplayArea = TagDisplayArea.main;
}
startLinkBtn.Enabled = false;
stopLinkBtn.Enabled = true;
startReadBtn.Enabled = false;
stopReadBtn.Enabled = true;
writeBtn.Enabled = false;
}
else
{
MessageUtil.Show("未连接");
}
}
/// <summary>
/// 停止读取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnStopReadBtnClick(object sender, EventArgs e)
{
SelectReader?.Send(new InventoryStopPara());
startLinkBtn.Enabled = false;
stopLinkBtn.Enabled = true;
startReadBtn.Enabled = true;
stopReadBtn.Enabled = false;
writeBtn.Enabled = true;
}
/// <summary>
/// 标签写入按钮点击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnWriteBtnClick(object sender, EventArgs e)
{
if (!StartFlag)
{
try
{
DataWriteForm = new FrmDataWrite();
DataWriteForm.SelectReader = SelectReader;
DataWriteForm.ShowDialog();
DataWriteForm.Dispose();
}
catch (Exception ex)
{
MessageUtil.Show(ex.Message);
}
}
else
{
MessageUtil.Show("请先停止读取数据");
}
}
/// <summary>
/// 重置按钮点击
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRefushBtnClick(object sender, EventArgs e)
{
SqlHelper.ExecuteNonQuery("update P_RfidInfoTab set nowCount = '0'");
}
/// <summary>
/// 切换连接模式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnComLinkTypeSelectedIndexChanged(object sender, EventArgs e)
{
if (com_LinkType.Text.Equals("RS232"))
{
InitRS232();
}
else if (com_LinkType.Text.Equals("UDP"))
{
InitUDP();
}
}
/// <summary>
/// RFID设备状态改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnDeviceEventHandle(object sender, DeviceEventArgs e)
{
if (e.cmd == ReaderApi.DeviceState.Connected)
{
foreach (Reader re in Readers)
{
var result = re?.Send(new InventoryStopPara());
}
AddReader(e.reader);
SyncContext.Post(AddReaderUI, e.reader);
}
else if (e.cmd == ReaderApi.DeviceState.Disconnected)
{
RemoveReader(e.reader);
SyncContext.Post(RemoveReaderUI, e.reader);
}
else if (e.cmd == ReaderApi.DeviceState.ConnectError)
{
SelectReader = null;
MessageUtil.Show($"连接错误!\r\n{e.reader.connectStr}");
}
}
/// <summary>
/// 接收RFID数据事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRecvMessageEventHandle(object sender, MessageReceivedEventArgs e)
{
if (e.data != null)
{
if (e.cmd == CmdType.cmd_tag || e.cmd == CmdType.cmd_write_tag || e.cmd == CmdType.cmd_lock_tag || e.cmd == CmdType.cmd_kill_tag) //标签数据
{
if (GlobalPara.tagDisplayArea == TagDisplayArea.main)
{
GlobalMethod.AddTag(e.data as Tag, Tags);
}
else if (GlobalPara.tagDisplayArea == TagDisplayArea.writeTag || GlobalPara.tagDisplayArea == TagDisplayArea.writeTagRead || GlobalPara.tagDisplayArea == TagDisplayArea.writeTagReadListBox2)
{
SyncContext.Post(DataWriteFormAddTag, e.data);
}
}
else
{
if (e.cmd == CmdType.cmd_tag_epc || e.cmd == CmdType.cmd_tag_tid || e.cmd == CmdType.cmd_tag_epc_tid || e.cmd == CmdType.cmd_tag_epc_user) //开始读取标签成功
{
StartFlag = (e.data as Result).isSuccess;
}
else if (e.cmd == CmdType.cmd_inventory_stop)//停止读标签成功
{
if ((e.data as Result).isSuccess)
{
StartFlag = false;
}
}
if (e.cmd == CmdType.cmd_485_address)//485地址设置
{
if ((e.data as Result).isSuccess)
{
MessageUtil.Show("485地址已经改变");
}
}
}
}
}
/// <summary>
/// 创建数据源
/// </summary>
private void InitSourceTable()
{
SourceTable = new DataTable();
SourceTable.Columns.Add("EpcColumn");
SourceTable.Columns.Add("PCColumn");
SourceTable.Columns.Add("AntColumn");
SourceTable.Columns.Add("RSSIColumn");
SourceTable.Columns.Add("CountColumn");
SourceTable.Columns.Add("FrequencyColumn");
this.gcMain.DataSource = SourceTable;
}
/// <summary>
/// 加载串口
/// </summary>
private void InitRS232()
{
string comPort = IniHelper.Read("RS232");
com_LinkPms.Properties.Items.Clear();
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
com_LinkPms.Properties.Items.Add(port);
}
int selectIndex = com_LinkPms.Properties.Items.IndexOf(comPort);
if (selectIndex > 0)
{
com_LinkPms.SelectedIndex = selectIndex;
}
}
/// <summary>
/// 加载UDP
/// </summary>
private void InitUDP()
{
string udpServer = IniHelper.Read("UDP");
com_LinkPms.Properties.Items.Clear();
if (!string.IsNullOrEmpty(udpServer))
{
com_LinkPms.Text = udpServer;
}
else
{
com_LinkPms.Text = "192.168.0.188:4001";
}
}
/// <summary>
/// 保存连接信息
/// </summary>
private void SaveLink()
{
IniHelper.Write("LinkType", com_LinkType.Text);
if (com_LinkType.Text.Equals("RS232"))
{
IniHelper.Write("RS232", com_LinkPms.Text);
}
else if (com_LinkType.Text.Equals("UDP"))
{
IniHelper.Write("UDP", com_LinkPms.Text);
}
}
/// <summary>
/// 创建连接
/// </summary>
/// <param name="connectMode"></param>
/// <param name="connectStr"></param>
/// <param name="rs485add"></param>
private void ConnectDevice(string connectMode, string connectStr, int rs485add)
{
Device.Open(connectMode, connectStr, rs485add);
}
/// <summary>
/// 添加Readers
/// </summary>
/// <param name="state"></param>
private void AddReaderUI(object state)
{
if (Readers.Count == 1)
{
WaitForm.ShowForm("连接中...");
SelectReader = Readers.First();
InventoryStopPara stopPara = new InventoryStopPara();
var resultStop = SelectReader?.SendSyn(stopPara);
SyncContext.Post(UpdateConnectState, resultStop);
if (resultStop.isSuccess)
{
GetVersionPara para = new GetVersionPara();
var result = SelectReader?.SendSyn(para);
SyncContext.Post(UpdateVersion, result);
}
WaitForm.HideForm();
}
}
/// <summary>
/// 添加Reader
/// </summary>
/// <param name="reader"></param>
public void AddReader(Reader reader)
{
lock (Readers)
{
var newReaderFlag = false;
foreach (var re in Readers)
{
if (re.connectStr == reader.connectStr)
{
newReaderFlag = true;
}
}
if (!newReaderFlag)
{
Readers.Add(reader);
}
}
}
/// <summary>
/// 移除Readers
/// </summary>
/// <param name="state"></param>
private void RemoveReaderUI(object state)
{
if (Readers.Count == 1)
{
SelectReader = Readers.First();
}
}
/// <summary>
/// 移除Readers
/// </summary>
/// <param name="reader"></param>
private void RemoveReader(Reader reader)
{
lock (Readers)
{
foreach (var re in Readers)
{
if (re.connectStr == reader.connectStr)
{
Readers.Remove(reader);
break;
}
}
}
}
/// <summary>
/// 更新连接信息
/// </summary>
/// <param name="state"></param>
private void UpdateConnectState(object state)
{
var result = state as Result;
if (!result.isSuccess)
{
MessageUtil.Show(result.errorMsg);
lb_LinkTips.Text = "连接失败";
lb_LinkTips.ForeColor = Color.Red;
ConnectClose();
}
}
private void UpdateVersion(object state)
{
var result = state as Result;
if (result.isSuccess)
{
lb_LinkTips.Text = "已连接";
lb_LinkTips.ForeColor = Color.Green;
startLinkBtn.Enabled = false;
stopLinkBtn.Enabled = true;
startReadBtn.Enabled = true;
stopReadBtn.Enabled = false;
writeBtn.Enabled = true;
SaveLink();
}
else
{
lb_LinkTips.Text = "连接失败";
lb_LinkTips.ForeColor = Color.Red;
ConnectClose();
startLinkBtn.Enabled = true;
stopLinkBtn.Enabled = true;
startReadBtn.Enabled = false;
stopReadBtn.Enabled = false;
writeBtn.Enabled = false;
}
}
/// <summary>
/// 关闭连接
/// </summary>
private void ConnectClose()
{
Device?.Close();
Readers?.Clear();
Tags?.Clear();
gridView?.BeginUpdate();
SourceTable?.Rows.Clear();
gridView?.EndUpdate();
SelectReader = null;
}
/// <summary>
/// 更新数据事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnUpdateTagTimerTick(object sender, EventArgs e)
{
gridView.BeginUpdate();
lock (Tags)
{
foreach (Tag tag in Tags)
{
DataRow row = SourceTable.AsEnumerable().Where(n => (n["EpcColumn"] + "").Equals(tag.epc)).FirstOrDefault();
if (row != null)
{
row["PCColumn"] = tag.pc.ToString();
row["AntColumn"] = tag.ant.ToString();
row["RSSIColumn"] = tag.rssi.ToString();
row["CountColumn"] = tag.count.ToString();
if (tag.frequency >= 0xC9)
{
row["FrequencyColumn"] = tag.frequency.ToString("X2");
}
else
{
if (Frequency.frequency.ContainsKey(tag.frequency))
{
row["FrequencyColumn"] = Frequency.frequency[tag.frequency];
}
else
{
row["FrequencyColumn"] = tag.frequency.ToString("X2");
}
}
}
else
{
DataRow newRow = SourceTable.NewRow();
newRow["EpcColumn"] = tag.epc.ToString();
newRow["PCColumn"] = tag.pc.ToString();
newRow["AntColumn"] = tag.ant.ToString();
newRow["RSSIColumn"] = tag.rssi.ToString();
newRow["CountColumn"] = tag.count.ToString();
newRow["FrequencyColumn"] = tag.frequency.ToString();
SourceTable.Rows.Add(newRow);
}
}
List<DataRow> deleteRows = new List<DataRow>();
foreach (DataRow row in SourceTable.Rows)
{
Tag tag = Tags.Where(n => n.epc.Equals(row["EpcColumn"] + "")).FirstOrDefault();
if (tag == null)
{
deleteRows.Add(row);
}
}
foreach (DataRow deleteRow in deleteRows)
{
SourceTable.Rows.Remove(deleteRow);
}
}
gridView.EndUpdate();
Tags.Clear();
}
/// <summary>
/// 更新数据事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnShowTimerTick(object sender, EventArgs e)
{
ShowTimer.Enabled = false;
try
{
List<DataRow> dataRowsList = SourceTable.AsEnumerable().OrderByDescending(n => Convert.ToDecimal(n["RSSIColumn"])).ToList();
if (dataRowsList != null)
{
foreach (DataRow dataRow in dataRowsList)
{
string epcValue = dataRow["EpcColumn"] + "";
DataTable selectTable = BaseImpl.GetDataTableResult($"select * from P_RfidInfoTab where epc = '{epcValue}' order by orderId");
foreach (DataRow selectRow in selectTable.Rows)
{
try
{
int.TryParse(selectRow["id"] + "", out int id);
int.TryParse(selectRow["nextTime"] + "", out int nextTime);
string url = selectRow["url"] + "";
int.TryParse(selectRow["fileType"] + "", out int fileType);
int.TryParse(selectRow["nowCount"] + "", out int nowCount);
int.TryParse(selectRow["allCount"] + "", out int allCount);
int intervalTime = nextTime != 0 ? nextTime * 1000 : 1000;
if (nowCount < allCount)
{
using (FrmVlcPlayer frmVlcPlayer = new FrmVlcPlayer())
{
frmVlcPlayer.PlayVideo(url);
if (fileType.Equals(0))
{
frmVlcPlayer.Opacity = 1;
frmVlcPlayer.WindowState = FormWindowState.Maximized;
}
else
{
frmVlcPlayer.Opacity = 0;
frmVlcPlayer.WindowState = FormWindowState.Minimized;
}
frmVlcPlayer.TopMost = true;
frmVlcPlayer.ShowDialog();
}
SqlHelper.ExecuteNonQuery($"update P_RfidInfoTab set nowCount = '{nowCount + 1}' where id = '{id}'");
Thread.Sleep(intervalTime);
}
}
catch (Exception)
{
}
}
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
ShowTimer.Enabled = true;
}
/// <summary>
/// 写入数据
/// </summary>
private void DataWriteFormAddTag(object state)
{
DataWriteForm?.AddTag(state as Tag);
}
/// <summary>
/// 窗体关闭时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnFrmMainFormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
if (stopReadBtn.Enabled)
{
OnStopReadBtnClick(null, null);
}
if (stopLinkBtn.Enabled)
{
OnStopLinkBtnClick(null, null);
}
}
}
}