using System; using MECF.Framework.Simulator.Core.Driver; using System.Linq; namespace Venus_Simulator.Devices { class TurboPumpMockPMA : 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 = "COM61"; private int _speed = 200; private int _temperature = 80; private Random _rd = new Random(); TurboPumpStatus _simTurboPumpStatus; public TurboPumpMockPMA() : 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); } } } }