1303 lines
45 KiB
C#
1303 lines
45 KiB
C#
|
using Aitex.Core.Util;
|
|||
|
using MECF.Framework.Common.Utilities;
|
|||
|
using MECF.Framework.Simulator.Core.Driver;
|
|||
|
using Newtonsoft.Json;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading;
|
|||
|
using System.Timers;
|
|||
|
|
|||
|
namespace MECF.Framework.Simulator.Core.Commons
|
|||
|
{
|
|||
|
public class SerialPortDeviceSimulatorFactory
|
|||
|
{
|
|||
|
public static CommonSerialPortDeviceSimulator GetCommonSerialPortDeviceSimulator(string port, string deviceName)
|
|||
|
{
|
|||
|
if(deviceName == "SiasunPhoenixB")
|
|||
|
{
|
|||
|
return new SiasunPhoenixBSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "Siasun1500C800C")
|
|||
|
{
|
|||
|
return new Siasun1500C800CSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "BrooksVCE")
|
|||
|
{
|
|||
|
return new BrooksVCESimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "Hanbell")
|
|||
|
{
|
|||
|
return new HanbellPumpSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "HirataR4")
|
|||
|
{
|
|||
|
return new HirataR4Simulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "BrooksSMIF")
|
|||
|
{
|
|||
|
return new BrooksSMIFSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "SiasunAligner")
|
|||
|
{
|
|||
|
return new SiasunAlignerSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "RisshiChiller")
|
|||
|
{
|
|||
|
return new RisshiChillerSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "SiasunVCE")
|
|||
|
{
|
|||
|
return new SiasunVCESimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "TazmoRobot")
|
|||
|
{
|
|||
|
return new TazmoRobotSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "VATS651")
|
|||
|
{
|
|||
|
return new VATS651Simulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "TruPlasmaRF")
|
|||
|
{
|
|||
|
return new TruPlasmaRFSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "SkyPump")
|
|||
|
{
|
|||
|
return new SkyPumpSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "CommetRFMatch")
|
|||
|
{
|
|||
|
return new CommetRFMatchSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "FujikinMFC")
|
|||
|
{
|
|||
|
return new FujikinMFCSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "PfeifferPumpA603")
|
|||
|
{
|
|||
|
return new PfeifferPumpA603Simulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "PfeifferPumpA100")
|
|||
|
{
|
|||
|
return new PfeifferPumpA100Simulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "EdwardsPump")
|
|||
|
{
|
|||
|
return new EdwardsPumpSimulator(port, deviceName);
|
|||
|
}
|
|||
|
else if (deviceName == "KaimeiRFMatch")
|
|||
|
{
|
|||
|
return new KaimeiRFMatchSimulator(port, deviceName);
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public class CommonSerialPortDeviceSimulator : SerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public bool Failed { get; set; }
|
|||
|
public bool AutoReply { get; set; } = true;
|
|||
|
|
|||
|
public bool IsAtSpeed { get; set; }
|
|||
|
|
|||
|
Stopwatch _timer = new Stopwatch();
|
|||
|
|
|||
|
private System.Timers.Timer _tick;
|
|||
|
|
|||
|
private object _locker = new object();
|
|||
|
|
|||
|
public string ResultValue { get; set; }
|
|||
|
|
|||
|
public List<IOSimulatorItemViewModel> IOSimulatorItemList { get; set; }
|
|||
|
|
|||
|
public event Action<IOSimulatorItemViewModel> SimulatorItemActived;
|
|||
|
|
|||
|
string _deviceName;
|
|||
|
public CommonSerialPortDeviceSimulator(string port, string deviceName, bool isAscii = false, string newLine = "\r")
|
|||
|
: base(port, -1, newLine, ' ', isAscii)
|
|||
|
{
|
|||
|
_deviceName = deviceName;
|
|||
|
ResultValue = "";
|
|||
|
|
|||
|
_tick = new System.Timers.Timer();
|
|||
|
_tick.Interval = 200;
|
|||
|
|
|||
|
_tick.Elapsed += _tick_Elapsed;
|
|||
|
_tick.Start();
|
|||
|
|
|||
|
IsAtSpeed = true;
|
|||
|
}
|
|||
|
|
|||
|
public CommonSerialPortDeviceSimulator(string port, string deviceName, bool isAscii, string newLine, int dataBits)
|
|||
|
: base(port, -1, newLine, ' ', isAscii, dataBits)
|
|||
|
{
|
|||
|
_deviceName = deviceName;
|
|||
|
ResultValue = "";
|
|||
|
|
|||
|
_tick = new System.Timers.Timer();
|
|||
|
_tick.Interval = 200;
|
|||
|
|
|||
|
_tick.Elapsed += _tick_Elapsed;
|
|||
|
_tick.Start();
|
|||
|
|
|||
|
IsAtSpeed = true;
|
|||
|
}
|
|||
|
|
|||
|
private void _tick_Elapsed(object sender, ElapsedEventArgs e)
|
|||
|
{
|
|||
|
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))
|
|||
|
{
|
|||
|
_timer.Stop();
|
|||
|
|
|||
|
IsAtSpeed = true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//private string GetCharsFormFromBinaryString(String binary)
|
|||
|
//{
|
|||
|
// return Encoding.ASCII.GetString(GetBytesFromBinaryString(binary));
|
|||
|
//}
|
|||
|
|
|||
|
private string GetCharsFormFromBinaryString(byte[] binary)
|
|||
|
{
|
|||
|
return Encoding.ASCII.GetString(binary);
|
|||
|
}
|
|||
|
|
|||
|
protected override void ProcessUnsplitMessage(byte[] binaryMessage)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
var activeSimulatorItem = GetActiveIOSimulatorItemViewModel(binaryMessage);
|
|||
|
if (activeSimulatorItem == null) return;
|
|||
|
|
|||
|
activeSimulatorItem.CommandContent = string.Join("," , binaryMessage.Select(bt=>bt.ToString("X2")).ToArray());
|
|||
|
activeSimulatorItem.CommandRecievedTime = DateTime.Now;
|
|||
|
|
|||
|
if (SimulatorItemActived != null)
|
|||
|
SimulatorItemActived(activeSimulatorItem);
|
|||
|
|
|||
|
if (AutoReply)
|
|||
|
{
|
|||
|
OnWriteSimulatorItem(activeSimulatorItem);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected override void ProcessUnsplitMessage(string msg)
|
|||
|
{
|
|||
|
lock (_locker)
|
|||
|
{
|
|||
|
var activeSimulatorItem = GetActiveIOSimulatorItemViewModel(msg);
|
|||
|
if (activeSimulatorItem == null) return;
|
|||
|
|
|||
|
activeSimulatorItem.CommandContent = msg;
|
|||
|
activeSimulatorItem.CommandRecievedTime = DateTime.Now;
|
|||
|
|
|||
|
if (SimulatorItemActived != null)
|
|||
|
SimulatorItemActived(activeSimulatorItem);
|
|||
|
|
|||
|
if(AutoReply)
|
|||
|
{
|
|||
|
OnWriteSimulatorItem(activeSimulatorItem);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected virtual IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
protected virtual IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
protected virtual void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void ManualWriteMessage(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteSimulatorItem(activeSimulatorItem);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public class SiasunPhoenixBSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public SiasunPhoenixBSimulator(string port, string deviceName):base(port, deviceName)
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommandName))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if(activeSimulatorItem.SourceCommandName.StartsWith("RQ"))
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.Response + "\r");
|
|||
|
Thread.Sleep(1000);
|
|||
|
OnWriteMessage("_RDY" + "\r");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.Response + "\r");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class Siasun1500C800CSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public Siasun1500C800CSimulator(string port, string deviceName) : base(port, deviceName)
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommandName))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if (activeSimulatorItem.SourceCommandName.StartsWith("RQ"))
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.Response + "\r");
|
|||
|
Thread.Sleep(1000);
|
|||
|
OnWriteMessage("_RDY" + "\r");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.Response + "\r");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class RisshiChillerSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static char _startLine = (char)1;
|
|||
|
private static char _endLine = (char)3;
|
|||
|
public RisshiChillerSimulator(string port, string deviceName) : base(port, deviceName, true, _endLine.ToString())
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem.Response));
|
|||
|
}
|
|||
|
|
|||
|
private string BuildMessage(string response)
|
|||
|
{
|
|||
|
string sLength = response.Length.ToString("D2");
|
|||
|
var charArray = (sLength + response).ToArray();
|
|||
|
int sum = charArray.Sum(chr => (int)chr);
|
|||
|
string sSum = sum.ToString("X");
|
|||
|
|
|||
|
if (sSum.Length < 2)
|
|||
|
return _startLine + sLength + response + "0" + sSum + _endLine.ToString();
|
|||
|
else
|
|||
|
return _startLine + sLength + response + sSum.Substring(sSum.Length - 2) + _endLine.ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
public class SiasunAlignerSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static char _startLine = (char)1;
|
|||
|
private static char _endLine = (char)3;
|
|||
|
public SiasunAlignerSimulator(string port, string deviceName) : base(port, deviceName, true, _endLine.ToString())
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem.Response));
|
|||
|
}
|
|||
|
|
|||
|
private string BuildMessage(string response)
|
|||
|
{
|
|||
|
string sLength = response.Length.ToString("D2");
|
|||
|
var charArray = (sLength + response).ToArray();
|
|||
|
int sum = charArray.Sum(chr=>(int)chr);
|
|||
|
string sSum = sum.ToString("X");
|
|||
|
|
|||
|
if(sSum.Length < 2)
|
|||
|
return _startLine + sLength + response + "0" + sSum + _endLine.ToString();
|
|||
|
else
|
|||
|
return _startLine + sLength + response + sSum.Substring(sSum.Length-2) + _endLine.ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public class TruPlasmaRFResponse
|
|||
|
{
|
|||
|
public string GS { get; set; }
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public string Status { get; set; }
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public string Type { get; set; }
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public string Data { get; set; }
|
|||
|
}
|
|||
|
public class TruPlasmaRFSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static byte _start = 0xAA;
|
|||
|
private static byte _address = 0x01;
|
|||
|
private static byte _stop = 0x55;
|
|||
|
private static byte _ack = 0x06;
|
|||
|
public TruPlasmaRFSimulator(string port, string deviceName) : base(port, deviceName, false, "",8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
if(msg.Length < 8)
|
|||
|
return null;
|
|||
|
var msgArray = msg.Select(bt => bt.ToString("X2")).ToArray();
|
|||
|
string msgCommand = string.Join(",", msgArray, 4, 4);
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msgCommand == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return IOSimulatorItemList.Find(item=>item.SourceCommandName == "ExecuteAnyCommand");
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(new byte[] { _ack });
|
|||
|
Thread.Sleep(1000);
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem));
|
|||
|
}
|
|||
|
|
|||
|
private static byte[] BuildMessage(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
TruPlasmaRFResponse rfResponse = JsonConvert.DeserializeObject<TruPlasmaRFResponse>(activeSimulatorItem.Response);
|
|||
|
|
|||
|
List<byte> buffer = new List<byte>();
|
|||
|
|
|||
|
buffer.Add(_start);
|
|||
|
buffer.Add(_address);
|
|||
|
int length = 4;
|
|||
|
if (rfResponse.Status != null)
|
|||
|
length++;
|
|||
|
if (rfResponse.Type != null)
|
|||
|
length++;
|
|||
|
if (rfResponse.Data != null)
|
|||
|
{
|
|||
|
length += rfResponse.Data.Split(',').Length;
|
|||
|
}
|
|||
|
|
|||
|
buffer.Add((byte)length);
|
|||
|
buffer.Add(Convert.ToByte(rfResponse.GS, 16));
|
|||
|
|
|||
|
buffer.AddRange(activeSimulatorItem.SourceCommand.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
|
|||
|
|
|||
|
if (rfResponse.Status != null)
|
|||
|
buffer.Add(Convert.ToByte(rfResponse.Status, 16));
|
|||
|
if (rfResponse.Type != null)
|
|||
|
buffer.Add(Convert.ToByte(rfResponse.Type, 16));
|
|||
|
if (rfResponse.Data != null)
|
|||
|
{
|
|||
|
buffer.AddRange(rfResponse.Data.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
}
|
|||
|
var contentBuffer = buffer.Skip(3).Take(buffer.Count - 3).ToArray();
|
|||
|
buffer.AddRange(BitConverter.GetBytes(Crc16.Crc16Ccitt(contentBuffer)));
|
|||
|
buffer.Add(_stop);
|
|||
|
|
|||
|
return buffer.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
public class CommetRFMatchSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static byte _start = 0xAA;
|
|||
|
private static byte _address = 0x21;
|
|||
|
public CommetRFMatchSimulator(string port, string deviceName) : base(port, deviceName, false, "", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
var msgArray = msg.Select(bt => bt.ToString("X2")).ToArray();
|
|||
|
string msgCommand = string.Join(",", msgArray, 2, 2);
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msgCommand == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
private static int iCount = 0;
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
|
|||
|
if (activeSimulatorItem.Response.Contains("|"))
|
|||
|
{
|
|||
|
var resArray = activeSimulatorItem.Response.Split('|');
|
|||
|
int length = resArray.Length;
|
|||
|
OnWriteMessage(BuildMessage(resArray[iCount%length]));
|
|||
|
iCount++;
|
|||
|
if (iCount > 100)
|
|||
|
iCount = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem.Response));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static byte[] BuildMessage(string reponse)
|
|||
|
{
|
|||
|
List<byte> buffer = new List<byte>();
|
|||
|
|
|||
|
buffer.Add(_start);
|
|||
|
buffer.Add(_address);
|
|||
|
|
|||
|
buffer.AddRange(reponse.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
|
|||
|
byte checkSum = 0;
|
|||
|
for (int i = 0; i < buffer.Count; i++)
|
|||
|
{
|
|||
|
checkSum += buffer[i];
|
|||
|
}
|
|||
|
buffer.Add(checkSum);
|
|||
|
|
|||
|
return buffer.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class KaimeiRFMatchSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
//private byte _address = 0x01;
|
|||
|
private string _load = "01,F4";
|
|||
|
private string _tune = "01,F4";
|
|||
|
private string _mode = "01,00";
|
|||
|
private List<byte> _msgBuffer = new List<byte>();
|
|||
|
public KaimeiRFMatchSimulator(string port, string deviceName) : base(port, deviceName, false, "", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
_msgBuffer.AddRange(msg);
|
|||
|
if(_msgBuffer.Count < 8)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
if(_msgBuffer[1] == 0x03)
|
|||
|
{
|
|||
|
if(_msgBuffer.Count >= 8)
|
|||
|
{
|
|||
|
var msgArray = _msgBuffer.Select(bt => bt.ToString("X2")).ToArray();
|
|||
|
string msgCommand = string.Join(",", msgArray, 0, 4);
|
|||
|
_msgBuffer.RemoveRange(0, msgArray.Length);
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msgCommand == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if(_msgBuffer[1] == 0x10)
|
|||
|
{
|
|||
|
var length = _msgBuffer[6];
|
|||
|
if (_msgBuffer.Count >= 7 + length + 2)
|
|||
|
{
|
|||
|
var msgArray = _msgBuffer.Select(bt => bt.ToString("X2")).ToArray();
|
|||
|
string msgCommand = string.Join(",", msgArray, 0, 4);
|
|||
|
_msgBuffer.RemoveRange(0, msgArray.Length);
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msgCommand == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if(activeSimulatorItem.SourceCommandName == "SetPresetAbsoluteMode")
|
|||
|
{
|
|||
|
var contentArray = activeSimulatorItem.CommandContent.Split(',');
|
|||
|
if (contentArray.Length >= 15)
|
|||
|
{
|
|||
|
var modeArray = contentArray.Skip(7).Take(2).ToArray();
|
|||
|
var tuneArray = contentArray.Skip(9).Take(2).ToArray();
|
|||
|
var loadArray = contentArray.Skip(11).Take(2);
|
|||
|
_tune = $"0{string.Join(",", tuneArray).Substring(1)}";
|
|||
|
_load = $"0{string.Join(",", loadArray).Substring(1)}";
|
|||
|
_mode = string.Join(",", modeArray.Reverse());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (activeSimulatorItem.SourceCommandName == "GetStatus")
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage($"{activeSimulatorItem.Response},{_tune},{_load},{_mode}"));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem.Response));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private byte[] BuildMessage(string reponse)
|
|||
|
{
|
|||
|
List<byte> buffer = new List<byte>();
|
|||
|
|
|||
|
buffer.AddRange(reponse.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
|
|||
|
var checkSum = Crc16.CRC16_ModbusRTU(buffer.ToArray());
|
|||
|
var ret = BitConverter.GetBytes(checkSum);
|
|||
|
buffer.AddRange(ret);
|
|||
|
|
|||
|
return buffer.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class FujikinMFCSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static byte _start = 0x02;
|
|||
|
private static byte _end = 0x00;
|
|||
|
private static byte _address = 0x00;
|
|||
|
private static byte _ack = 0x06;
|
|||
|
private static byte _nak = 0x16;
|
|||
|
public FujikinMFCSimulator(string port, string deviceName) : base(port, deviceName, false, "", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
var msgArray = msg.Select(bt => bt.ToString("X2")).ToArray();
|
|||
|
string commandType = msgArray[2];
|
|||
|
string msgCommand = string.Join(",", msgArray, 4, 3);
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (commandType == simulatorItem.SourceCommandType && msgCommand == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if(activeSimulatorItem.Response == activeSimulatorItem.SuccessResponse.ToString())
|
|||
|
{
|
|||
|
OnWriteMessage(new byte[] {0x06});
|
|||
|
Thread.Sleep(1000);
|
|||
|
|
|||
|
var resArray = activeSimulatorItem.Response.Split('|');
|
|||
|
int iIndex = new Random().Next(0, resArray.Length - 1);
|
|||
|
string responseData = resArray[iIndex];
|
|||
|
if(responseData == "06" )
|
|||
|
{
|
|||
|
OnWriteMessage(new byte[] { _ack });
|
|||
|
}
|
|||
|
else if (responseData == "16")
|
|||
|
{
|
|||
|
OnWriteMessage(new byte[] { _nak });
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem, responseData));
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(new byte[] { _nak });
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static byte[] BuildMessage(IOSimulatorItemViewModel activeSimulatorItem, string responseData)
|
|||
|
{
|
|||
|
string reponse = activeSimulatorItem.Response;
|
|||
|
List<byte> buffer = new List<byte>();
|
|||
|
var responseArray = responseData.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray();
|
|||
|
buffer.Add(_address);
|
|||
|
buffer.Add(_start);
|
|||
|
buffer.Add(Convert.ToByte(activeSimulatorItem.SourceCommandType, 16));
|
|||
|
buffer.Add((byte)(3+ responseArray.Length));
|
|||
|
buffer.AddRange(activeSimulatorItem.SourceCommand.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
buffer.AddRange(responseArray);
|
|||
|
buffer.Add(_end);
|
|||
|
|
|||
|
byte checkSum = 0;
|
|||
|
for (int i = 1; i < buffer.Count-1; i++)
|
|||
|
{
|
|||
|
checkSum += buffer[i];
|
|||
|
}
|
|||
|
buffer.Add(checkSum);
|
|||
|
|
|||
|
return buffer.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public class PfeifferPumpA603Simulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static string _start = "#";
|
|||
|
private static string _address = "005";
|
|||
|
private static string _end = "\r";
|
|||
|
public PfeifferPumpA603Simulator(string port, string deviceName) : base(port, deviceName, true, "\r", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(_start + _address + activeSimulatorItem.Response + _end);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class PfeifferPumpA100Simulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static string _start = "#";
|
|||
|
private static string _address = "005";
|
|||
|
private static string _end = "\r";
|
|||
|
public PfeifferPumpA100Simulator(string port, string deviceName) : base(port, deviceName, true, "\r", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(_start + _address + "," + activeSimulatorItem.Response + _end);
|
|||
|
}
|
|||
|
}
|
|||
|
public class EdwardsPumpSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static string _end = "\r\n";
|
|||
|
private bool _isPumpOn;
|
|||
|
public EdwardsPumpSimulator(string port, string deviceName) : base(port, deviceName, true, "\r", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if (activeSimulatorItem.SourceCommandName == "SwitchPump")
|
|||
|
{
|
|||
|
if (activeSimulatorItem.CommandContent.Contains("0"))
|
|||
|
_isPumpOn = false;
|
|||
|
else
|
|||
|
_isPumpOn = true;
|
|||
|
}
|
|||
|
|
|||
|
if (activeSimulatorItem.SourceCommandName == "ReadPumpStatus")
|
|||
|
{
|
|||
|
OnWriteMessage($"{(_isPumpOn?"4":"0")},{activeSimulatorItem.Response}{_end}");
|
|||
|
}
|
|||
|
else
|
|||
|
OnWriteMessage(activeSimulatorItem.Response + _end);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class SkyPumpSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private static string _start = "@";
|
|||
|
private static string _address = "00";
|
|||
|
private static string _end = "\0\r\n";
|
|||
|
public SkyPumpSimulator(string port, string deviceName) : base(port, deviceName, true, "\r", 8)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.Contains(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(_start + _address + " " + activeSimulatorItem.Response + _end);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class VATS651Simulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
static string _endLine = "\r\n";
|
|||
|
public VATS651Simulator(string port, string deviceName) : base(port, deviceName, true, _endLine.ToString())
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg.IndexOf(simulatorItem.SourceCommand) == 0)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if(activeSimulatorItem.Response == activeSimulatorItem.SuccessResponseStr)
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.SourceCommand + activeSimulatorItem.Response + _endLine);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage("E" + activeSimulatorItem.Response + _endLine);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class TazmoRobotSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
static string _enq = ((char)0x05).ToString();
|
|||
|
static string _ack = ((char)0x06).ToString();
|
|||
|
static string _nak = ((char)0x15).ToString();
|
|||
|
static string _busy = ((char)0x11).ToString();
|
|||
|
static string _cr = ((char)0x0D).ToString();
|
|||
|
static string _endLine = ((char)0x0A).ToString();
|
|||
|
|
|||
|
public TazmoRobotSimulator(string port, string deviceName) : base(port, deviceName)
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
string content = msg.Remove(msg.Length - 1);
|
|||
|
var contentArray = content.Split(',');
|
|||
|
if (contentArray.Length > 0)
|
|||
|
{
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (simulatorItem.SourceCommand != null && contentArray[0] == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//1) action: ack & completeEvent==command + send ack after complete process
|
|||
|
//2) query: command,parameterlist,,,respone
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if (activeSimulatorItem.SourceCommandName == "SendError")
|
|||
|
{
|
|||
|
OnWriteMessage("ERR," + activeSimulatorItem.Response + _endLine);
|
|||
|
return;
|
|||
|
}
|
|||
|
if (activeSimulatorItem.SourceCommandName.Contains("Read"))
|
|||
|
{
|
|||
|
if (activeSimulatorItem.Response != null)
|
|||
|
OnWriteMessage(activeSimulatorItem.SourceCommand + "," + activeSimulatorItem.Response + _endLine);
|
|||
|
else
|
|||
|
OnWriteMessage(activeSimulatorItem.SourceCommand + _endLine);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
OnWriteMessage(_ack);
|
|||
|
if (activeSimulatorItem.Response == "CompleteEvent")
|
|||
|
{
|
|||
|
Thread.Sleep(1000);
|
|||
|
OnWriteMessage(activeSimulatorItem.SourceCommand + _endLine);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class SiasunVCESimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public SiasunVCESimulator(string port, string deviceName) : base(port, deviceName)
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
//id,E
|
|||
|
//id,A,DC
|
|||
|
string content = msg.Remove(msg.Length - 1);
|
|||
|
var contentArray = content.Split(',');
|
|||
|
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (contentArray.Length == 2)
|
|||
|
{
|
|||
|
if (simulatorItem.SourceCommandType != null && contentArray[1] == simulatorItem.SourceCommandType)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (contentArray.Length > 2)
|
|||
|
{
|
|||
|
if (simulatorItem.SourceCommandType != null && contentArray[1] == simulatorItem.SourceCommandType &&
|
|||
|
simulatorItem.SourceCommand != null && contentArray[2] == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
//if (activeSimulatorItem.Response.First() == '{')
|
|||
|
//{
|
|||
|
// var response = activeSimulatorItem.Response.Substring(1, activeSimulatorItem.Response.Length - 2);
|
|||
|
// OnWriteMessage("00," + response + "\r");
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// var responseArray = activeSimulatorItem.Response.Split(',');
|
|||
|
// foreach (var response in responseArray)
|
|||
|
// {
|
|||
|
// OnWriteMessage("00," + response + "\r");
|
|||
|
// Thread.Sleep(1000);
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
if(activeSimulatorItem.SourceCommandType == "A" || activeSimulatorItem.SourceCommandType == "S" || activeSimulatorItem.SourceCommandType == "P")
|
|||
|
{
|
|||
|
OnWriteMessage("M," + activeSimulatorItem.Response + "\r");
|
|||
|
}
|
|||
|
else if (activeSimulatorItem.SourceCommandType == "R")
|
|||
|
{
|
|||
|
OnWriteMessage("X," + activeSimulatorItem.Response + "\r");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public class BrooksVCESimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public BrooksVCESimulator(string port, string deviceName) : base(port, deviceName)
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
//id,E
|
|||
|
//id,A,DC
|
|||
|
string content = msg.Remove(msg.Length - 1);
|
|||
|
var contentArray = content.Split(',');
|
|||
|
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (contentArray.Length == 2)
|
|||
|
{
|
|||
|
if (simulatorItem.SourceCommandType != null && contentArray[1] == simulatorItem.SourceCommandType)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
else if (contentArray.Length > 2)
|
|||
|
{
|
|||
|
if (simulatorItem.SourceCommandType != null && contentArray[1] == simulatorItem.SourceCommandType &&
|
|||
|
simulatorItem.SourceCommand != null && contentArray[2] == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
if (activeSimulatorItem.Response.First() == '{')
|
|||
|
{
|
|||
|
var response = activeSimulatorItem.Response.Substring(1, activeSimulatorItem.Response.Length - 2);
|
|||
|
OnWriteMessage("00," + response + "\r");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var responseArray = activeSimulatorItem.Response.Split(',');
|
|||
|
foreach (var response in responseArray)
|
|||
|
{
|
|||
|
OnWriteMessage("00," + response + "\r");
|
|||
|
Thread.Sleep(1000);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
internal class HanbellPumpSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
public HanbellPumpSimulator(string port, string deviceName) : base(port, deviceName,false)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(byte[] msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (msg[1] == byte.Parse(simulatorItem.SourceCommand))
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(activeSimulatorItem.Response.Split(',').Select(s => Convert.ToByte(s, 16)).ToArray());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class HirataR4Simulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private string _address = "002";
|
|||
|
protected static char _stx = '\u0002';
|
|||
|
protected static char _etx = '\u0003';
|
|||
|
protected static char _space = '\u0020';
|
|||
|
|
|||
|
private int _lpIndex = 1;
|
|||
|
|
|||
|
public HirataR4Simulator(string port, string deviceName) : base(port, deviceName,false,"\0")
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
IOSimulatorItemViewModel theSimulatorItem = null;
|
|||
|
int maxMatachLength = -1;
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
int iIndex = msg.IndexOf(simulatorItem.SourceCommand);
|
|||
|
if(iIndex > 0)
|
|||
|
{
|
|||
|
int matchLength = simulatorItem.SourceCommand.Length;
|
|||
|
if (matchLength > maxMatachLength)
|
|||
|
{
|
|||
|
maxMatachLength = matchLength;
|
|||
|
theSimulatorItem = simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
return theSimulatorItem;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
List<byte> _cache = new List<byte>();
|
|||
|
protected override void ProcessUnsplitMessage(byte[] binaryMessage)
|
|||
|
{
|
|||
|
_cache.AddRange(binaryMessage);
|
|||
|
if (!_cache.Contains((byte) (3)))
|
|||
|
return;
|
|||
|
|
|||
|
string message = Encoding.ASCII.GetString(_cache.ToArray());
|
|||
|
|
|||
|
_cache.Clear();
|
|||
|
|
|||
|
OnReadMessage(message);
|
|||
|
|
|||
|
if (message.Contains("GP 1"))
|
|||
|
_lpIndex = 1;
|
|||
|
if (message.Contains("GP 2"))
|
|||
|
_lpIndex = 2;
|
|||
|
if (message.Contains("GP 3"))
|
|||
|
_lpIndex = 3;
|
|||
|
if (message.Contains("GP 4"))
|
|||
|
_lpIndex = 4;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
OnWriteMessage(BuildMessage(activeSimulatorItem.SourceCommand, activeSimulatorItem.Response) + "\0");
|
|||
|
}
|
|||
|
|
|||
|
private string BuildMessage(string command, string response)
|
|||
|
{
|
|||
|
if (command == "LE 100")
|
|||
|
{
|
|||
|
if (_lpIndex == 1)
|
|||
|
response = Convert.ToInt32("1111111111111111111111111", 2).ToString();
|
|||
|
if (_lpIndex == 2)
|
|||
|
response = "0";
|
|||
|
if (_lpIndex == 3)
|
|||
|
response = Convert.ToInt32("1100000000000000000000000", 2).ToString();
|
|||
|
if (_lpIndex == 4)
|
|||
|
response = Convert.ToInt32("0000000000000000000000011", 2).ToString();
|
|||
|
|
|||
|
}
|
|||
|
if (command == "LE 101")
|
|||
|
{
|
|||
|
if (_lpIndex == 1)
|
|||
|
response = "0";
|
|||
|
if (_lpIndex == 2)
|
|||
|
response = "0";
|
|||
|
if (_lpIndex == 3)
|
|||
|
response = "0";
|
|||
|
if (_lpIndex == 4)
|
|||
|
response = "0";
|
|||
|
}
|
|||
|
|
|||
|
string msg1 = $"{_address} {response}{_etx}";
|
|||
|
if(response.First() == '-')
|
|||
|
{
|
|||
|
msg1 = $"{_address}{response}{_etx}";
|
|||
|
}
|
|||
|
|
|||
|
byte lrc = CalcLRC(Encoding.ASCII.GetBytes(msg1).ToList());
|
|||
|
string msg = $"{_stx}{msg1}{(char)(lrc)}";
|
|||
|
return msg;
|
|||
|
}
|
|||
|
private static byte CalcLRC(List<byte> data)
|
|||
|
{
|
|||
|
byte ret = 0x00;
|
|||
|
for (var i = 0; i < data.Count; i++)
|
|||
|
{
|
|||
|
ret ^= data[i];
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public class BrooksSMIFSimulator : CommonSerialPortDeviceSimulator
|
|||
|
{
|
|||
|
private bool _isPodPresent = true;
|
|||
|
private DeviceTimer _timer = new DeviceTimer();
|
|||
|
private int _motionTime = 3000;//ms
|
|||
|
public BrooksSMIFSimulator(string port, string deviceName) : base(port, deviceName, true, "\r\n")
|
|||
|
{
|
|||
|
}
|
|||
|
protected override IOSimulatorItemViewModel GetActiveIOSimulatorItemViewModel(string msg)
|
|||
|
{
|
|||
|
if (IOSimulatorItemList == null)
|
|||
|
return null;
|
|||
|
|
|||
|
string content = msg.Remove(msg.Length - 2);
|
|||
|
var contentArray = content.Split(' ');
|
|||
|
if (contentArray.Length < 2)
|
|||
|
return null;
|
|||
|
|
|||
|
foreach (var simulatorItem in IOSimulatorItemList)
|
|||
|
{
|
|||
|
if (contentArray[0] == simulatorItem.SourceCommandType)
|
|||
|
{
|
|||
|
if(simulatorItem.SourceCommand == null)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
else if(contentArray[1] == simulatorItem.SourceCommand)
|
|||
|
{
|
|||
|
return simulatorItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnWriteSimulatorItem(IOSimulatorItemViewModel activeSimulatorItem)
|
|||
|
{
|
|||
|
string newLine = "\r\n";
|
|||
|
string commandType = activeSimulatorItem.SourceCommandType;
|
|||
|
if (activeSimulatorItem.SourceCommandName.ToUpper() == "LOAD")
|
|||
|
_isPodPresent = true;
|
|||
|
if (activeSimulatorItem.SourceCommandName.ToUpper() == "UNLOAD")
|
|||
|
_isPodPresent = true;
|
|||
|
|
|||
|
if(activeSimulatorItem.SourceCommandName.ToUpper() == "LOAD" ||
|
|||
|
activeSimulatorItem.SourceCommandName.ToUpper() == "UNLOAD" ||
|
|||
|
activeSimulatorItem.SourceCommandName.ToUpper() == "HOME" ||
|
|||
|
activeSimulatorItem.SourceCommandName.ToUpper() == "RECOVERY")
|
|||
|
{
|
|||
|
if (_timer.IsIdle())
|
|||
|
_timer.Stop();
|
|||
|
_timer.Start(0);
|
|||
|
}
|
|||
|
|
|||
|
if (commandType == "AERS" || commandType == "ARS")
|
|||
|
{
|
|||
|
OnWriteMessage(commandType + " " + activeSimulatorItem.Response + newLine);
|
|||
|
}
|
|||
|
else if (commandType == "ECR")
|
|||
|
{
|
|||
|
OnWriteMessage("ECD " + activeSimulatorItem.Response + newLine);
|
|||
|
}
|
|||
|
else if (commandType == "FSR")
|
|||
|
{
|
|||
|
var response = activeSimulatorItem.Response;
|
|||
|
if (_isPodPresent)
|
|||
|
response += " PIP=TRUE";
|
|||
|
else
|
|||
|
response += " PIP=FALSE";
|
|||
|
|
|||
|
if(_timer.IsIdle() || _timer.GetElapseTime() >= _motionTime)
|
|||
|
response += " READY=TRUE";
|
|||
|
else
|
|||
|
response += " READY=FALSE";
|
|||
|
OnWriteMessage(response + newLine);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (activeSimulatorItem.Response == "OK")
|
|||
|
{
|
|||
|
OnWriteMessage("HCA OK" + newLine);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var resArray = activeSimulatorItem.Response.Split('|');
|
|||
|
int iIndex = new Random().Next(0, resArray.Length - 1);
|
|||
|
OnWriteMessage("HCA " + resArray[iIndex] + newLine);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|