Browse Source

Simulator Device Update

Intern01 1 year ago
parent
commit
73729331e4
30 changed files with 1820 additions and 0 deletions
  1. 76 0
      Venus/Venus_Simulator/Devices/AdTecGeneratorMockPMD.cs
  2. 41 0
      Venus/Venus_Simulator/Devices/AdTecMatchMockPMD.cs
  3. 88 0
      Venus/Venus_Simulator/Devices/ESCHVMockPMB.cs
  4. 88 0
      Venus/Venus_Simulator/Devices/ESCHVMockPMC.cs
  5. 88 0
      Venus/Venus_Simulator/Devices/ESCHVMockPMD.cs
  6. 105 0
      Venus/Venus_Simulator/Devices/PendulumValveMockPMB.cs
  7. 105 0
      Venus/Venus_Simulator/Devices/PendulumValveMockPMC.cs
  8. 105 0
      Venus/Venus_Simulator/Devices/PendulumValveMockPMD.cs
  9. 62 0
      Venus/Venus_Simulator/Devices/SkyPumpMockPMD.cs
  10. 103 0
      Venus/Venus_Simulator/Devices/TurboPumpMockPMB.cs
  11. 103 0
      Venus/Venus_Simulator/Devices/TurboPumpMockPMC.cs
  12. 103 0
      Venus/Venus_Simulator/Devices/TurboPumpMockPMD.cs
  13. 53 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMBView.xaml
  14. 29 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMBView.xaml.cs
  15. 53 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMCView.xaml
  16. 29 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMCView.xaml.cs
  17. 53 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMDView.xaml
  18. 29 0
      Venus/Venus_Simulator/Views/SimuPendulumValvePMDView.xaml.cs
  19. 53 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMBView.xaml
  20. 31 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMBView.xaml.cs
  21. 53 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMCView.xaml
  22. 31 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMCView.xaml.cs
  23. 53 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMDView.xaml
  24. 31 0
      Venus/Venus_Simulator/Views/SimuTurboPumpPMDView.xaml.cs
  25. 53 0
      Venus/Venus_Simulator/Views/simuESCHVPMBView.xaml
  26. 32 0
      Venus/Venus_Simulator/Views/simuESCHVPMBView.xaml.cs
  27. 53 0
      Venus/Venus_Simulator/Views/simuESCHVPMCView.xaml
  28. 32 0
      Venus/Venus_Simulator/Views/simuESCHVPMCView.xaml.cs
  29. 53 0
      Venus/Venus_Simulator/Views/simuESCHVPMDView.xaml
  30. 32 0
      Venus/Venus_Simulator/Views/simuESCHVPMDView.xaml.cs

+ 76 - 0
Venus/Venus_Simulator/Devices/AdTecGeneratorMockPMD.cs

@@ -0,0 +1,76 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class AdTecGeneratorMockPMD : SerialPortDeviceSimulator
+    {
+        public enum GeneratorStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        public static GeneratorStatus _simGeneratorStatus;
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM42";
+
+    
+        public AdTecGeneratorMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simGeneratorStatus = GeneratorStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string sRes = string.Empty;
+
+            if (message.Contains(EOF))
+            {
+                message = message.Remove(message.Length - 1);
+            }
+
+            string[] msgs = message.Split('\r');
+            foreach(string msg in msgs)
+            {
+                switch (msg)
+                {
+                    case "Q":
+                        if (_simGeneratorStatus == GeneratorStatus.ON)
+                        {
+                            sRes = "2010000 12345 00900 00100 45678\r";
+                        }
+                        else if (_simGeneratorStatus == GeneratorStatus.OFF)
+                        {
+                            sRes = "2000000 12345 00000 00000 45678\r";
+                        }
+                        break;
+                    case "G":
+                        _simGeneratorStatus = GeneratorStatus.ON;
+                        sRes = "\r";
+                        break;
+                    case "S":
+                        _simGeneratorStatus = GeneratorStatus.OFF;
+                        sRes = "\r";
+                        break;
+                    default:
+                        break;
+                }
+
+                //string[] strs = message.Split(MSG_DELIMITER);
+
+                //Thread.Sleep(2 * 1000);
+
+                sRes += "\r";
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 41 - 0
Venus/Venus_Simulator/Devices/AdTecMatchMockPMD.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class AdTecMatchMockPMD : SerialPortDeviceSimulator
+    {
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '\r';
+        private const string MOCKUP_PORT = "COM52";
+
+        public AdTecMatchMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            message = message.TrimEnd('\r');
+
+            string[] strs = message.Split(MSG_DELIMITER);
+
+            string sRes = string.Empty;
+
+            if (message.Contains("$APRR"))
+            {
+                sRes = "$APRR10E1D5";
+            }
+            else
+            {
+                sRes = "S34000C0000000000000080020015A273B00700700400005C095210";
+            }
+
+            Thread.Sleep(2 * 1000);
+            OnWriteMessage(sRes + "\r");
+        }
+    }
+}

