183 lines
6.8 KiB
C#
183 lines
6.8 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Diagnostics;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using System.Timers;
|
||
using MECF.Framework.Simulator.Core.Driver;
|
||
|
||
namespace MECF.Framework.Simulator.Core.MFCs.Horiba
|
||
{
|
||
class SimMFC : SerialPortDeviceSimulator
|
||
{
|
||
private Dictionary<int, List<byte>> _flowDic = new Dictionary<int, List<byte>>();
|
||
|
||
Stopwatch _timer = new Stopwatch();
|
||
|
||
private System.Timers.Timer _tick;
|
||
Random _rd = new Random();
|
||
|
||
private object _locker = new object();
|
||
|
||
public string ResultValue { get; set; }
|
||
|
||
public SimMFC(string port)
|
||
: base(port, -1, "\r", ' ')
|
||
{
|
||
ResultValue = "";
|
||
|
||
_tick = new System.Timers.Timer();
|
||
_tick.Interval = 200;
|
||
|
||
_tick.Elapsed += _tick_Elapsed;
|
||
_tick.Start();
|
||
}
|
||
|
||
private void _tick_Elapsed(object sender, ElapsedEventArgs e)
|
||
{
|
||
|
||
lock (_locker)
|
||
{
|
||
if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))
|
||
{
|
||
_timer.Stop();
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
protected override void ProcessUnsplitMessage(string msg)
|
||
{
|
||
//if (!Failed)
|
||
{
|
||
var tmp = System.Text.Encoding.ASCII.GetBytes(msg).ToList();
|
||
var index = tmp.IndexOf(0x03);
|
||
if(tmp.Count > index + 2)
|
||
{
|
||
byte[] datas = new byte[index + 2];
|
||
tmp.CopyTo(0, datas,0, index + 2);
|
||
tmp.RemoveRange(0, index + 2);
|
||
|
||
if (datas.Length > 7)
|
||
{
|
||
//RFV
|
||
//40 30 31 02 52 46 56 03 71
|
||
if (datas[4] == 0x52 && datas[5] == 0x46 && datas[6] == 0x56)
|
||
{
|
||
var address = datas[1] + (datas[2] << 16);
|
||
if(_flowDic.ContainsKey(address))
|
||
{
|
||
List<byte> sendback = new List<byte>()
|
||
{
|
||
0x02,
|
||
};
|
||
var values = _flowDic[address];
|
||
values.ForEach(x=> sendback.Add(x));
|
||
int sum = 0;
|
||
values.ForEach(x => sum += x);
|
||
sendback.Add(0x03);
|
||
sendback.Add((byte)((sum + 0x03) % 128));
|
||
OnWriteMessage(sendback.ToArray());
|
||
}
|
||
else
|
||
{
|
||
//02 30 2E 30 32 34 37 31 32 31 03 42
|
||
List<byte> sendback = new List<byte>()
|
||
{
|
||
0x02,
|
||
0x30,
|
||
0x2e,
|
||
0x30,
|
||
0x32,
|
||
0x34,
|
||
0x37,
|
||
0x31,
|
||
0x32,
|
||
0x31,
|
||
0x03,
|
||
};
|
||
int sum = 0;
|
||
sendback.ForEach(x => sum += (int)x);
|
||
sendback.Add((byte)((sum - (int)sendback[0]) % 128));
|
||
OnWriteMessage(sendback.ToArray());
|
||
}
|
||
}
|
||
|
||
//AFC 9sccm
|
||
//40 30 31 02 41 46 43 30 30 30 39 2c 42 03 04
|
||
if (datas.Length >= 12 && datas[4] == 0x41 && datas[5] == 0x46 && datas[6] == 0x43)
|
||
{
|
||
var address = datas[1] + (datas[2] << 16);
|
||
int i1 = datas.ToList().IndexOf(0x43);
|
||
int i2 = datas.ToList().IndexOf(0x2c);
|
||
int valueLength = i2 - i1 - 1;
|
||
byte[] values = new byte[valueLength];
|
||
Array.Copy(datas, 7, values, 0, values.Length);
|
||
_flowDic[address] = values.ToList();
|
||
List<byte> sendback = new List<byte>()
|
||
{
|
||
0x02,
|
||
0x4f,
|
||
0x4b,
|
||
0x03,
|
||
};
|
||
int sum = 0;
|
||
sendback.ForEach(x => sum += (int)x);
|
||
sendback.Add((byte)((sum - (int)sendback[0]) % 128));
|
||
OnWriteMessage(sendback.ToArray());
|
||
}
|
||
|
||
//rfs
|
||
//40 30 31 02 52 46 53 03 6E
|
||
//02 31 30 30 2C 42 03 02
|
||
if (datas[4] == 0x52 && datas[5] == 0x46 && datas[6] == 0x53)
|
||
{
|
||
List<byte> sendback = new List<byte>()
|
||
{
|
||
0x02,
|
||
0x31,
|
||
0x30,
|
||
0x30,
|
||
0x2c,
|
||
0x42,
|
||
0x03,
|
||
};
|
||
int sum = 0;
|
||
sendback.ForEach(x => sum += (int)x);
|
||
sendback.Add((byte)((sum - (int)sendback[0]) % 128));
|
||
OnWriteMessage(sendback.ToArray());
|
||
}
|
||
|
||
//设为数字模式
|
||
//’!+REVERSE
|
||
//40 30 31 02 27 21 2B 52 45 56 45 52 53 45 03 12
|
||
if (datas[4] == 0x27 && datas[5] == 0x21 && datas[6] == 0x2b)
|
||
{
|
||
List<byte> sendback = new List<byte>()
|
||
{
|
||
0x02,
|
||
0x4f,
|
||
0x4b,
|
||
0x03,
|
||
};
|
||
int sum = 0;
|
||
sendback.ForEach(x => sum += (int)x);
|
||
sendback.Add((byte)((sum - (int)sendback[0]) % 128));
|
||
OnWriteMessage(sendback.ToArray());
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|