ESCHVMockPMA.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using MECF.Framework.Simulator.Core.Driver;
  3. namespace Venus_Simulator.Devices
  4. {
  5. class ESCHVMockPMA : SerialPortDeviceSimulator
  6. {
  7. public enum EscHvStatus
  8. {
  9. Unknown,
  10. OFF,
  11. ON,
  12. ERROR
  13. }
  14. private const string EOF = "\r";
  15. private const char MSG_DELIMITER = '_';
  16. private const string MOCKUP_PORT = "COM63";
  17. private int _voltage = 120;
  18. private int _current_limit = 20;
  19. private int _up_ramp_time = 0;
  20. private int _down_ramp_time = 0;
  21. private Random _rd = new Random();
  22. EscHvStatus _simEscHvStatus;
  23. public ESCHVMockPMA() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
  24. {
  25. _simEscHvStatus = EscHvStatus.ON;
  26. }
  27. protected override void ProcessUnsplitMessage(string message)
  28. {
  29. if (string.IsNullOrEmpty(message))
  30. throw new ArgumentException("Hardware command message is invalid");
  31. string sRes = "\r\n>";
  32. string str = message.Trim();
  33. string operation = message.Substring(0, 2);
  34. int data = 0;
  35. bool bHasValidateData = false;
  36. if(message.Length > 2)
  37. {
  38. if (int.TryParse(message.Substring(2), out data))
  39. {
  40. bHasValidateData = true;
  41. }
  42. }
  43. switch (operation)
  44. {
  45. case "SV":
  46. if (bHasValidateData) _voltage = data;
  47. break;
  48. case "SI:":
  49. if (bHasValidateData) _current_limit = data;
  50. break;
  51. case "P+":
  52. if (bHasValidateData) _up_ramp_time = data;
  53. break;
  54. case "P-":
  55. if (bHasValidateData) _down_ramp_time = data;
  56. break;
  57. case "RV":
  58. int out_valtage = _simEscHvStatus == EscHvStatus.ON ? _voltage + _rd.Next(-3, 5) : 0;
  59. sRes = string.Format("RV\r\n\r{0:D4}\n\r>", out_valtage);//$"{out_valtage}\n\r>";
  60. break;
  61. case "R+":
  62. sRes = $"{_rd.Next(0, _current_limit)}\n\r>";
  63. break;
  64. case "R-":
  65. sRes = $"{_rd.Next(0, -_current_limit)}\n\r>";
  66. break;
  67. case "SB":
  68. sRes = string.Format("SB\r{0:D4}\n\r>", _simEscHvStatus == EscHvStatus.ON ? 4 : 0); //$"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
  69. break;
  70. case "EV":
  71. _simEscHvStatus = EscHvStatus.ON;
  72. break;
  73. case "DV":
  74. _simEscHvStatus = EscHvStatus.OFF;
  75. break;
  76. }
  77. OnWriteMessage(sRes);
  78. }
  79. }
  80. }