using Chloe;
using DNSD_DB;
using DNSD_DB.Entity;
using NDSD_Screwdriver.Tool;
using NDSD_TouchSocket;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using System.Xml.Serialization;
using NewLife.Caching;
namespace NDSD_Screwdriver
{
public partial class MainForm : Form
{
///
/// 输出端口操作
///
private DOperate DOperateInfo;
///
/// TCP服务器
///
private TcpServer server = TcpServer.Instance;
///
/// 前端列表集合
///
private List monitorEntities;
private List RFIDConfigEntitys;
private Random rand = new Random();
///
/// RFID状态列表
///
public List RFIDStatesEntities;
///
/// 报警灯配置实例
///
public List lightsEntities;
///
/// 日志实例
///
public List RFIDLogsEntitys;
///
/// 日志数据库操作实例
///
public IDbContext LogContext;
// Thread flashThread;
SerialPortFactory serialPort;
private CancellationTokenSource cancellationTokenSource;
private CancellationTokenSource sendCancellationTokenSource;
public int textRFID = 0;
private Queue _methodQueue;
private ICache cache = Cache.Default;
int FlashIndex = 0;
bool _flashflag = true;
public MainForm()
{
InitializeComponent();
_methodQueue = new Queue();
FlashThreadTime();
var memorySetting = MemorySetting.Current;
SqlLiteTool.CreateTable(memorySetting.DB);
LogContext = SqlLiteTool.GetDb(memorySetting.DB);
RFIDLogsEntitys = LogContext.Query().OrderByDesc(a => a.CreateTime).Take(200).ToList();
LogDataGridView.AutoGenerateColumns = false;
LogDataGridView.DataSource = null;
LogDataGridView.DataSource = RFIDLogsEntitys;
DOperateInfo = new DOperate();
if (!server.ServerOpen(memorySetting.ServerIP, memorySetting.ServerPort))
{
MessageBox.Show("服务端打开失败!");
FormUtils.LogInsert(LogContext, "服务端打开失败");
}
try
{
serialPort = new SerialPortFactory(memorySetting.Com);
StartLongRunningTask();
SendRunningTask();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
FormUtils.LogInsert(LogContext, e.Message);
}
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
if (server != null)
{
if (!server.ServerStop())
{
MessageBox.Show("服务端关闭失败!");
FormUtils.LogInsert(LogContext, "服务端关闭失败");
}
if (!server.ServerDispose())
{
MessageBox.Show("服务端释放失败!");
FormUtils.LogInsert(LogContext, "服务端释放失败");
}
}
if (sendCancellationTokenSource != null)
{
sendCancellationTokenSource.Cancel();
}
if (cancellationTokenSource != null)
{
cancellationTokenSource.Cancel();
}
timer.Close();
timer.Dispose();
}
#region 按钮
///
/// 打开DO测试
///
///
///
private void DOTest_Click(object sender, EventArgs e)
{
//string str = serialPort.Read();
ScrewdriverTest screwdriverTest = new ScrewdriverTest(server, DOperateInfo);
screwdriverTest.Show();
}
///
/// 初始化按钮
///
///
///
private void InitButton_Click(object sender, EventArgs e)
{
InitTable();
}
///
/// 初始化Table
///
private void InitTable()
{
_flashflag = true;
FlashIndex = 0;
textRFID = 0;
timer.Start();
var memorySetting = MemorySetting.Current;
//读取rfid数据
var ctx = SqlLiteTool.GetDb(memorySetting.DB);
var list = ctx.Query().Where(x => x.IsEnable == true).ToList();
var strs = list.Select(x => x.RfidNo).ToArray();
RFIDStatesEntities = new List();
RFIDStatesEntities.Clear();
foreach (var a in strs)
{
RFIDStatesEntities.Add(new RFIDStatesEntity()
{
RFIDValue = a,
});
}
RFIDStatesEntities[0].RFIDState = 2;
FormUtils.LogInsert(LogContext, "RFID " + 0 + " 准备工作", RFIDStatesEntities[0].RFIDValue);
GetLog();
//读取报警灯数据
lightsEntities = new List();
lightsEntities.Clear();
for (int i = 0; i < list.Count; i++)
{
lightsEntities.Add(new LightsEntity()
{
Green = Convert.ToInt32(list[i].Green),
Yellow = Convert.ToInt32(list[i].Yellow),
Red = Convert.ToInt32(list[i].Red),
});
}
//初始化列表框架
monitorEntities = new List();
monitorEntities.Clear();
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
monitorEntities.Add(new MonitorEntity()
{
RowIndex = i,
RowEntitys = InitRows(i)
});
}
//更新值
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
monitorEntities[i].RowEntitys[1].Value = RFIDStatesEntities[i].RFIDValue;
}
timer.Start();
RefreshRoll();
RefreshIO();
}
///
/// 打开设置界面
///
///
///
private void SettingButton_Click(object sender, EventArgs e)
{
FrmSetting frmSetting = new FrmSetting();
frmSetting.Show();
}
///
/// 服务端重启按钮
///
///
///
private void ServerRestartButton_Click(object sender, EventArgs e)
{
var memorySetting = MemorySetting.Current;
if (server.ServerRestart(memorySetting.ServerIP, memorySetting.ServerPort))
{
MessageBox.Show("服务器重启成功!");
FormUtils.LogInsert(LogContext, "服务器重启成功");
}
else
{
MessageBox.Show("服务器重启失败!请手动启动服务器。");
FormUtils.LogInsert(LogContext, "服务器重启失败");
}
}
///
/// 服务端手动启动
///
///
///
private void StartServerButton_Click(object sender, EventArgs e)
{
var memorySetting = MemorySetting.Current;
if (!server.ServerOpen(memorySetting.ServerIP, memorySetting.ServerPort))
{
MessageBox.Show("服务端打开失败!");
FormUtils.LogInsert(LogContext, "服务端打开失败");
}
else
{
MessageBox.Show("服务器启动成功");
FormUtils.LogInsert(LogContext, "服务器启动成功");
}
}
///
/// 服务端手动停止
///
///
///
private void ServerStopButton_Click(object sender, EventArgs e)
{
if (server != null)
{
if (!server.ServerStop())
{
MessageBox.Show("服务端关闭失败!");
FormUtils.LogInsert(LogContext, "服务端关闭失败");
}
if (!server.ServerDispose())
{
MessageBox.Show("服务端释放失败!");
FormUtils.LogInsert(LogContext, "服务端释放失败");
}
}
}
///
/// 测试按钮
///
///
///
private void TestButton1_Click(object sender, EventArgs e)
{
if (RFIDStatesEntities.Count == 0)
{
MessageBox.Show("请先初始化RFID列表!");
}
else if (textRFID == RFIDStatesEntities.Count)
{
SetNowWorkRow("0000000");
textRFID = 0;
return;
}
SetNowWorkRow(RFIDStatesEntities[textRFID].RFIDValue);
if (++textRFID > RFIDStatesEntities.Count)
{
textRFID = 0;
return;
}
}
#endregion
#region 功能性方法
///
/// 根据读取到的RFID条码设置当前工作的行 并且更新state
///
/// 读取到的RFID
private void SetNowWorkRow(string rfid)
{
var memorySetting = MemorySetting.Current;
//设置RFID状态
int flag = 0;
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDValue == rfid && RFIDStatesEntities[i].RFIDState == 2)
{
RFIDStatesEntities[i].RFIDState = 1;
FormUtils.LogInsert(LogContext, "RFID " + i + " 开始工作", RFIDStatesEntities[i].RFIDValue);
GetLog();
if (i - 1 >= 0)
{
string rfidValue = RFIDStatesEntities[i - 1].RFIDValue;
var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime;
double timeSpan = (DateTime.Now - leastTime).TotalSeconds;
if (timeSpan >= memorySetting.AlarmTimeValue)
{
RFIDStatesEntities[i - 1].RFIDState = 4;
FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", RFIDStatesEntities[i].RFIDValue);
}
if (timeSpan < memorySetting.AlarmTimeValue)
{
RFIDStatesEntities[i - 1].RFIDState = 3;
FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", RFIDStatesEntities[i].RFIDValue);
}
GetLog();
}
if (i + 1 < RFIDStatesEntities.Count)
{
FormUtils.LogInsert(LogContext, "RFID " + (i + 1) + " 准备工作", RFIDStatesEntities[i].RFIDValue);
GetLog();
RFIDStatesEntities[i + 1].RFIDState = 2;
FlashIndex = i + 1;
}
else
{
timer.Stop();
_flashflag = false;
}
flag = 1;
break;
}
}
if (flag == 0) //列表里没有已读的RFID
{
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDState == 1)
{
string rfidValue = RFIDStatesEntities[i - 1].RFIDValue;
var leastTime = RFIDLogsEntitys.First(x => x.RFIDId == rfidValue).CreateTime;
double timeSpan = (DateTime.Now - leastTime).TotalSeconds;
if (timeSpan >= memorySetting.AlarmTimeValue)
{
RFIDStatesEntities[i].RFIDState = 4;
FormUtils.LogInsert(LogContext, "RFID " + i + " 超时结束", RFIDStatesEntities[i].RFIDValue);
}
if (timeSpan < memorySetting.AlarmTimeValue)
{
RFIDStatesEntities[i].RFIDState = 3;
FormUtils.LogInsert(LogContext, "RFID " + (i - 1) + " 成功结束", RFIDStatesEntities[i].RFIDValue);
}
}
}
}
//刷新前端灯的状态
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDState == 1)
{
SetRowsLightState(i, 1);
}
else if (RFIDStatesEntities[i].RFIDState == 3)
{
SetRowsLightState(i, 0);
}
else if (RFIDStatesEntities[i].RFIDState == 4)
{
SetRowsLightState(i, 2);
}
else
{
SetRowsLightState(i, Brushes.Transparent);
}
}
if(_flashflag)
timer.Stop();
Thread.Sleep(500);
//刷新IO的状态
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDState == 1)
{
// DOperateInfo.DOpen(lightsEntities[i].Yellow);
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Yellow,
delay = 0
});
}
else if (RFIDStatesEntities[i].RFIDState == 3)
{
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Green,
delay = 0
});
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Yellow,
delay = -1
});
}
else if (RFIDStatesEntities[i].RFIDState == 4)
{
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Red,
delay = 0
});
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Yellow,
delay = -1
});
}
}
if (_flashflag)
timer.Start();
RefreshRoll();
}
///
/// 初始化一行
///
/// 当前的初始化行数
///
private List InitRows(int rowNo)
{
List rowEntities = new List();
for (int i = 0; i < 3; i++)
{
rowEntities.Add(new RowEntity()
{
ColumnIndex = i,
});
}
return rowEntities;
}
///
/// 刷新列表
///
private void RefreshRoll()
{
List values = new List();
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
values.Add(new string[]
{
"", "", ""
});
}
ScrewdriverMonitor.SetTableValue(values);
}
private void SetRowsLightState(int index, LightState lightState)
{
SetRowsLightState(index, FormUtils.EnumColorToBrush(lightState));
}
private void SetRowsLightState(int index, int lightState)
{
SetRowsLightState(index, (LightState)lightState);
}
///
/// 设置指定行指示灯的状态以及工作的行的标识
///
///
private void SetRowsLightState(int index, Brush brush)
{
monitorEntities[index].RowEntitys[2].Color = brush;
//工作中箭头指示
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
monitorEntities[i].RowEntitys[0].Value = RFIDStatesEntities[i].RFIDState == 1 ? "=>" : "";
}
}
///
/// 列表回调函数
///
///
///
///
///
///
///
private void ScrewdriverMonitor_OnDrawCellTextEvent(Graphics g, int rowIndex, int colIndex, RectangleF rectangle, string value, StringFormat sf)
{
foreach (MonitorEntity entity in monitorEntities)
{
if (rowIndex == entity.RowIndex)
{
foreach (RowEntity rowEneiey in entity.RowEntitys)
{
if (colIndex == rowEneiey.ColumnIndex)
{
g.FillRectangle(rowEneiey.Color, rectangle);
g.DrawString(rowEneiey.Value, this.ScrewdriverMonitor.Font, Brushes.Black, rectangle, sf);
}
}
}
}
}
///
/// RFID刷新任务
///
private void StartLongRunningTask()
{
cancellationTokenSource = new CancellationTokenSource();
Task.Run(() =>
{
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
//SetNowWorkRow("0000000");
// 这里是你的长期运行逻辑
Thread.Sleep(1000); // 模拟一些长时间的工作
}
}, cancellationTokenSource.Token);
}
///
/// RFID刷新任务
///
private void SendRunningTask()
{
sendCancellationTokenSource = new CancellationTokenSource();
Task.Run(() =>
{
while (!sendCancellationTokenSource.Token.IsCancellationRequested)
{
if (!cache.ContainsKey("Test"))
{
while (_methodQueue.Count > 0)
{
var q = _methodQueue.Dequeue();
// -1 DClose > 0 DTimeOpen =0 Dopen
if (q.delay == -1)
{
DOperateInfo.DClose(q.port);
}
if (q.delay == 0)
{
DOperateInfo.DOpen(q.port);
}
if (q.delay > 0)
{
DOperateInfo.DTimeOpen(q.port, q.delay);
}
Thread.Sleep(210); // 模拟一些长时间的工作
}
}
else
{
_methodQueue.Clear();
}
Thread.Sleep(100); // 模拟一些长时间的工作
}
}, cancellationTokenSource.Token);
}
/////
///// 等待工作指示灯闪烁进程
/////
//private void FlashThread()
//{
// //等待闪烁线程
// flashThread = new Thread(() =>
// {
// while (true)
// {
// DOperate.DTimeOpen(lightsEntities[FlashIndex].Yellow, 1);
// monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow;
// RefreshRoll();
// Thread.Sleep(1000);
// monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent;
// RefreshRoll();
// Thread.Sleep(1000);
// }
// });
//}
System.Timers.Timer timer = new System.Timers.Timer(1000); // 设置1秒间隔
///
/// 等待工作指示灯闪烁进程
///
private void FlashThreadTime()
{
int step = 0;
timer.Elapsed += (sender, e) =>
{
if (step == 0)
{
step = 1;
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[FlashIndex].Yellow,
delay = 1
});
monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow;
}
else if (step == 1)
{
step=0;
monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent;
}
RefreshRoll();
};
////等待闪烁线程
//flashThread = new Thread(() =>
//{
// while (true)
// {
// DOperate.DTimeOpen(lightsEntities[FlashIndex].Yellow, 1);
// monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Yellow;
// RefreshRoll();
// Thread.Sleep(1000);
// monitorEntities[FlashIndex].RowEntitys[2].Color = Brushes.Transparent;
// RefreshRoll();
// Thread.Sleep(1000);
// }
//});
}
///
/// 获取Log
///
private void GetLog()
{
RFIDLogsEntitys = LogContext.Query().OrderByDesc(a => a.CreateTime).Take(200).ToList();
LogDataGridView.DataSource = null;
LogDataGridView.DataSource = RFIDLogsEntitys;
}
///
/// 获取准备行
///
/// 准备行index
private int GetReadyRowIndex()
{
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDState == 2)
{
return i;
}
}
return -1;
}
///
/// 获取正在工作的行
///
/// 工作行index
private int GetNowRowIndex()
{
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
if (RFIDStatesEntities[i].RFIDState == 1)
{
return i;
}
}
return -1;
}
private void RefreshIO()
{
for (int i = 0; i < RFIDStatesEntities.Count; i++)
{
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Yellow,
delay = -1
});
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Red,
delay = -1
});
_methodQueue.Enqueue(new DOperateEntity()
{
port = lightsEntities[i].Green,
delay = -1
});
}
}
#endregion
}
}