97 lines
2.9 KiB
C#
97 lines
2.9 KiB
C#
|
using Aitex.Core.RT.Log;
|
|||
|
using MECF.Framework.Common.Communications;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Text.RegularExpressions;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot.HineAutomation
|
|||
|
{
|
|||
|
public class HAtmMessage : AsciiMessage
|
|||
|
{
|
|||
|
public string DeviceAddress { get; set; }
|
|||
|
public string Action { get; set; }
|
|||
|
public string Parameter { get; set; }
|
|||
|
public int DataLength { get; set; }
|
|||
|
public string Data { get; set; }
|
|||
|
public string ErrorText { get; set; }
|
|||
|
|
|||
|
|
|||
|
public string ResponseRecordType { get; set; }
|
|||
|
public string Category { get; set; }
|
|||
|
}
|
|||
|
|
|||
|
public class HAtmConnection : ConnectionBase
|
|||
|
{
|
|||
|
private const string ResponseRecordType = "X";
|
|||
|
|
|||
|
public HAtmConnection(string addr) : base(addr)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void EnableLog(bool enable)
|
|||
|
{
|
|||
|
_socket.EnableLog = enable;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnDataReceived(string oneLineMessage)
|
|||
|
{
|
|||
|
MessageBase msg = ParseResponse(oneLineMessage);
|
|||
|
if (msg.IsFormatError)
|
|||
|
{
|
|||
|
SetCommunicationError(true, "received invalid response message.");
|
|||
|
}
|
|||
|
|
|||
|
lock (_lockerActiveHandler)
|
|||
|
{
|
|||
|
if (_activeHandler != null)
|
|||
|
{
|
|||
|
if (msg.IsFormatError || (((HAtmHandler)_activeHandler).HasResponse && (_activeHandler.HandleMessage(msg, out bool completed) && completed)))
|
|||
|
{
|
|||
|
_activeHandler = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected override MessageBase ParseResponse(string rawText)
|
|||
|
{
|
|||
|
HAtmMessage msg = new HAtmMessage();
|
|||
|
msg.IsResponse = false;
|
|||
|
msg.IsAck = false;
|
|||
|
msg.IsComplete = false;
|
|||
|
msg.RawMessage = rawText;
|
|||
|
rawText = rawText.Replace("\r", "").Replace("\n", "");
|
|||
|
string[] words = Regex.Split(rawText, ",");
|
|||
|
|
|||
|
if (words.Length < 2 || words[0] != ResponseRecordType)
|
|||
|
{
|
|||
|
msg.IsFormatError = true;
|
|||
|
LOG.Error($"Record type check failed, " + rawText);
|
|||
|
return msg;
|
|||
|
}
|
|||
|
|
|||
|
msg.ResponseRecordType = words[0];
|
|||
|
msg.Category = words[1];
|
|||
|
if(words.Length > 2)
|
|||
|
{
|
|||
|
msg.Data = words[2];
|
|||
|
|
|||
|
msg.MessagePart = new string[words.Length - 2];
|
|||
|
for (int i = 0; i < msg.MessagePart.Length; i++)
|
|||
|
{
|
|||
|
msg.MessagePart[i] = words[2 + i];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
msg.IsResponse = true;
|
|||
|
msg.IsAck = true;
|
|||
|
msg.IsComplete = true;
|
|||
|
return msg;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|