TazmoAlignerConnection.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Aitex.Core.RT.Log;
  2. using MECF.Framework.Common.Communications;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO.Ports;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TazmoAligners
  10. {
  11. public class TazmoAlignerMessage:AsciiMessage
  12. {
  13. public string Data { get; set; }
  14. }
  15. public class TazmoAlignerMessageBIN:BinaryMessage
  16. {
  17. public byte[] CMD { get; set; }
  18. public byte[] Data { get; set; }
  19. }
  20. public class TazmoAlignerConnection: SerialPortConnectionBase
  21. {
  22. private List<byte> _lstCacheBuffer = new List<byte>();
  23. public TazmoAlignerConnection(string portName, int baudRate = 9600, int dataBits = 8, Parity parity = Parity.None, StopBits stopBits = StopBits.One)
  24. : base(portName, baudRate, dataBits, parity, stopBits, "\r", false)
  25. {
  26. }
  27. public override bool SendMessage(byte[] message)
  28. {
  29. LOG.Write($"{Address} send message:{Encoding.ASCII.GetString(message)}");
  30. _lstCacheBuffer.Clear();
  31. return base.SendMessage(message);
  32. }
  33. protected override MessageBase ParseResponse(byte[] rawBuffer)
  34. {
  35. _lstCacheBuffer.AddRange(rawBuffer);
  36. byte[] temps = _lstCacheBuffer.ToArray();
  37. TazmoAlignerMessageBIN msg = new TazmoAlignerMessageBIN();
  38. msg.RawMessage = _lstCacheBuffer.ToArray();
  39. if (temps[0] ==0x6)
  40. {
  41. msg.IsAck = true;
  42. _lstCacheBuffer.RemoveRange(0,1);
  43. }
  44. if (temps.Length == 1 && temps[0] == 0x15 )
  45. {
  46. msg.IsNak = true;
  47. _lstCacheBuffer.Clear();
  48. }
  49. if (temps.Length == 1 && temps[0] == 0x11)
  50. {
  51. msg.IsBusy = true;
  52. _lstCacheBuffer.Clear();
  53. }
  54. if (temps.Length >= 3 && (Encoding.Default.GetString(temps.Take(3).ToArray()) == "ERR") && temps.LastOrDefault() == 0xD)
  55. {
  56. int index1 = Array.IndexOf(temps, (byte)44);
  57. int index2 = Array.IndexOf(temps, (byte)0xD);
  58. msg.Data = temps.Skip(index1 + 1).Take(index2 - index1 - 1).ToArray();
  59. msg.IsError = true;
  60. _lstCacheBuffer.Clear();
  61. }
  62. if(temps.Length >3 && temps.LastOrDefault() == 0xD && Encoding.Default.GetString(temps.Take(3).ToArray()) != "ERR")
  63. {
  64. _lstCacheBuffer.Clear();
  65. msg.IsResponse = true;
  66. if(Array.IndexOf(temps,(byte)44)!=-1) // to ,
  67. {
  68. msg.CMD = temps.Take(Array.IndexOf(temps, (byte)44)).ToArray();
  69. int index1 = Array.IndexOf(temps, (byte)44);
  70. int index2 = Array.IndexOf(temps, (byte)0xD);
  71. msg.Data = temps.Skip(index1 + 1).Take(index2 - index1 - 1).ToArray();
  72. }
  73. else
  74. {
  75. msg.CMD = temps.Take(temps.Length - 1).ToArray();
  76. }
  77. }
  78. LOG.Write($"{Address} received message:{Encoding.ASCII.GetString(temps)}");
  79. return msg;
  80. }
  81. }
  82. }