DatabaseDataParser.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Edge.Core.Parser.BinaryParser.Util;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace HengShan_Pump_TQC_IFSF.MessageEntity
  8. {
  9. public enum DatabaseType
  10. {
  11. COMMUNICATION_SERVICE_DATABASE,
  12. CALCULATOR_DATABASE,
  13. /// <summary>
  14. /// DB_Ad = FP_ID (21H-24H)
  15. /// </summary>
  16. FUELLING_POINT_DATABASE,
  17. /// <summary>
  18. /// DB_Ad = FP_ID (21H-24H) + LN_ID (11H-18H)
  19. /// </summary>
  20. LOGICAL_NOZZLE_DATABASE,
  21. /// <summary>
  22. /// DB_Ad = FP_ID (21H-24H) + TR_DAT (21H) + TR_Seq_Nb (0001-9999)
  23. /// </summary>
  24. FUELLING_TRANSACTION_DATABASE,
  25. ERROR_CODE_DATABASE,
  26. Unknown,
  27. }
  28. /// <summary>
  29. /// DB_Ad_Lg(1 byte) + DB_Ad(1-8 byte) + [Data_Id(1 byte) + Data_Lg(1 or 3) + Data_El]
  30. /// </summary>
  31. public class DatabaseDataParser
  32. {
  33. private List<byte> output = new List<byte>();
  34. private byte[] databaseId;
  35. private List<System.Tuple<byte, byte[]>> dataIds = new List<System.Tuple<byte, byte[]>>();
  36. public static DatabaseDataParser New()
  37. {
  38. return new DatabaseDataParser();
  39. }
  40. private DatabaseType DetermineDatabaseType(byte[] databaseId)
  41. {
  42. if (databaseId.Length == 1)
  43. {
  44. if (databaseId[0] == 0)
  45. return DatabaseType.COMMUNICATION_SERVICE_DATABASE;
  46. if (databaseId[0] == 1)
  47. return DatabaseType.CALCULATOR_DATABASE;
  48. if (databaseId[0] >= 0x21 && databaseId[0] <= 0x24)
  49. return DatabaseType.FUELLING_POINT_DATABASE;
  50. }
  51. else if (databaseId.Length == 2)
  52. {
  53. if (databaseId[0] >= 0x21 && databaseId[0] <= 0x24
  54. && databaseId[1] >= 0x11 && databaseId[1] <= 0x18)
  55. return DatabaseType.LOGICAL_NOZZLE_DATABASE;
  56. }
  57. else if (databaseId.Length == 3)
  58. {
  59. if (databaseId[0] >= 0x21 && databaseId[0] <= 0x24
  60. && databaseId[1] == 0x41
  61. && databaseId[2] >= 0x01 && databaseId[2] <= 0x40)
  62. return DatabaseType.ERROR_CODE_DATABASE;
  63. }
  64. else if (databaseId.Length == 4)
  65. {
  66. if (databaseId[0] >= 0x21 && databaseId[0] <= 0x24
  67. && databaseId[1] == 0x21
  68. && databaseId[2] >= 0x00 && databaseId[2] <= 0x99
  69. && databaseId[3] >= 0x00 && databaseId[3] <= 0x99)
  70. return DatabaseType.FUELLING_TRANSACTION_DATABASE;
  71. }
  72. return DatabaseType.Unknown;
  73. }
  74. public DatabaseDataParser AssignDatabaseId(byte[] databaseId)
  75. {
  76. this.databaseId = databaseId;
  77. var databaseLen = databaseId.Length.GetBinBytes(1);
  78. this.output.AddRange(databaseLen);
  79. this.output.AddRange(databaseId);
  80. return this;
  81. }
  82. public DatabaseType DatabaseType => this.DetermineDatabaseType(this.databaseId);
  83. /// <summary>
  84. /// dataId:dataElement
  85. /// if data len is 0, then dataElement is a 0 length byte array.
  86. /// </summary>
  87. public IEnumerable<System.Tuple<byte, byte[]>> DataIds => this.dataIds;
  88. public byte[] DatabaseId => this.databaseId;
  89. /// <summary>
  90. ///
  91. /// </summary>
  92. /// <param name="dataId"></param>
  93. /// <param name="dataElement">leave it to null if the dataIdLen and dataIdElement are omit from msg.
  94. /// or leave a 0 length array then the dataIdLen and dataIdElement will be combined as single byte 0x00</param>
  95. /// <returns></returns>
  96. public DatabaseDataParser AddDataId(byte dataId, byte[] dataElement)
  97. {
  98. this.dataIds.Add(new System.Tuple<byte, byte[]>(dataId, dataElement));
  99. this.output.Add(dataId);
  100. if (dataElement == null)
  101. {
  102. }
  103. else
  104. {
  105. if (dataElement.Length > 254)
  106. {
  107. //var exceed = (dataElement.Length - 254).GetBinBytes(2);
  108. this.output.Add(0xFF);
  109. this.output.AddRange(dataElement.Length.GetBinBytes(2));
  110. this.output.AddRange(dataElement);
  111. }
  112. else if (dataElement.Length == 0)
  113. {
  114. this.output.Add(0x00);
  115. }
  116. else
  117. {
  118. this.output.AddRange(dataElement.Length.GetBinBytes(1));
  119. this.output.AddRange(dataElement);
  120. }
  121. }
  122. return this;
  123. }
  124. /// <summary>
  125. /// deserialize
  126. /// </summary>
  127. /// <param name="rawData">should follow: DB_Ad_Lg(1 byte) + DB_Ad(1-8 byte) + [Data_Id(1 byte) + Data_Lg(1 or 3) + Data_El]</param>
  128. /// <returns></returns>
  129. public DatabaseDataParser Convert(byte[] rawData)
  130. {
  131. var databaseIdLen = rawData.Take(1).ToInt32();
  132. this.databaseId = rawData.Skip(1).Take(databaseIdLen).ToArray();
  133. var dataIdsPart = rawData.Skip(1 + databaseIdLen);
  134. int previousDataIdFullLen = 0;
  135. while (true)
  136. {
  137. if (previousDataIdFullLen >= dataIdsPart.Count()) break;
  138. var dataId = dataIdsPart.Skip(previousDataIdFullLen).Take(1).FirstOrDefault();
  139. var dataElementLenByteCounts = 1;
  140. var dataElementLen = 0;
  141. var dataElementLenFirstByte = dataIdsPart.Skip(previousDataIdFullLen + 1).Take(1).ToInt32();
  142. if (dataElementLenFirstByte > 254)
  143. {
  144. dataElementLen = dataIdsPart.Skip(previousDataIdFullLen + 2).Take(2).ToInt32();
  145. dataElementLenByteCounts = 3;
  146. }
  147. else
  148. dataElementLen = dataIdsPart.Skip(previousDataIdFullLen + 1).Take(1).ToInt32();
  149. this.dataIds.Add(new System.Tuple<byte, byte[]>(
  150. dataId,
  151. dataIdsPart.Skip(previousDataIdFullLen + 1 + dataElementLenByteCounts).Take(dataElementLen).ToArray()));
  152. previousDataIdFullLen += 1 + dataElementLenByteCounts + dataElementLen;
  153. if (previousDataIdFullLen == dataIdsPart.Count()) break;
  154. }
  155. return this;
  156. }
  157. /// <summary>
  158. /// serialize
  159. /// </summary>
  160. /// <returns>DB_Ad_Lg(1 byte) + DB_Ad(1-8 byte) + [Data_Id(1 byte) + Data_Lg(1 or 3) + Data_El]</returns>
  161. public byte[] Convert()
  162. {
  163. return this.output.ToArray();
  164. }
  165. }
  166. }