Files
DanMuRead/BarrageGrab/ComPortServer.cs
T

137 lines
4.0 KiB
C#
Raw Normal View History

2024-03-29 17:34:14 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using Jint;
using Jint.Runtime;
using System.Windows.Forms;
namespace BarrageGrab
{
public class ComPortServer : IDisposable
{
WsBarrageServer server;
SerialPort sendPort;
static Engine jsEngine = null;
static ComPortServer()
{
2024-03-29 17:46:24 +08:00
if (AppSetting.Current.UseComPortFilter)
2024-03-29 17:34:14 +08:00
{
jsEngine = JsEngine.CreateNewEngine();
var jsFile = JsEngine.GetJsFile("comPortFilter.js");
jsEngine.Execute(jsFile);
}
}
public ComPortServer(WsBarrageServer server)
{
2024-03-29 17:46:24 +08:00
string portName = AppSetting.Current.ComPort;
int baudRate = AppSetting.Current.ComBaudRate;
2024-03-29 17:34:14 +08:00
if (portName.IsNullOrWhiteSpace())
{
return;
//throw new ArgumentNullException(nameof(portName));
}
this.server = server;
server.OnPackMessage += Server_OnPackMessage;
server.OnClose += Server_OnClose;
sendPort = new SerialPort(portName, baudRate);
}
private void Server_OnClose(object sender, EventArgs e)
{
this.Dispose();
}
private void Server_OnPackMessage(WsBarrageServer sender, WsBarrageServer.PackMsgEventArgs e)
{
if (!sendPort.IsOpen) return;
if (e == null) return;
2024-03-29 17:46:24 +08:00
if (!AppSetting.Current.UseComPortFilter)
2024-03-29 17:34:14 +08:00
{
var json = e.ToJson() + "\r\n";
var jbuff = Encoding.UTF8.GetBytes(json);
Send(jbuff);
return;
}
var result = jsEngine.Invoke("onPackData", e.MsgType.GetHashCode(), e.Message);
var nocanTypes = new Types[]
{
Types.Null,
Types.Undefined,
Types.Empty,
Types.Symbol
};
if (nocanTypes.Contains(result.Type)) return;
Func<string, byte[]> encode = (str) => Encoding.UTF8.GetBytes(str);
byte[] buff = new byte[0];
switch (result.Type)
{
case Types.Boolean:
buff = encode(result.AsBoolean().ToString().ToLower());
break;
case Types.String:
buff = encode(result.AsString());
break;
case Types.BigInt:
case Types.Number:
buff = BitConverter.GetBytes(result.AsNumber());
break;
case Types.Object:
if (result.ToObject() is byte[])
{
buff = result.AsArrayBuffer();
}
break;
default:
break;
}
if (buff.Length == 0) return;
Send(buff);
}
//发送数据包
private void Send(byte[] buff)
{
lock (this.sendPort)
{
sendPort.Write(buff, 0, buff.Length);
}
}
/// <summary>
/// 打开串口并开始接收写入数据
/// </summary>
public void OpenStart()
{
if (sendPort == null) throw new Exception("未成功初始化串口对象,请检查配置文件");
try
{
sendPort.Open();
}
catch (Exception ex)
{
sendPort.Close();
sendPort.Dispose();
sendPort = null;
throw ex;
}
}
public void Dispose()
{
if (sendPort == null) return;
sendPort.Close();
sendPort.Dispose();
sendPort = null;
jsEngine.Dispose();
}
}
}