+ 88 - 0
Venus/Venus_Simulator/Devices/ESCHVMockPMB.cs

@@ -0,0 +1,88 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+
+    class ESCHVMockPMB : SerialPortDeviceSimulator
+    {
+        public enum EscHvStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM47";
+        private int _voltage = 120;
+        private int _current_limit = 20;
+        private int _up_ramp_time = 0;
+        private int _down_ramp_time = 0;
+        private Random _rd = new Random();
+
+        EscHvStatus _simEscHvStatus;
+        public ESCHVMockPMB() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simEscHvStatus = EscHvStatus.ON;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string sRes = "\r\n>";
+            string str = message.Trim();
+            string operation = message.Substring(0, 2);
+            int data = 0;
+            bool bHasValidateData = false;
+            if(message.Length > 2)
+            {
+                if (int.TryParse(message.Substring(2), out data))
+                {
+                    bHasValidateData = true;
+                }
+            }
+            switch (operation)
+            {
+                case "SV":
+                    if (bHasValidateData) _voltage = data;
+                    break;
+                case "SI:":
+                    if (bHasValidateData) _current_limit = data;
+                    break;
+                case "P+":
+                    if (bHasValidateData) _up_ramp_time = data;
+                    break;
+                case "P-":
+                    if (bHasValidateData) _down_ramp_time = data;
+                    break;
+                case "RV":
+                    int out_valtage = _simEscHvStatus == EscHvStatus.ON ? _voltage + _rd.Next(-3, 5) : 0;
+                    sRes = string.Format("RV\r\n\r{0:D4}\n\r>", out_valtage);//$"{out_valtage}\n\r>";
+                    break;
+                case "R+":
+                    //sRes = $"{_rd.Next(0, _current_limit)}\n\r>"
+                    sRes = string.Format("R+\r\n\r{0:D4}\n\r>", 2);
+
+                    break;
+                case "R-":
+                    sRes = string.Format("R-\r\n\r{0:D4}\n\r>", 1);
+                    break;
+                case "SB":
+                    sRes = string.Format("SB\r{0:D4}\n\r>", _simEscHvStatus == EscHvStatus.ON ? 4 : 0); //$"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
+                    break;
+                case "EV":
+                    _simEscHvStatus = EscHvStatus.ON;
+                    break;
+                case "DV":
+                    _simEscHvStatus = EscHvStatus.OFF;
+                    break;
+            }
+            OnWriteMessage(sRes);
+        }
+    }
+}

+ 88 - 0
Venus/Venus_Simulator/Devices/ESCHVMockPMC.cs

@@ -0,0 +1,88 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+
+    class ESCHVMockPMC : SerialPortDeviceSimulator
+    {
+        public enum EscHvStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM18";
+        private int _voltage = 120;
+        private int _current_limit = 20;
+        private int _up_ramp_time = 0;
+        private int _down_ramp_time = 0;
+        private Random _rd = new Random();
+
+        EscHvStatus _simEscHvStatus;
+        public ESCHVMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simEscHvStatus = EscHvStatus.ON;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string sRes = "\r\n>";
+            string str = message.Trim();
+            string operation = message.Substring(0, 2);
+            int data = 0;
+            bool bHasValidateData = false;
+            if(message.Length > 2)
+            {
+                if (int.TryParse(message.Substring(2), out data))
+                {
+                    bHasValidateData = true;
+                }
+            }
+            switch (operation)
+            {
+                case "SV":
+                    if (bHasValidateData) _voltage = data;
+                    break;
+                case "SI:":
+                    if (bHasValidateData) _current_limit = data;
+                    break;
+                case "P+":
+                    if (bHasValidateData) _up_ramp_time = data;
+                    break;
+                case "P-":
+                    if (bHasValidateData) _down_ramp_time = data;
+                    break;
+                case "RV":
+                    int out_valtage = _simEscHvStatus == EscHvStatus.ON ? _voltage + _rd.Next(-3, 5) : 0;
+                    sRes = string.Format("RV\r\n\r{0:D4}\n\r>", out_valtage);//$"{out_valtage}\n\r>";
+                    break;
+                case "R+":
+                    //sRes = $"{_rd.Next(0, _current_limit)}\n\r>"
+                    sRes = string.Format("R+\r\n\r{0:D4}\n\r>", 2);
+
+                    break;
+                case "R-":
+                    sRes = string.Format("R-\r\n\r{0:D4}\n\r>", 1);
+                    break;
+                case "SB":
+                    sRes = string.Format("SB\r{0:D4}\n\r>", _simEscHvStatus == EscHvStatus.ON ? 4 : 0); //$"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
+                    break;
+                case "EV":
+                    _simEscHvStatus = EscHvStatus.ON;
+                    break;
+                case "DV":
+                    _simEscHvStatus = EscHvStatus.OFF;
+                    break;
+            }
+            OnWriteMessage(sRes);
+        }
+    }
+}

