using System; using Aitex.Core.UI.MVVM; using Aitex.Core.Utilities; using MECF.Framework.Simulator.Core.Commons; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using MECF.Framework.Simulator.Core.Driver; using System.Collections.Generic; namespace MECF.Framework.Simulator.Core.Pumps { /// /// SimPumpOsakaTGkineView.xaml 的交互逻辑 /// public partial class SimPumpOsakaTGkineView : UserControl { public static readonly DependencyProperty PortProperty = DependencyProperty.Register( "Port", typeof(string), typeof(SimPumpOsakaTGkineView), new FrameworkPropertyMetadata("COM101", FrameworkPropertyMetadataOptions.AffectsRender)); public string Port { get { return (string)this.GetValue(PortProperty); } set { this.SetValue(PortProperty, value); } } public SimPumpOsakaTGkineView() { InitializeComponent(); this.Loaded += OnViewLoaded; } private void OnViewLoaded(object sender, RoutedEventArgs e) { if (DesignerProperties.GetIsInDesignMode(this)) return; if (DataContext == null || !(DataContext is SimSimPumpOsakaTGkineViewModel)) { DataContext = new SimSimPumpOsakaTGkineViewModel(Port); (DataContext as TimerViewModelBase).Start(); } } } class SimSimPumpOsakaTGkineViewModel : SerialPortDeviceViewModel { public string Title { get { return "Osaka Pump TGkine Simulator"; } } private SimPumpOsakaTGkine _sim; public bool IsNoResponse { get { return _sim.IsNoResponse; } set { _sim.IsNoResponse = value; } } public bool IsRemote { get { return _sim.IsRemote; } set { _sim.IsRemote = value; } } public bool IsRun { get { return _sim.IsRun; } set { _sim.IsRun = value; } } public bool IsFault { get { return _sim.IsFault; } set { _sim.IsFault = value; } } public float TempFeedback { get { return _sim.TempFeedback; } set { _sim.TempFeedback = value; } } [IgnorePropertyChange] public string TempSetPoint { get { return _sim.TempSetPoint; } set { _sim.TempSetPoint = value; } } public ICommand SetTempCommand { get; set; } public SimSimPumpOsakaTGkineViewModel(string port) : base("SimPumpOsakaTGkineViewModel") { _sim = new SimPumpOsakaTGkine(port); Init(_sim); } } class SimPumpOsakaTGkine : SerialPortDeviceSimulator { Random _rd = new Random(); private object _locker = new object(); public bool IsNoResponse { get; internal set; } public bool IsRemote { get; internal set; } public bool IsRun { get; internal set; } public bool IsFault { get; internal set; } public string TempSetPoint { get; internal set; } public float TempFeedback { get; internal set; } private bool _isOn; private bool _isReadSpeed; private bool _isReadStatus; private List _lstMsg = new List(); public SimPumpOsakaTGkine(string port) : base(port, -1, "", ' ', false) { } protected override void ProcessUnsplitMessage(byte[] message) { if(message != null) { _lstMsg.AddRange(message); if(_lstMsg.Count > 2 && _lstMsg[_lstMsg.Count - 1] == 0x03 && _lstMsg[_lstMsg.Count - 2] == 0x03) { if (_lstMsg.Count == 14) { if (_isReadSpeed) { var result = _isOn ? new byte[] { 0x02, 0xFF, 0x00, 0x05, 0x71, 0x01, 0xC2, 0x87, 0x03, 0x03 } : new byte[] { 0x02, 0xFF, 0x00, 0x05, 0x71, 0x00, 0x00, 0x87, 0x03, 0x03 }; OnWriteMessage(result); _lstMsg.Clear(); return; } else if (_isReadStatus) { var result = _isOn ? new byte[] { 0x02, 0xFF, 0x00, 0x05, 0x71, 0x63, 0x00, 0x87, 0x03, 0x03 } : new byte[] { 0x02, 0xFF, 0x00, 0x05, 0x71, 0x01, 0x20, 0x87, 0x03, 0x03 }; OnWriteMessage(result); _lstMsg.Clear(); return; } else { var result = new byte[] { 0x02, 0xFF, 0x00, 0x05, 0x71, 0x00, 0x00, 0x89, 0x03, 0x03 }; OnWriteMessage(result); _lstMsg.Clear(); return; } } if (_lstMsg.Count == 15) { if (_lstMsg[7] == 0x80 && _lstMsg[8] == 0x80) { _isReadSpeed = false; _isReadStatus = false; switch (_lstMsg[11]) { case 0x08: _isOn = true; break; case 0x09: _isOn = false; break; case 0x01: _isReadSpeed = true; break; case 0x40: _isReadStatus = true; break; } } var result = new byte[] { 0x02, 0xFF, 0x00, 0x03, 0x71, 0x8B, 0x03, 0x03 }; OnWriteMessage(result); _lstMsg.Clear(); return; } } } } } }