CytEndPointConnection.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using MECF.Framework.Common.Communications;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Remoting.Lifetime;
  5. using Aitex.Core.RT.Log;
  6. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.EndPoints.CytEndPoints
  7. {
  8. public class CytEndPointMessage : BinaryMessage
  9. {
  10. public ResponseHeader Header { get; set; }
  11. public ByteReader DataReader { get; set; }
  12. }
  13. public class CytEndPointConnection : TCPPortConnectionBase
  14. {
  15. private List<byte> _lstCacheBuffer = new List<byte>();
  16. private HandlerBase _eventHandler ;
  17. private object _locker = new object();
  18. public CytEndPointConnection(string address)
  19. : base(address, "", false)
  20. {
  21. }
  22. public void SetEventHandler(CytEndPointHandler handler)
  23. {
  24. _eventHandler = handler;
  25. }
  26. public override bool SendMessage(byte[] message)
  27. {
  28. lock (_locker)
  29. {
  30. _lstCacheBuffer.Clear();
  31. }
  32. return base.SendMessage(message);
  33. }
  34. public override void _port_HandleBinarayData(byte[] binaryData)
  35. {
  36. MessageBase msg = ParseResponse(binaryData);
  37. ProceedTransactionMessage(msg);
  38. lock (_locker)
  39. {
  40. while (_lstCacheBuffer.Count > 0)
  41. {
  42. msg = ParseResponse(new byte[0]);
  43. if (!msg.IsComplete)
  44. break;
  45. ProceedTransactionMessage(msg);
  46. }
  47. }
  48. }
  49. protected override MessageBase ParseResponse(byte[] rawMessage)
  50. {
  51. lock (_locker)
  52. {
  53. //LOG.Write($"=========ParseResponse, cache length: {_lstCacheBuffer.Count}, receive length: {rawMessage.Length}");
  54. if (rawMessage != null && rawMessage.Length>0)
  55. {
  56. _lstCacheBuffer.AddRange(rawMessage);
  57. }
  58. byte[] temps = _lstCacheBuffer.ToArray();
  59. CytEndPointMessage msg = new CytEndPointMessage();
  60. msg.IsResponse = false;
  61. msg.IsAck = false;
  62. msg.IsComplete = false;
  63. if (temps.Length < 14) return msg;
  64. msg.DataReader = new ByteReader(temps, temps.Length);
  65. var buf = new byte[ResponseHeader.Size];
  66. msg.DataReader.ReadBytes(buf, ResponseHeader.Size);
  67. msg.Header = ByteStructConverter.ToStruct<ResponseHeader>(buf);
  68. if (msg.Header.command == (byte)EPDCommand.QueryCfgList)
  69. {
  70. if (!msg.DataReader.ReadInt(out int count))
  71. return msg;
  72. if (msg.DataReader.Length < (14 + 256 * count))
  73. return msg;
  74. msg.RawMessage = _lstCacheBuffer.Take(14 + 256 * count).ToArray();
  75. msg.DataReader.Reset(ResponseHeader.Size);
  76. _lstCacheBuffer.RemoveRange(0, 14 + 256 * count);
  77. //LOG.Write($"=========msg QueryCfgList, header length: {msg.Header.length}");
  78. }
  79. else if (msg.Header.command == (byte)EPDCommand.Event)
  80. {
  81. if (msg.DataReader.Length < (14 + 4 + 8 + 16 + 256))
  82. return msg;
  83. msg.RawMessage = _lstCacheBuffer.Take(14 + 4 + 8 + 16 + 256).ToArray();
  84. msg.DataReader.Reset(ResponseHeader.Size);
  85. _lstCacheBuffer.RemoveRange(0, 14 + 4 + 8 + 16 + 256);
  86. //LOG.Write($"=========msg Event , header length: {msg.Header.length}");
  87. }
  88. else if (msg.Header.command == (byte)EPDCommand.QueryCurrentConfig)
  89. {
  90. if (msg.DataReader.Length < (14 + msg.Header.length))
  91. return msg;
  92. msg.RawMessage = _lstCacheBuffer.Take(14 + msg.Header.length).ToArray();
  93. msg.DataReader.Reset(ResponseHeader.Size);
  94. _lstCacheBuffer.RemoveRange(0, 14 + msg.Header.length);
  95. //LOG.Write($"=========msg QueryCurrentConfig, header length: {msg.Header.length}");
  96. }
  97. else
  98. {
  99. if (msg.DataReader.Length < (14 + msg.Header.length))
  100. return msg;
  101. msg.RawMessage = _lstCacheBuffer.Take(14 + msg.Header.length).ToArray();
  102. msg.DataReader.Reset(ResponseHeader.Size);
  103. _lstCacheBuffer.RemoveRange(0, 14 + msg.Header.length);
  104. //LOG.Write($"=========msg command {msg.Header.command} , header length: {msg.Header.length}");
  105. }
  106. msg.IsResponse = true;
  107. msg.IsAck = true;
  108. msg.IsComplete = true;
  109. msg.IsEvent = msg.Header.command == (int)EPDCommand.Event;
  110. msg.IsError = msg.Header.errorcode != 0;
  111. return msg;
  112. }
  113. }
  114. protected override void OnEventArrived(MessageBase msg)
  115. {
  116. _eventHandler.HandleMessage(msg, out _);
  117. }
  118. }
  119. }