+ 88 - 0
Venus/Venus_Simulator/Devices/ESCHVMockPMD.cs

@@ -0,0 +1,88 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+
+    class ESCHVMockPMD : SerialPortDeviceSimulator
+    {
+        public enum EscHvStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM54";
+        private int _voltage = 120;
+        private int _current_limit = 20;
+        private int _up_ramp_time = 0;
+        private int _down_ramp_time = 0;
+        private Random _rd = new Random();
+
+        EscHvStatus _simEscHvStatus;
+        public ESCHVMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simEscHvStatus = EscHvStatus.ON;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string sRes = "\r\n>";
+            string str = message.Trim();
+            string operation = message.Substring(0, 2);
+            int data = 0;
+            bool bHasValidateData = false;
+            if(message.Length > 2)
+            {
+                if (int.TryParse(message.Substring(2), out data))
+                {
+                    bHasValidateData = true;
+                }
+            }
+            switch (operation)
+            {
+                case "SV":
+                    if (bHasValidateData) _voltage = data;
+                    break;
+                case "SI:":
+                    if (bHasValidateData) _current_limit = data;
+                    break;
+                case "P+":
+                    if (bHasValidateData) _up_ramp_time = data;
+                    break;
+                case "P-":
+                    if (bHasValidateData) _down_ramp_time = data;
+                    break;
+                case "RV":
+                    int out_valtage = _simEscHvStatus == EscHvStatus.ON ? _voltage + _rd.Next(-3, 5) : 0;
+                    sRes = string.Format("RV\r\n\r{0:D4}\n\r>", out_valtage);//$"{out_valtage}\n\r>";
+                    break;
+                case "R+":
+                    //sRes = $"{_rd.Next(0, _current_limit)}\n\r>"
+                    sRes = string.Format("R+\r\n\r{0:D4}\n\r>", 2);
+
+                    break;
+                case "R-":
+                    sRes = string.Format("R-\r\n\r{0:D4}\n\r>", 1);
+                    break;
+                case "SB":
+                    sRes = string.Format("SB\r{0:D4}\n\r>", _simEscHvStatus == EscHvStatus.ON ? 4 : 0); //$"{(_simEscHvStatus == EscHvStatus.ON ? 4 : 0)}\r\n>";
+                    break;
+                case "EV":
+                    _simEscHvStatus = EscHvStatus.ON;
+                    break;
+                case "DV":
+                    _simEscHvStatus = EscHvStatus.OFF;
+                    break;
+            }
+            OnWriteMessage(sRes);
+        }
+    }
+}

+ 105 - 0
Venus/Venus_Simulator/Devices/PendulumValveMockPMB.cs

@@ -0,0 +1,105 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class PendulumValveMockPMB : SerialPortDeviceSimulator
+    {
+        public enum PendulumValveStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM73";
+        private int _pressure = 120;
+        private int _position = 500;
+        private bool _bHold = false;
+        private Random _rd = new Random();
+
+        PendulumValveStatus _simPendulumValveStatus;
+        public PendulumValveMockPMB() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPendulumValveStatus = PendulumValveStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            if(_bHold == false)
+            {
+                _pressure += _rd.Next(-10, 10);
+                _position += _rd.Next(-50, 50);
+            }
+
+            if(_simPendulumValveStatus == PendulumValveStatus.OFF)
+            {
+                _position = 0;
+            }
+            
+            string sRes = string.Empty;
+            string str = message.Trim();
+            switch(str)
+            {
+                case "P:":
+                    sRes = string.Format("P:{0:D8}\r\n", _pressure);
+                    break;
+                case "A:":
+                    sRes = string.Format("A:{0:D6}\r\n", _position);
+                    break;
+                case "C:":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.OFF;
+                    sRes = "C:\r\n";
+                    break;
+                case "O":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.ON;
+                    sRes = "O:\r\n";
+                    break;
+                case "H:":
+                    _bHold = true;
+                    sRes = "H:\r\n";
+                    break;
+                case "i:30":
+                    sRes = "i:3012100000\r\n";
+                    break;
+                default:
+                    {
+                        if (str.Contains("S:"))
+                        {
+                            int pressure;
+                            if (int.TryParse(str.Substring(2, 8), out pressure))
+                            {
+                                _pressure = pressure;
+                            }
+
+                            _bHold = false;
+                            sRes = "S:\r\n";
+                        }
+                        else if (str.StartsWith("R:"))
+                        {
+                            int position;
+                            if (int.TryParse(str.Substring(2, 6), out position))
+                            {
+                                _position = position;
+                            }
+
+                            _bHold = false;
+                            sRes = "R:\r\n";
+                        }
+                        else
+                            return;
+                    }
+                    break;
+            }
+                OnWriteMessage(sRes);
+        }
+    }
+}

