using Aurora.Api; using Aurora.Api.Devices; using Hermes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using VisionCommon; namespace VisionLight { /// /// LightBase (SerialModbus) /// public abstract class LightBase_ModbusSerial : LightBase { /// 시리얼 통신 베이스 protected ModbusConn _ModbusConn = null; /// /// 생성자 /// EquipmentInfo.SimulationMode로 시뮬레이션 상태를 설정한다. /// /// 디바이스 ID public LightBase_ModbusSerial(string deviceId) : base(deviceId) { LightConnType = eLightConnType.ModbusSereial; } /// /// 생성자 /// /// 디바이스 ID /// 시뮬레이션 상태 protected LightBase_ModbusSerial(string deviceId, bool isSimul) : base(deviceId, isSimul) { LightConnType = eLightConnType.ModbusSereial; IsSimul = isSimul; } /// /// 디바이스 Activate /// /// 디바이스 컨피그 /// protected override int DoActivate(IDeviceConfig config) { SetLightConfig(config as LightConfig); InitLastChParams(); var lightConfig_Serial = (LightConnfig_ModbusSerial)LightConfig; if (IsSimul) { return E1.OK; } if (_ModbusConn == null) { _ModbusConn = new ModbusConn(); } int res = _ModbusConn.Connect(lightConfig_Serial); if (res == E1.OK) { SetOnAllInternal(); // 시작시 모든 조명 On (Default) } return res; } /// /// 디바이스 Deactivate /// /// protected override int DoDeactivate() { ClearLastChParams(); if (EquipAdapter.Instance.EquipMode.IsSimulMode()) { return E1.OK; } else { if (_ModbusConn != null) { return _ModbusConn.Disconnect(); } } return E1.OK; } /// /// 조명 켜기 /// /// 채널 번호 /// 조명 제어 결과 public eLightResult SetOn(int channel = -1) { if (!IsConnected()) { return eLightResult.NG; } return base.SetOn(channel); } /// /// 조명 끄기 /// /// 채널 번호 /// 조명 제어 결과 public new eLightResult SetOff(int channel = -1) { if (!IsConnected()) { return eLightResult.NG; } return base.SetOff(channel); } /// /// 조명 상태 가져오기 /// /// 채널 번호 /// 조명 상태 (on : true, off : false) public new bool GetOnOff(int channel) { return base.GetOnOff(channel); } /// /// 조명 값 가져오기 /// /// 채널 번호 /// 조명 값 public new int GetLevel(int channel) { if (!IsConnected()) { return 0; } return base.GetLevel(channel); } /// /// 조명 값 제어 (개별) /// /// 레벨 /// 채널 번호 /// 조명 제어 결과 public new eLightResult SetLevel(int level, int channel = -1) { if (!IsConnected()) { return eLightResult.NG; } return base.SetLevel(level, channel); } /// /// 연결되어있는지 확인 필요 /// /// private bool IsConnected() { if (EquipAdapter.Instance.EquipMode.IsSimulMode()) { return true; } else if (_ModbusConn != null && IsActivated) { return true; } else { return false; } } #region wrapping method internal int WriteWord(int address, short value) { if (!IsActivated) { return E2.NOT_CONNECTED; } if (IsSimul) { return E1.OK; } return _ModbusConn.WriteWord((ushort)address, value); } /// /// Write double world /// /// 주소 /// 값 /// public int WriteDoubleWord(int address, int value) { if (!IsActivated) { return E2.NOT_CONNECTED; } if (IsSimul) { return E1.OK; } return _ModbusConn.WriteDoubleWord((ushort)address, value); } /// /// Write Real /// /// 주소 /// 값 /// public int WriteReal(int address, float word) { if (!IsActivated) { return E2.NOT_CONNECTED; } if (IsSimul) { return E1.OK; } return _ModbusConn.WriteReal((ushort)address, word); } /// /// Read Word /// /// 주소 /// public (int err, short value) ReadWord(int address) { if (!IsActivated) { return (E2.NOT_CONNECTED, -1); } if (IsSimul) { return (E1.OK, 1); } return _ModbusConn.ReadWord((ushort)address); } /// /// Read Double Word /// /// 주소 /// public (int err, int value) ReadDoubleWord(int address) { if (!IsActivated) { return (E2.NOT_CONNECTED, -1); } if (IsSimul) { return (E1.OK, 1); } return _ModbusConn.ReadDoubleWord((ushort)address); } /// /// Read Real /// /// 주소 /// public (int err, float value) ReadReal(int address) { if (!IsActivated) { return (E2.NOT_CONNECTED, -1); } if (IsSimul) { return (E1.OK, 1); } return _ModbusConn.ReadReal((ushort)address); } #endregion } }