IfsfMessageBase.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Edge.Core.Parser.BinaryParser.Attributes;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace HengShan_Pump_TQC_IFSF.MessageEntity
  9. {
  10. public enum MessageType
  11. {
  12. IFSF_MESSAGE_TYPE_READ = 0x00,
  13. IFSF_MESSAGE_TYPE_ANSWER = 0x20,
  14. IFSF_MESSAGE_TYPE_WRITE = 0x40,
  15. /// <summary>
  16. /// message type is an event, and need Ack.
  17. /// </summary>
  18. IFSF_MESSAGE_TYPE_UNSOLICITED_ACK = 0x60,
  19. IFSF_MESSAGE_TYPE_UNSOLICITED_WITHOUT_ACK = 0x80,
  20. IFSF_MESSAGE_TYPE_ACK = 0xE0
  21. }
  22. public enum MessageCode
  23. {
  24. IFSF_MESSAGE_CODE_APPLICATION = 0,
  25. IFSF_MESSAGE_CODE_HEARTBEAT = 1,
  26. IFSF_MESSAGE_CODE_COMMUNICATION = 2
  27. }
  28. public enum DatabaseAddress
  29. {
  30. IFSF_DB_ADDRESS_COMMUNICATION = 0x00,
  31. IFSF_DB_ADDRESS_CALCULATOR = 0x01,
  32. IFSF_DB_ADDRESS_FP_ID = (0x20 + 1),
  33. IFSF_DB_ADDRESS_LN_ID = 0x10,
  34. IFSF_DB_ADDRESS_PR_ID = 0x40,
  35. IFSF_DB_ADDRESS_PR_DAT = 0x61,
  36. IFSF_DB_ADDRESS_TR_DAT = 0x21,
  37. IFSF_DB_ADDRESS_ERROR_DAT = 0x41,
  38. }
  39. public abstract class IfsfMessageBase : MessageTemplateBase
  40. {
  41. //private byte messageToken;
  42. //private MessageType messageType;
  43. public IfsfMessageBase() { }
  44. [Format(1, EncodingType.BIN, -9990)]
  45. [Range(0, 255, "Originator subnet must range in 0 to 255, but actual is: {0}")]
  46. public byte OriginatorSubnet { get; set; }
  47. [Format(1, EncodingType.BIN, -9980)]
  48. [Range(0, 127, "Originator node must range in 0 to 127, but actual is: {0}")]
  49. public byte OriginatorNode { get; set; }
  50. [Format(1, EncodingType.BIN, -9970)]
  51. public MessageCode MessageCode { get; set; }
  52. }
  53. public class IfsfMessage : IfsfMessageBase
  54. {
  55. public IfsfMessage() { }
  56. public IfsfMessage(byte msgToken, MessageType msgType)
  57. {
  58. this.MessageToken = msgToken;
  59. this.MessageType = msgType;
  60. }
  61. [Format(1, EncodingType.BIN, -9999)]
  62. [Range(0, 255, "Recipient subnet must range in 1 to 255")]
  63. public byte RecipientSubnet { get; set; }
  64. [Format(1, EncodingType.BIN, -9995)]
  65. [Range(0, 127, "Recipient node must range in 1 to 127, but now is {0}")]
  66. public byte RecipientNode { get; set; }
  67. //[Format(1, EncodingType.BIN, -9960)]
  68. //public byte BlockNumber => 0x80;
  69. /// <summary>
  70. /// 000xxxxx (bit map)
  71. /// 000 indicates the message type is READ
  72. /// xxxxx is the token created by the originator of the message
  73. /// 010xxxxx
  74. /// 010 indicates message type is WRITE
  75. /// xxxxx is the token
  76. /// 111xxxxx
  77. /// 111 indicates type ACKNOWLEDGE
  78. /// xxxxx is the token
  79. /// </summary>
  80. [Format(1, EncodingType.BIN, -9950)]
  81. public byte RawMessageTokenAndStatus { get; protected set; }
  82. public byte MessageToken
  83. {
  84. get { return (byte)(this.RawMessageTokenAndStatus & 0x1F); }
  85. set
  86. {
  87. if (value > 0x1F) throw new ArgumentOutOfRangeException("message Token max value is 0x1F");
  88. //E0 = 1110 0000
  89. this.RawMessageTokenAndStatus = (byte)((this.RawMessageTokenAndStatus & 0xE0) + value);
  90. }
  91. }
  92. public MessageType MessageType
  93. {
  94. get { return (MessageType)(this.RawMessageTokenAndStatus & 0xE0); }
  95. set
  96. {
  97. //1F = 0001 1111
  98. this.RawMessageTokenAndStatus = (byte)((this.RawMessageTokenAndStatus & 0x1F) + ((byte)value));
  99. }
  100. }
  101. public byte[] DatabaseId
  102. {
  103. get
  104. {
  105. var dbLen = this.RawDatabaseData[0];
  106. return this.RawDatabaseData.Skip(1).Take(dbLen).ToArray();
  107. }
  108. set
  109. {
  110. var dbLen = value.Length;
  111. this.RawDatabaseData = new List<byte>();
  112. this.RawDatabaseData.Add((byte)dbLen);
  113. this.RawDatabaseData.AddRange(value);
  114. }
  115. }
  116. [Format(2, EncodingType.BIN, -9940)]
  117. public int MessageLength { get; protected set; }
  118. /// <summary>
  119. /// database address len + databaseId + [dataId + dataLen + dataElement]
  120. /// </summary>
  121. [EnumerableFormat("MessageLength", -9920)]
  122. public List<byte> RawDatabaseData { get; set; }
  123. public override string ToLogString()
  124. {
  125. return this.GetType().Name + " " + base.ToLogString() + " MsgType: " + this.MessageType + ", MsgToken: " + this.MessageToken;
  126. }
  127. }
  128. }