+ 105 - 0
Venus/Venus_Simulator/Devices/PendulumValveMockPMC.cs

@@ -0,0 +1,105 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class PendulumValveMockPMC : SerialPortDeviceSimulator
+    {
+        public enum PendulumValveStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM78";
+        private int _pressure = 120;
+        private int _position = 500;
+        private bool _bHold = false;
+        private Random _rd = new Random();
+
+        PendulumValveStatus _simPendulumValveStatus;
+        public PendulumValveMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPendulumValveStatus = PendulumValveStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            if(_bHold == false)
+            {
+                _pressure += _rd.Next(-10, 10);
+                _position += _rd.Next(-50, 50);
+            }
+
+            if(_simPendulumValveStatus == PendulumValveStatus.OFF)
+            {
+                _position = 0;
+            }
+            
+            string sRes = string.Empty;
+            string str = message.Trim();
+            switch(str)
+            {
+                case "P:":
+                    sRes = string.Format("P:{0:D8}\r\n", _pressure);
+                    break;
+                case "A:":
+                    sRes = string.Format("A:{0:D6}\r\n", _position);
+                    break;
+                case "C:":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.OFF;
+                    sRes = "C:\r\n";
+                    break;
+                case "O":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.ON;
+                    sRes = "O:\r\n";
+                    break;
+                case "H:":
+                    _bHold = true;
+                    sRes = "H:\r\n";
+                    break;
+                case "i:30":
+                    sRes = "i:3012100000\r\n";
+                    break;
+                default:
+                    {
+                        if (str.Contains("S:"))
+                        {
+                            int pressure;
+                            if (int.TryParse(str.Substring(2, 8), out pressure))
+                            {
+                                _pressure = pressure;
+                            }
+
+                            _bHold = false;
+                            sRes = "S:\r\n";
+                        }
+                        else if (str.StartsWith("R:"))
+                        {
+                            int position;
+                            if (int.TryParse(str.Substring(2, 6), out position))
+                            {
+                                _position = position;
+                            }
+
+                            _bHold = false;
+                            sRes = "R:\r\n";
+                        }
+                        else
+                            return;
+                    }
+                    break;
+            }
+                OnWriteMessage(sRes);
+        }
+    }
+}

+ 105 - 0
Venus/Venus_Simulator/Devices/PendulumValveMockPMD.cs

@@ -0,0 +1,105 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class PendulumValveMockPMD : SerialPortDeviceSimulator
+    {
+        public enum PendulumValveStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM58";
+        private int _pressure = 120;
+        private int _position = 500;
+        private bool _bHold = false;
+        private Random _rd = new Random();
+
+        PendulumValveStatus _simPendulumValveStatus;
+        public PendulumValveMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPendulumValveStatus = PendulumValveStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            if(_bHold == false)
+            {
+                _pressure += _rd.Next(-10, 10);
+                _position += _rd.Next(-50, 50);
+            }
+
+            if(_simPendulumValveStatus == PendulumValveStatus.OFF)
+            {
+                _position = 0;
+            }
+            
+            string sRes = string.Empty;
+            string str = message.Trim();
+            switch(str)
+            {
+                case "P:":
+                    sRes = string.Format("P:{0:D8}\r\n", _pressure);
+                    break;
+                case "A:":
+                    sRes = string.Format("A:{0:D6}\r\n", _position);
+                    break;
+                case "C:":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.OFF;
+                    sRes = "C:\r\n";
+                    break;
+                case "O":
+                    _bHold = false;
+                    _simPendulumValveStatus = PendulumValveStatus.ON;
+                    sRes = "O:\r\n";
+                    break;
+                case "H:":
+                    _bHold = true;
+                    sRes = "H:\r\n";
+                    break;
+                case "i:30":
+                    sRes = "i:3012100000\r\n";
+                    break;
+                default:
+                    {
+                        if (str.Contains("S:"))
+                        {
+                            int pressure;
+                            if (int.TryParse(str.Substring(2, 8), out pressure))
+                            {
+                                _pressure = pressure;
+                            }
+
+                            _bHold = false;
+                            sRes = "S:\r\n";
+                        }
+                        else if (str.StartsWith("R:"))
+                        {
+                            int position;
+                            if (int.TryParse(str.Substring(2, 6), out position))
+                            {
+                                _position = position;
+                            }
+
+                            _bHold = false;
+                            sRes = "R:\r\n";
+                        }
+                        else
+                            return;
+                    }
+                    break;
+            }
+                OnWriteMessage(sRes);
+        }
+    }
+}

