using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.Util; using MECF.Framework.Common.Device.Bases; using MECF.Framework.Common.Equipment; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using VirgoRT.Device.YASKAWA; using VirgoRT.Devices.EFEM; using VirgoRT.Modules; namespace VirgoRT.Devices { class VirgoSingalLight : SignalLightBase { public MECF.Framework.Common.Device.Bases.LightType Type { get; set; } public Efem EfemController { get; set; } private F_TRIG _trigError = new F_TRIG(); private bool _isInit; private TowerLightStatus _preState = TowerLightStatus.Unknown; public VirgoSingalLight(string module, string name) : base(module, name) { _isInit = true; } protected override void SetOn() { SetLight(TowerLightStatus.On); } protected override void SetOff() { SetLight(TowerLightStatus.Off); } protected override void SetBlinking(bool token) { SetLight(TowerLightStatus.Blinking); } private bool SetSignalLight(MECF.Framework.Common.Device.Bases.LightType type, TowerLightStatus setpoint) { VirgoRT.LightType virgoType; switch (type) { case MECF.Framework.Common.Device.Bases.LightType.Red: virgoType = LightType.RED; break; case MECF.Framework.Common.Device.Bases.LightType.Yellow: virgoType = LightType.YELLOW; break; case MECF.Framework.Common.Device.Bases.LightType.Green: virgoType = LightType.GREEN; break; case MECF.Framework.Common.Device.Bases.LightType.White: virgoType = LightType.WHITE; break; case MECF.Framework.Common.Device.Bases.LightType.Blue: virgoType = LightType.BLUE; break; case MECF.Framework.Common.Device.Bases.LightType.Buzzer: case MECF.Framework.Common.Device.Bases.LightType.Buzzer1: virgoType = LightType.BUZZER1; break; default: virgoType = LightType.BUZZER1; break; } VirgoRT.LightStatus virgoSetpoint; switch (setpoint) { case TowerLightStatus.Blinking: virgoSetpoint = LightStatus.BLINK; break; case TowerLightStatus.On: virgoSetpoint = LightStatus.ON; break; case TowerLightStatus.Off: virgoSetpoint = LightStatus.OFF; break; default: virgoSetpoint = LightStatus.OFF; break; } EfemController.SetLamp(virgoType, virgoSetpoint); return true; } private void SetLight(TowerLightStatus setpoint) { try { if (setpoint != _preState || _isInit) { _trigError.CLK = SetSignalLight(Type, setpoint); if (_trigError.Q) { //EV.PostWarningLog(Module, $"Set {Type} signal light {setpoint} error, {reason}"); } if (_trigError.M) { _isInit = false; _preState = setpoint; } } } catch (Exception ex) { LOG.Write(ex); } } public void ResetData() { _isInit = true; } public override void Reset() { _trigError.RST = true; base.Reset(); } } public class VirgoSignalTower : SignalTowerBase { private Efem _efem; private List _lights = new List(); public VirgoSignalTower(string module, string name) : base("", "") { base.Module = module; base.Name = name; base.Display = name; base.DeviceID = ""; } public override bool Initialize() { base.Initialize(); if (_efem == null) { _efem = Singleton.Instance.EFEM.EfemDevice; } CustomSignalTower(); return true; } //重新连接EFEM之后,需要重置灯塔 public void ResetData() { foreach (var rorzeSingalLight in _lights) { rorzeSingalLight.ResetData(); } } public override SignalLightBase CreateLight(MECF.Framework.Common.Device.Bases.LightType type) { var light = new VirgoSingalLight(ModuleName.System.ToString(), $"SignalLight{type}") { Type = type, EfemController = _efem }; _lights.Add(light); return light; } } }