Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../HardwareUnits/MFCs/HoribaMFC/HoribaHandler.cs

244 lines
7.2 KiB
C#

using Aitex.Core.RT.Event;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Communications;
using MECF.Framework.Common.Device.Bases;
using System.Collections.Generic;
namespace LsOneRT.Devices.HoribaMFC
{
public abstract class HoribaHandler : HandlerBase
{
private const byte Header = 0x40;
private const byte STX = 0x02;
private const byte ETX = 0x03;
public MfcBase MFCDevice { get; }
protected HoribaHandler(MfcBase mfc, string msdLsdAddress, string data)
: base(BuildMessage(msdLsdAddress, data))
{
MFCDevice = mfc;
}
private static byte[] BuildMessage(string msdLsdAddress, string data)
{
List<byte> message = new List<byte>();
message.Add(Header);
PacketMessage(msdLsdAddress, message);
message.Add(STX);
PacketMessage(data, message);
message.Add(ETX);
message.Add((byte)CalcBBC(data));
if(SC.ContainsItem("System.IsSimulatorMode") && SC.GetValue<bool>("System.IsSimulatorMode"))
message.Add(0x0D);
return message.ToArray();
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
ResponseMessage = msg;
handled = true;
return true;
}
private static int CalcBBC(string value)
{
int sum = 0;
foreach (var item in value)
{
sum += (int)item;
}
sum += ETX;
return sum % 128;
}
private static List<byte> PacketMessage(string msg, List<byte> msgList)
{
foreach (var item in msg)
{
msgList.Add((byte)item);
}
return msgList;
}
private static byte[] String2Ascii(string s)
{
byte[] array = System.Text.Encoding.ASCII.GetBytes(s);
return array;
}
}
public class HoribaMFCSetFlow : HoribaHandler
{
public HoribaMFCSetFlow(MfcBase mfc, string deviceAddress, float flow)
: base(mfc, deviceAddress, $"AFC{flow},B")
{
Name = "SetFlow";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as HoribaMessage;
handled = false;
if (!result.IsResponse) return true;
if (result.IsError || result.IsFormatError || result.IsNak)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
else
{
if (result.Datas[0] != 0x4f && result.Datas[0] != 0x4b)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
}
ResponseMessage = msg;
handled = true;
return true;
}
}
public class HoribaMFCQueryFlow : HoribaHandler
{
public HoribaMFCQueryFlow(MfcBase mfc, string deviceAddress)
: base(mfc, deviceAddress, $"RFV")
{
Name = "QueryFlow";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as HoribaMessage;
handled = false;
if (!result.IsResponse) return true;
if (result.IsError || result.IsFormatError || result.IsNak)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
else
{
float.TryParse(System.Text.Encoding.ASCII.GetString(result.Datas), out float flow);
MFCDevice.FeedBack = flow;
}
ResponseMessage = msg;
handled = true;
return true;
}
}
public class HoribaMFCQueryScale : HoribaHandler
{
public HoribaMFCQueryScale(MfcBase mfc, string deviceAddress)
: base(mfc, deviceAddress, $"RFS")
{
Name = "QueryScale";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as HoribaMessage;
handled = false;
if (!result.IsResponse) return true;
if (result.IsError || result.IsFormatError || result.IsNak)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
else
{
var dataArray = System.Text.Encoding.ASCII.GetString(result.Datas).Split(',');
float.TryParse(dataArray[0], out float range);
//temporary comment to fix compile issue
if(dataArray.Length > 1)
{
if (MFCDevice.Unit != dataArray[1].ToUpper())
EV.PostInfoLog(MFCDevice.Module, $"{MFCDevice.Module} {MFCDevice.Name} change from {MFCDevice.Unit} to {dataArray[1].ToUpper()}");
MFCDevice.Unit = dataArray[1].ToUpper();
}
}
ResponseMessage = msg;
handled = true;
return true;
}
}
public class HoribaMFCSetDigitalMode : HoribaHandler
{
public HoribaMFCSetDigitalMode(MfcBase mfc, string deviceAddress)
: base(mfc, deviceAddress, $"'!+REVERSE")
{
Name = "SetDigitalMode";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as HoribaMessage;
handled = false;
if (!result.IsResponse) return true;
if (result.IsError || result.IsFormatError || result.IsNak)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
else
{
if (result.Datas[0] != 0x4f && result.Datas[0] != 0x4b)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
}
ResponseMessage = msg;
handled = true;
return true;
}
}
public class HoribaMFCSetAnalogMode : HoribaHandler
{
public HoribaMFCSetAnalogMode(MfcBase mfc, string deviceAddress)
: base(mfc, deviceAddress, $"'!+NORMAL")
{
Name = "SetAnalogMode";
}
public override bool HandleMessage(MessageBase msg, out bool handled)
{
var result = msg as HoribaMessage;
handled = false;
if (!result.IsResponse) return true;
if (result.IsError || result.IsFormatError || result.IsNak)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
else
{
if (result.Datas[0] != 0x4f && result.Datas[0] != 0x4b)
{
Singleton<HoribaConnection>.Instance.Horiba.SetError(result.RawMessage);
}
}
ResponseMessage = msg;
handled = true;
return true;
}
}
}