using Hermes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VisionLight { /// /// LVS PT Series Base Code /// PT0105 | PT0205 | PT0405 /// public abstract class Light_LVS_PT : LightBase_Serial { /// /// Light_LVS_PT생성자 /// /// 디바이스 Id public Light_LVS_PT(string deviceId) : base(deviceId) { DeviceId = deviceId; LOG = new Aurora.Api.Logger(deviceId); } #region Set On (Single or All) /// /// Set On Implement /// /// 채널 /// Light 결과 protected override eLightResult SetOnImpl(int channel) { lock (LockThis) { if (SendData_SetOn(channel) == E1.OK) { return eLightResult.OK; } else { return eLightResult.NG; } } } private int SendData_SetOn(int channel) { try { byte[] sendData = CreateSetOnReqMsg(channel); byte[] recvData = new byte[1]; SerialConn.WriteAndRead(sendData, recvData, sendData.Length); if (!CheckResponse(recvData)) { return E1.GENERIC; } return E1.OK; } catch (Exception e) { LOG.FuncE(e.Message); } return E1.GENERIC; } #endregion #region Set Off (Single or All) /// /// Set Off Implement /// /// 채널 /// Light 결과 protected override eLightResult SetOffImpl(int channel) { lock (LockThis) { if (SendData_SetOff(channel) == E1.OK) { return eLightResult.OK; } else { return eLightResult.NG; } } } private int SendData_SetOff(int channel) { try { byte[] sendData = CreateSetOffReqMsg(channel); byte[] recvData = new byte[1]; SerialConn.WriteAndRead(sendData, recvData, sendData.Length); if (!CheckResponse(recvData)) { return E1.GENERIC; } } catch (Exception e) { LOG.FuncE(e.Message); } return E1.GENERIC; } #endregion #region Set Level (Single or All) /// /// Set level Implement /// /// 레벨 /// 채널 /// protected override eLightResult SetLevelImpl(int level, int channel) { lock (LockThis) { if (SendData_SetLevel(level, channel) == E1.OK) { return eLightResult.OK; } else { return eLightResult.NG; } } } private int SendData_SetLevel(int level, int channel) { try { byte[] sendData = CreateSetLevelReqMsg(level, channel); byte[] recvData = new byte[1]; SerialConn.WriteAndRead(sendData, recvData, sendData.Length); if (!CheckResponse(recvData)) { return E1.GENERIC; } return E1.OK; } catch (Exception e) { LOG.FuncE(e.Message); } return E1.GENERIC; } #endregion #region Create Req Msg /// /// Set On 할 때 요청 Msg /// /// ChannelRange 안의 Channel /// internal abstract byte[] CreateSetOnReqMsg(int channel); /// /// Set Off 할 때 요청 Msg /// /// ChannelRange 안의 Channel /// internal abstract byte[] CreateSetOffReqMsg(int channel); /// /// Set Level 할 때의 요청 Msg /// /// DimRange 안의 Level /// ChannelRange 안의 Channel /// internal abstract byte[] CreateSetLevelReqMsg(int level, int channel); internal virtual byte[] CreateGetLevelReqMsg(int channel) { // :R1[CR][LF] -> 1채널 밝기 string msg = string.Format("{0}{1}{2:D1}{3}{4}", ":", "R", channel, "\r", "\n"); return Encoding.UTF8.GetBytes(msg); } #endregion #region Util Light /*검증 필요 private int GetLevelFromLightController(int channel) { try { if(!CheckChannel(channel)) { return E1.GENERIC; } byte[] sendData = CreateGetLevelReqMsg(channel); byte[] recvData = new byte[1]; SerialConn.WriteAndRead(sendData, recvData, sendData.Length); if (recvData.Length > 0 && recvData.FirstOrDefault() == ACK) { return recvData[0]; // temp value } else { LOG.E($"Receive Error : {recvData}"); return E1.GENERIC; } } catch (Exception e) { LOG.FuncE(e.Message); } return E1.GENERIC; }*/ #endregion const byte ACK = 0x06; internal bool CheckResponse(byte[] response) { if (response.Length > 0 && response.FirstOrDefault() == ACK) { return true; } else { LOG.E($"Receive Error : {response}"); return false; } } } }