IfsfMessageDataOut.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using Edge.Core.Parser.BinaryParser.Attributes;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace PetroChinaOnlineWatchPlugin.MessageEntity.Outgoing
  5. {
  6. public abstract class IfsfMessageDataOut
  7. {
  8. [Format(1, EncodingType.BIN, -9890)]
  9. public byte DataIdentifier { get; set; }
  10. [Format(1, EncodingType.BIN, -9880)]
  11. public int DataLength { get; protected set; }
  12. protected List<byte> BcdToBytes(decimal data, int bcdDigits)
  13. {
  14. byte bin8Data = 0;
  15. bin8Data = (byte)(data < 0 ? (bin8Data | 0x80) : (bin8Data & 0x00));
  16. string strBcd = Math.Abs(data).ToString();
  17. int index = strBcd.IndexOf('.');
  18. bin8Data = (byte)(bin8Data + (index >= 0 ? index : strBcd.Length));
  19. var buffer = new List<byte>() { bin8Data };
  20. //2 digits per byte
  21. int divisor = 2;
  22. strBcd = strBcd.Replace(".", "").PadRight(bcdDigits, '0');
  23. for (int i = 0; i < strBcd.Length;)
  24. {
  25. byte d = Convert.ToByte(strBcd.Substring(i, divisor), 16);
  26. buffer.Add(d);
  27. i += divisor;
  28. }
  29. return buffer;
  30. }
  31. }
  32. public class DateTimeMessage : IfsfMessageDataOut
  33. {
  34. [Format(7, EncodingType.BcdString, -9870)]
  35. public string Data { get; protected set; }
  36. public DateTimeMessage(byte dataId, object objData)
  37. {
  38. base.DataIdentifier = dataId;
  39. string strData = objData.ToString();
  40. DateTime data = DateTime.Parse(string.IsNullOrEmpty(strData) ? "2000-01-01 00:00:00" : strData);
  41. Data = data.ToString("yyyyMMddHHmmss");
  42. base.DataLength = Data.Length / 2;
  43. }
  44. public override string ToString()
  45. {
  46. return $"{DataIdentifier} {DataLength} {Data}";
  47. }
  48. }
  49. public class Bin8Bcd4Message : IfsfMessageDataOut
  50. {
  51. [EnumerableFormat("%cascade", -9870)]
  52. public List<byte> Bcd4Data { get; protected set; }
  53. public Bin8Bcd4Message(byte dataId, object objData)
  54. {
  55. base.DataIdentifier = dataId;
  56. string strData = objData.ToString();
  57. decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData);
  58. Bcd4Data = BcdToBytes(data, 4);
  59. base.DataLength = Bcd4Data.Count;
  60. }
  61. public override string ToString()
  62. {
  63. return $"{DataIdentifier} {DataLength} {Bcd4Data}";
  64. }
  65. }
  66. public class Bin8Bcd6Message : IfsfMessageDataOut
  67. {
  68. [EnumerableFormat("%cascade", -9870)]
  69. public List<byte> Bcd6Data { get; protected set; }
  70. public Bin8Bcd6Message(byte dataId, object objData)
  71. {
  72. base.DataIdentifier = dataId;
  73. string strData = objData.ToString();
  74. decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData);
  75. Bcd6Data = BcdToBytes(data, 6);
  76. base.DataLength = Bcd6Data.Count;
  77. }
  78. public override string ToString()
  79. {
  80. return $"{DataIdentifier} {DataLength} {Bcd6Data}";
  81. }
  82. }
  83. public class Bin8Bcd8Message : IfsfMessageDataOut
  84. {
  85. [EnumerableFormat("%cascade", -9870)]
  86. public List<byte> Bcd8Data { get; protected set; }
  87. public Bin8Bcd8Message(byte dataId, object objData)
  88. {
  89. base.DataIdentifier = dataId;
  90. string strData = objData.ToString();
  91. decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData);
  92. Bcd8Data = BcdToBytes(data, 8);
  93. base.DataLength = Bcd8Data.Count;
  94. }
  95. public override string ToString()
  96. {
  97. return $"{DataIdentifier} {DataLength} {Bcd8Data}";
  98. }
  99. }
  100. public class Bcd4Message : IfsfMessageDataOut
  101. {
  102. [Format(2, EncodingType.BCD, -9870)]
  103. public int Bcd4Data { get; protected set; }
  104. public Bcd4Message(byte dataId, object objData)
  105. {
  106. base.DataIdentifier = dataId;
  107. string strData = objData.ToString();
  108. int data = int.Parse(string.IsNullOrEmpty(strData) ? "0" : strData);
  109. Bcd4Data = data;
  110. base.DataLength = 2;
  111. }
  112. public override string ToString()
  113. {
  114. return $"{DataIdentifier} {DataLength} {Bcd4Data}";
  115. }
  116. }
  117. public class Bin8Message : IfsfMessageDataOut
  118. {
  119. [Format(1, EncodingType.BIN, -9870)]
  120. public byte Bin8Data { get; protected set; }
  121. public Bin8Message(byte dataId, object objData)
  122. {
  123. base.DataIdentifier = dataId;
  124. string strData = objData.ToString();
  125. byte data = byte.Parse(string.IsNullOrEmpty(strData) ? "0" : strData);
  126. Bin8Data = data;
  127. base.DataLength = 1;
  128. }
  129. public override string ToString()
  130. {
  131. return $"{DataIdentifier} {DataLength} {Bin8Data}";
  132. }
  133. }
  134. }