SimAeMatch.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using MECF.Framework.Simulator.Core.Driver;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Timers;
  9. namespace MECF.Framework.Simulator.Core.RFMatchs.AE
  10. {
  11. class SimAeMatch : SerialPortDeviceSimulator
  12. {
  13. public bool Failed { get; set; }
  14. public bool IsOn { get; set; }
  15. public bool IsHalo { get; set; }
  16. public bool IsContinueAck { get; set; }
  17. Stopwatch _timer = new Stopwatch();
  18. private System.Timers.Timer _tick;
  19. Random _rd = new Random();
  20. private object _locker = new object();
  21. public string ResultValue { get; set; }
  22. public SimAeMatch(string port)
  23. : base(port, -1, "\r", ' ', false)
  24. {
  25. ResultValue = "";
  26. _tick = new System.Timers.Timer();
  27. _tick.Interval = 200;
  28. _tick.Elapsed += _tick_Elapsed;
  29. _tick.Start();
  30. }
  31. private void _tick_Elapsed(object sender, ElapsedEventArgs e)
  32. {
  33. lock (_locker)
  34. {
  35. if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))
  36. {
  37. _timer.Stop();
  38. }
  39. }
  40. }
  41. List<byte> _cached = new List<byte>();
  42. private int _mode1;
  43. private int _mode2;
  44. private bool _enablePreset;
  45. private byte _presetNumber;
  46. private int _load1;
  47. private int _load2;
  48. private int _tune1;
  49. private int _tune2;
  50. protected override void ProcessUnsplitMessage(byte[] message1)
  51. {
  52. _cached.AddRange(message1);
  53. if (_cached[0] == 0x06)
  54. _cached.RemoveAt(0);
  55. if (_cached.Count < 3)
  56. return;
  57. byte[] msgIn = _cached.ToArray();
  58. _cached.Clear();
  59. List<byte> lstAck = new List<byte>();
  60. lstAck.Add(0x06);
  61. byte[] response = BuildMessage((byte)(msgIn[0] >> 3), msgIn[1], new byte[] { 0 });
  62. switch (msgIn[1])
  63. {
  64. case 91://mode comm
  65. _presetNumber = msgIn[4];
  66. break;
  67. case 92: //presets
  68. break;
  69. case 93: // auto mode
  70. if (msgIn[2] == 1)
  71. {
  72. _mode1 = msgIn[4];
  73. }
  74. else
  75. {
  76. _mode2 = msgIn[4];
  77. }
  78. break;
  79. case 94:
  80. _enablePreset = msgIn[4] == 1;
  81. break;
  82. case 98: //presets
  83. break;
  84. case 112: //load
  85. if (msgIn[2] == 1)
  86. {
  87. _load1 = msgIn[4] + (msgIn[5] << 8);
  88. }
  89. else
  90. {
  91. _load2 = msgIn[4] + (msgIn[5] << 8);
  92. }
  93. break;
  94. case 122: //tune
  95. if (msgIn[2] == 1)
  96. {
  97. _tune1 = msgIn[4] + (msgIn[5] << 8);
  98. }
  99. else
  100. {
  101. _tune2 = msgIn[4] + (msgIn[5] << 8);
  102. }
  103. break;
  104. case 161://preset
  105. response = BuildMessage((byte)(msgIn[0] >> 3), msgIn[1], new byte[] { (byte)_presetNumber, (byte)(_presetNumber >> 8) });
  106. break;
  107. case 219://all data
  108. List<byte> allData = new List<byte>();
  109. for (int i = 0; i < 88; i++)
  110. {
  111. allData.Add(0);
  112. }
  113. allData[4] = (byte)_load1;
  114. allData[5] = (byte)(_load1 >> 8);
  115. allData[6] = (byte)_tune1;
  116. allData[7] = (byte)(_tune1 >> 8);
  117. allData[12] = (byte)_load2;
  118. allData[13] = (byte)(_load2 >> 8);
  119. allData[14] = (byte)_tune2;
  120. allData[15] = (byte)(_tune2 >> 8);
  121. int _peak = _rd.Next(6000, 7000);
  122. allData[20] = (byte)_peak;
  123. allData[21] = (byte)(_peak >> 8);
  124. int _dc = _rd.Next(3000, 4000);
  125. allData[22] = (byte)_dc;
  126. allData[23] = (byte)(_dc >> 8);
  127. allData[1] = SetBits(allData[1], _mode1 == 1 ? (byte)1 : (byte)0, 4);
  128. allData[1] = SetBits(allData[1], _mode2 == 1 ? (byte)1 : (byte)0, 6);
  129. response = BuildMessage((byte)(msgIn[0] >> 3), msgIn[1], allData.ToArray());
  130. break;
  131. }
  132. if (!IsContinueAck)
  133. {
  134. OnWriteMessage(lstAck.ToArray());
  135. OnWriteMessage(response);
  136. }
  137. else
  138. {
  139. lstAck.AddRange(response);
  140. OnWriteMessage(lstAck.ToArray());
  141. }
  142. }
  143. public static byte SetBits(byte _word, byte value, int offset)
  144. {
  145. byte mask_1 = (byte)(value << offset);
  146. byte mask_2 = (byte)(~mask_1 & _word);
  147. return (byte)(mask_1 | mask_2);
  148. }
  149. private static byte[] BuildMessage(byte address, byte command, byte[] data)
  150. {
  151. List<byte> buffer = new List<byte>();
  152. if (data.Length < 7)
  153. {
  154. buffer.Add((byte)((address << 3) + (data == null ? 0 : data.Length)));
  155. buffer.Add(command);
  156. }
  157. else
  158. {
  159. buffer.Add((byte)((address << 3) + 7));
  160. buffer.Add(command);
  161. buffer.Add((byte)data.Length);
  162. }
  163. if (data != null && data.Length > 0)
  164. {
  165. buffer.AddRange(data);
  166. }
  167. buffer.Add(CalcSum(buffer, buffer.Count));
  168. return buffer.ToArray();
  169. }
  170. private static byte CalcSum(List<byte> data, int length)
  171. {
  172. byte ret = 0x00;
  173. for (var i = 0; i < length; i++)
  174. {
  175. ret ^= data[i];
  176. }
  177. return ret;
  178. }
  179. }
  180. }