+ 62 - 0
Venus/Venus_Simulator/Devices/SkyPumpMockPMD.cs

@@ -0,0 +1,62 @@
+using System;
+using System.Threading;
+using MECF.Framework.Simulator.Core.Driver;
+
+namespace Venus_Simulator.Devices
+{
+    class SkyPumpMockPMD : SerialPortDeviceSimulator
+    {
+        public enum SimPumpStatus
+        {
+            Open,
+            Close,
+        }
+
+        public static SimPumpStatus _simPumpStatus;
+        private const string EOF = "\r\n";
+        private const char MSG_DELIMITER = ' ';
+        private const string MOCKUP_PORT = "COM30";
+
+        public SkyPumpMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simPumpStatus = SimPumpStatus.Open;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Split('\r');
+
+            string sRes = string.Empty;
+
+            foreach (var s2 in strs)
+            {
+                if (s2.Length < 1) continue;
+
+                switch (s2)
+                {
+                    case "@00READ_RUN_PARA":
+                        if (_simPumpStatus == SimPumpStatus.Open)
+                            sRes = "@00RUN_PARA050308804314101000003\0\0hh\0\0\r\n";
+                        else if (_simPumpStatus == SimPumpStatus.Close)
+                            sRes = "@00RUN_PARA050308804314101000003\0\0??\0\0\r\n";
+                        break;
+                    case "@00CON_FDP_ON":
+                        _simPumpStatus = SimPumpStatus.Open;
+                        sRes = "@00FDP_ONOK" + "\0\r\n";
+                        break;
+                    case "@00CON_FDP_OFF":
+                        _simPumpStatus = SimPumpStatus.Close;
+                        sRes = "@00FDP_OFFOK" + "\0\r\n";
+                        break;
+                    default:
+                        break;
+                }
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 103 - 0
Venus/Venus_Simulator/Devices/TurboPumpMockPMB.cs

@@ -0,0 +1,103 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+using System.Linq;
+
+namespace Venus_Simulator.Devices
+{
+
+    class TurboPumpMockPMB : SerialPortDeviceSimulator
+    {
+        public enum TurboPumpStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+
+        private readonly byte PUMP_ON_FLAG = 0x02;
+        private readonly byte RESERVE_FLAG = 0x80;
+        private readonly byte ISO_VALVE_OPEN_FLAG = 0x01;
+        private readonly byte WATER_VALVE_OEPN_FLAG = 0x08;
+        private readonly byte VALVE_AT_SPEED_FLAG = 0x40;
+
+        private byte pumpStatus
+        {
+            get
+            {
+                return (byte)((_simTurboPumpStatus == TurboPumpStatus.ON ? PUMP_ON_FLAG : 0) + RESERVE_FLAG);
+            }
+        }
+
+        private byte valveStatus
+        {
+            get
+            {
+                return (byte)(ISO_VALVE_OPEN_FLAG + WATER_VALVE_OEPN_FLAG + VALVE_AT_SPEED_FLAG + RESERVE_FLAG);
+            }
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM1";
+
+        private int _speed = 200;
+        private int _temperature = 80;
+        private Random _rd = new Random();
+
+        TurboPumpStatus _simTurboPumpStatus;
+        public TurboPumpMockPMB() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simTurboPumpStatus = TurboPumpStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Trim().Split('\r');
+            foreach (string msg in strs)
+            {
+                string sRes = string.Empty;
+                string str = msg.Trim();
+                if (str.Length == 0)
+                    continue;
+
+                if (str.Contains("STA"))
+                {
+                    if (_simTurboPumpStatus == TurboPumpStatus.ON)
+                    {
+                        _speed = 200;
+                    }
+                    else
+                    {
+                        _speed = 0;
+                    }
+                    string strData = string.Format("#000,000,{0:D5},000,000,000,000,000,00,00000,{1:D3},099,0123456789012345678901234\r", _speed + _rd.Next(0, 5), _temperature + _rd.Next(-5, 5));
+                    byte[] byteArray = System.Text.Encoding.Default.GetBytes(strData);
+                    byteArray[6] = pumpStatus;
+                    byteArray[7] = valveStatus;
+
+                    OnWriteMessage(byteArray);
+                    continue;
+                }
+                else if (str.Contains("TMPON"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.ON;
+                }
+                else if (str.Contains("TMPOFF"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.OFF;
+                }
+                else
+                    continue;
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 103 - 0
Venus/Venus_Simulator/Devices/TurboPumpMockPMC.cs

@@ -0,0 +1,103 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+using System.Linq;
+
+namespace Venus_Simulator.Devices
+{
+
+    class TurboPumpMockPMC : SerialPortDeviceSimulator
+    {
+        public enum TurboPumpStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+
+        private readonly byte PUMP_ON_FLAG = 0x02;
+        private readonly byte RESERVE_FLAG = 0x80;
+        private readonly byte ISO_VALVE_OPEN_FLAG = 0x01;
+        private readonly byte WATER_VALVE_OEPN_FLAG = 0x08;
+        private readonly byte VALVE_AT_SPEED_FLAG = 0x40;
+
+        private byte pumpStatus
+        {
+            get
+            {
+                return (byte)((_simTurboPumpStatus == TurboPumpStatus.ON ? PUMP_ON_FLAG : 0) + RESERVE_FLAG);
+            }
+        }
+
+        private byte valveStatus
+        {
+            get
+            {
+                return (byte)(ISO_VALVE_OPEN_FLAG + WATER_VALVE_OEPN_FLAG + VALVE_AT_SPEED_FLAG + RESERVE_FLAG);
+            }
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM4";
+
+        private int _speed = 200;
+        private int _temperature = 80;
+        private Random _rd = new Random();
+
+        TurboPumpStatus _simTurboPumpStatus;
+        public TurboPumpMockPMC() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simTurboPumpStatus = TurboPumpStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Trim().Split('\r');
+            foreach(string msg in strs)
+            {
+                string sRes = string.Empty;
+                string str = msg.Trim();
+                if (str.Length == 0)
+                    continue;
+
+                if (str.Contains("STA"))
+                {
+                    if (_simTurboPumpStatus == TurboPumpStatus.ON)
+                    {
+                        _speed = 200;
+                    }
+                    else
+                    {
+                        _speed = 0;
+                    }
+                    string strData = string.Format("#000,000,{0:D5},000,000,000,000,000,00,00000,{1:D3},099,0123456789012345678901234\r", _speed + _rd.Next(0, 5), _temperature + _rd.Next(-5, 5));
+                    byte[] byteArray = System.Text.Encoding.Default.GetBytes(strData);
+                    byteArray[6] = pumpStatus;
+                    byteArray[7] = valveStatus;
+
+                    OnWriteMessage(byteArray);
+                    continue;
+                }
+                else if (str.Contains("TMPON"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.ON;
+                }
+                else if (str.Contains("TMPOFF"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.OFF;
+                }
+                else
+                    continue;
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 103 - 0
Venus/Venus_Simulator/Devices/TurboPumpMockPMD.cs

@@ -0,0 +1,103 @@
+using System;
+using MECF.Framework.Simulator.Core.Driver;
+using System.Linq;
+
+namespace Venus_Simulator.Devices
+{
+
+    class TurboPumpMockPMD : SerialPortDeviceSimulator
+    {
+        public enum TurboPumpStatus
+        {
+            Unknown,
+            OFF,
+            ON,
+            ERROR
+        }
+
+
+        private readonly byte PUMP_ON_FLAG = 0x02;
+        private readonly byte RESERVE_FLAG = 0x80;
+        private readonly byte ISO_VALVE_OPEN_FLAG = 0x01;
+        private readonly byte WATER_VALVE_OEPN_FLAG = 0x08;
+        private readonly byte VALVE_AT_SPEED_FLAG = 0x40;
+
+        private byte pumpStatus
+        {
+            get
+            {
+                return (byte)((_simTurboPumpStatus == TurboPumpStatus.ON ? PUMP_ON_FLAG : 0) + RESERVE_FLAG);
+            }
+        }
+
+        private byte valveStatus
+        {
+            get
+            {
+                return (byte)(ISO_VALVE_OPEN_FLAG + WATER_VALVE_OEPN_FLAG + VALVE_AT_SPEED_FLAG + RESERVE_FLAG);
+            }
+        }
+
+        private const string EOF = "\r";
+        private const char MSG_DELIMITER = '_';
+        private const string MOCKUP_PORT = "COM6";
+
+        private int _speed = 200;
+        private int _temperature = 80;
+        private Random _rd = new Random();
+
+        TurboPumpStatus _simTurboPumpStatus;
+        public TurboPumpMockPMD() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
+        {
+            _simTurboPumpStatus = TurboPumpStatus.Unknown;
+        }
+
+        protected override void ProcessUnsplitMessage(string message)
+        {
+            if (string.IsNullOrEmpty(message))
+                throw new ArgumentException("Hardware command message is invalid");
+
+            string[] strs = message.Trim().Split('\r');
+            foreach(string msg in strs)
+            {
+                string sRes = string.Empty;
+                string str = msg.Trim();
+                if (str.Length == 0)
+                    continue;
+
+                if (str.Contains("STA"))
+                {
+                    if (_simTurboPumpStatus == TurboPumpStatus.ON)
+                    {
+                        _speed = 200;
+                    }
+                    else
+                    {
+                        _speed = 0;
+                    }
+                    string strData = string.Format("#000,000,{0:D5},000,000,000,000,000,00,00000,{1:D3},099,0123456789012345678901234\r", _speed + _rd.Next(0, 5), _temperature + _rd.Next(-5, 5));
+                    byte[] byteArray = System.Text.Encoding.Default.GetBytes(strData);
+                    byteArray[6] = pumpStatus;
+                    byteArray[7] = valveStatus;
+
+                    OnWriteMessage(byteArray);
+                    continue;
+                }
+                else if (str.Contains("TMPON"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.ON;
+                }
+                else if (str.Contains("TMPOFF"))
+                {
+                    sRes = "#000,OK\r";
+                    _simTurboPumpStatus = TurboPumpStatus.OFF;
+                }
+                else
+                    continue;
+
+                OnWriteMessage(sRes);
+            }
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMBView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuPendulumPMBView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 29 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMBView.xaml.cs

@@ -0,0 +1,29 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// </summary>
+    public partial class SimuPendulumPMBView : UserControl
+    {
+        public SimuPendulumPMBView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockPendulumViewModelPMB();
+        }
+    }
+
+    class MockPendulumViewModelPMB : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMB simulator"; }
+        }
+
+        public MockPendulumViewModelPMB() : base("PendulumPMBSimulator")
+        {
+            Init(new PendulumValveMockPMB());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuPendulumPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 29 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMCView.xaml.cs

@@ -0,0 +1,29 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// </summary>
+    public partial class SimuPendulumPMCView : UserControl
+    {
+        public SimuPendulumPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockPendulumViewModelPMC();
+        }
+    }
+
+    class MockPendulumViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMC simulator"; }
+        }
+
+        public MockPendulumViewModelPMC() : base("PendulumPMCSimulator")
+        {
+            Init(new PendulumValveMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMDView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuPendulumPMDView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 29 - 0
Venus/Venus_Simulator/Views/SimuPendulumValvePMDView.xaml.cs

@@ -0,0 +1,29 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// </summary>
+    public partial class SimuPendulumPMDView : UserControl
+    {
+        public SimuPendulumPMDView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockPendulumViewModelPMD();
+        }
+    }
+
+    class MockPendulumViewModelPMD : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMB simulator"; }
+        }
+
+        public MockPendulumViewModelPMD() : base("PendulumPMBSimulator")
+        {
+            Init(new PendulumValveMockPMB());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMBView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuTurboPumpPMBView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+    </UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMBView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuTurboPumpPMAView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuTurboPumpPMBView : UserControl
+    {
+        public SimuTurboPumpPMBView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockTurboPumpViewModelPMB();
+        }
+    }
+
+    class MockTurboPumpViewModelPMB : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMB simulator"; }
+        }
+
+        public MockTurboPumpViewModelPMB() : base("TurboPumpPMBSimulator")
+        {
+            Init(new TurboPumpMockPMB());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuTurboPumpPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+    </UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMCView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuTurboPumpPMCView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuTurboPumpPMCView : UserControl
+    {
+        public SimuTurboPumpPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockTurboPumpViewModelPMC();
+        }
+    }
+
+    class MockTurboPumpViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMC simulator"; }
+        }
+
+        public MockTurboPumpViewModelPMC() : base("TurboPumpPMCSimulator")
+        {
+            Init(new TurboPumpMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMDView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.SimuTurboPumpPMDView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+    </UserControl>

+ 31 - 0
Venus/Venus_Simulator/Views/SimuTurboPumpPMDView.xaml.cs

@@ -0,0 +1,31 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// SimuTurboPumpPMDView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SimuTurboPumpPMDView : UserControl
+    {
+        public SimuTurboPumpPMDView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockTurboPumpViewModelPMD();
+        }
+    }
+
+    class MockTurboPumpViewModelPMD : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "Pendulum Valve PMD simulator"; }
+        }
+
+        public MockTurboPumpViewModelPMD() : base("TurboPumpPMDSimulator")
+        {
+            Init(new TurboPumpMockPMD());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/simuESCHVPMBView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.simuESCHVPMBView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 32 - 0
Venus/Venus_Simulator/Views/simuESCHVPMBView.xaml.cs

@@ -0,0 +1,32 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// simuESCHVPMAView.xaml 的交互逻辑
+    /// </summary>
+
+    public partial class simuESCHVPMBView : UserControl
+    {
+        public simuESCHVPMBView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockESCHVViewModelPMB();
+        }
+    }
+
+    class MockESCHVViewModelPMB : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "ESC HV PMB simulator"; }
+        }
+
+        public MockESCHVViewModelPMB() : base("ESC_HV PMB")
+        {
+            Init(new ESCHVMockPMB());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/simuESCHVPMCView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.simuESCHVPMCView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 32 - 0
Venus/Venus_Simulator/Views/simuESCHVPMCView.xaml.cs

@@ -0,0 +1,32 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// simuESCHVPMAView.xaml 的交互逻辑
+    /// </summary>
+
+    public partial class simuESCHVPMCView : UserControl
+    {
+        public simuESCHVPMCView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockESCHVViewModelPMC();
+        }
+    }
+
+    class MockESCHVViewModelPMC : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "ESC HV PMC simulator"; }
+        }
+
+        public MockESCHVViewModelPMC() : base("ESC_HV PMC")
+        {
+            Init(new ESCHVMockPMC());
+        }
+    }
+}

+ 53 - 0
Venus/Venus_Simulator/Views/simuESCHVPMDView.xaml

@@ -0,0 +1,53 @@
+<UserControl x:Class="Venus_Simulator.Views.simuESCHVPMDView"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:Venus_Simulator.Views"
+             xmlns:commons="clr-namespace:MECF.Framework.Simulator.Core.Commons;assembly=MECF.Framework.Simulator.Core"
+             mc:Ignorable="d" 
+             d:DesignHeight="900" d:DesignWidth="1200">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="100"></RowDefinition>
+            <RowDefinition Height="0"></RowDefinition>
+            <RowDefinition Height="50"></RowDefinition>
+            <RowDefinition Height="*"></RowDefinition>
+        </Grid.RowDefinitions>
+        <commons:SerialPortTitleView Grid.Row="0"></commons:SerialPortTitleView>
+        <Grid  Grid.Row="1" Height="350" Width="900">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="300"></RowDefinition>
+                <RowDefinition Height="50"></RowDefinition>
+            </Grid.RowDefinitions>
+        </Grid>
+        <StackPanel Grid.Row="2" Orientation="Horizontal" Width="1200">
+            <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
+        </StackPanel>
+        <DataGrid Grid.Row="3" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"
+                      ScrollViewer.CanContentScroll="True"
+                      ScrollViewer.VerticalScrollBarVisibility="Auto"
+                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                      Width="1200" Height="Auto" VerticalAlignment="Top">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Time" Width="200" IsReadOnly="True" Binding="{Binding OccurTime, UpdateSourceTrigger=PropertyChanged}" />
+                <DataGridTextColumn Header="Incoming" Width="500" IsReadOnly="True"  Binding="{Binding Incoming, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+                <DataGridTextColumn Header="Outgoing" Width="500" IsReadOnly="True"  Binding="{Binding Outgoing, UpdateSourceTrigger=PropertyChanged}">
+                    <DataGridTextColumn.ElementStyle>
+                        <Style TargetType="TextBlock">
+                            <Setter Property="TextWrapping" Value="Wrap" />
+                            <Setter Property="Height" Value="auto" />
+                        </Style>
+                    </DataGridTextColumn.ElementStyle>
+                </DataGridTextColumn>
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</UserControl>

+ 32 - 0
Venus/Venus_Simulator/Views/simuESCHVPMDView.xaml.cs

@@ -0,0 +1,32 @@
+using System.Windows.Controls;
+using MECF.Framework.Simulator.Core.Commons;
+using Venus_Simulator.Devices;
+
+namespace Venus_Simulator.Views
+{
+    /// <summary>
+    /// simuESCHVPMAView.xaml 的交互逻辑
+    /// </summary>
+
+    public partial class simuESCHVPMDView : UserControl
+    {
+        public simuESCHVPMDView()
+        {
+            InitializeComponent();
+            this.DataContext = new MockESCHVViewModelPMD();
+        }
+    }
+
+    class MockESCHVViewModelPMD : SerialPortDeviceViewModel
+    {
+        public string Title
+        {
+            get { return "ESC HV PMD simulator"; }
+        }
+
+        public MockESCHVViewModelPMD() : base("ESC_HV PMD")
+        {
+            Init(new ESCHVMockPMD());
+        }
+    }
+}