/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using System; using System.Linq; using System.Text; namespace VisionLight { /// /// 이력 : SG PamRU Project 에서 사용하는 Light Controller /// CAS Esmart시리즈 /// internal class Light_Esmart : LightBase_Serial { #region Protocol private const string CMD_RESET = "reset\r"; private const string CMD_SET_BRIGHTNESS = "setbrightness {0} {1}\r"; // 0: channel (0~N, 3:4ch| 7:8ch), 1: bright(0~1024) private const string CMD_SET_BRIGHTNESS_LITE = "# {0} {1}\r"; private const string CMD_GET_BRIGHTNESS = "getbrightness {0}\r"; //0 : channel, RE :"getbrightness [index] [ch] [bright]\n" private const string CMD_GET_BRIGHTNESS_LITE = "$ {0}\r"; //0 : channel, RE :"$ [index] [ch] [bright]\n" private const string CMD_SET_ON_OFF= "setonex {0:X2}\r"; // "setonex 0F\r" , 0~3번 채널을 On, "setonex 01\r" , 0번채널(채널1) On , 1~3번채널 Off #warning ERI 프로그램에서 제공하는 Protocol 참조. 만약, seton이 안될 시, 아래 주석 풀 것. //private const string CMD_SET_ON_OFF= "setonex {0:X8}\r"; // "setonex 0F\r" , 0~3번 채널을 On, "setonex 01\r" , 0번채널(채널1) On , 1~3번채널 Off private const string CMD_GET_ON_OFF= "getonex\r"; // RE:"getonex [index] [on/off]\n" ex) "getonex 0 0F\n" private const string CMD_SAVE_BRIGHT= "savebright {0}\r"; // Index: SaveMemory (0~9), on/off private const string CMD_LOAD_BRIGHT= "loadbright {0}\r"; // Index: LoadMemory (0~9) private const string CMD_GET_BRIGHT_INDEX= "getbrightindex\r"; // RE:getbrightindex [index]\n" private const string CMD_GET_ERROR_STATUS = "geterrstatus\r"; // geterrstatus [err] [code]\n, error : 0 - none error , 1 - error (hex number), RE: "geterrstatus 1 12\n" 과온도, 0~3번 채널 중 과전류 보호상태 private const string CMD_SET_BUZZER= "setbuzzer {0:X1}\r"; // 0: disable 1: enable private const string CMD_HELP= "help\r"; private const int recvFormatSize = 1024; public enum eErr { UNKNOWN = -1, NONE = 0, ERR_TEMP_OVER_PROTECTED = 2, ERR_CURRENT_OVER_PROTECTED_1 = 12, ERR_CURRENT_OVER_PROTECTED_2 = 24, ERR_CURRENT_OVER_PROTECTED_3 = 48, ERR_CURRENT_OVER_PROTECTED_4 = 96 } #endregion public Light_Esmart(string deviceId) : base(deviceId) { DeviceId = deviceId; SerialConn = new Aurora.Api.Devices.SerialConn(deviceId); } protected override eLightResult SetLevelImpl(int level, int channel) { return SetBrightness(channel, level) ? eLightResult.OK : eLightResult.NG; } protected override eLightResult SetOffImpl(int channel) { var current = GetOnOffApi(); if (current.index != -1) { var status = BitMaskUtil.ClearBit(current.channelStatus, channel); //Logger.E("[LOG]", $"============== {Convert.ToString(status, 2)}======== "); return SetOnOffApi(status) ? eLightResult.OK : eLightResult.NG; } else { return eLightResult.NG; } } protected override eLightResult SetOnImpl(int channel) { var current = GetOnOffApi(); if (current.index != -1) { var status = BitMaskUtil.SetBit(current.channelStatus, channel); //Logger.V("[LOG]", $"============== {Convert.ToString(status, 2)}======== "); return SetOnOffApi(status) ? eLightResult.OK : eLightResult.NG; } else { return eLightResult.NG; } } #region Controlers Api public bool Reset() { return SerialConn.Write(CreateSetOnReqMsg(CMD_RESET)); } public bool SetBrightness (int channel, int brightness) { return SerialConn.Write(CreateSetOnReqMsg(CMD_SET_BRIGHTNESS, channel, brightness)); } public bool SetBrightnessLite(int channel, int brightness) { return SerialConn.Write(CreateSetOnReqMsg(CMD_SET_BRIGHTNESS_LITE, channel, brightness)); } public (int index, int channel, int brightness) GetBrightness(int channel) { byte[] recvFormat = Encoding.UTF8.GetBytes("getbrightness 0 0 1024\n"); byte[] recvData = new byte[recvFormat.Length]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_GET_BRIGHTNESS, channel), recvData) > 0) { string[] result = ParsingRecvMsg(recvData); if (result.Count() == 4) { return (Convert.ToInt16(result[1]), Convert.ToInt16(result[2]), Convert.ToInt16(result[3])); } } return (-1, -1, -1); } public (int index, int channel, int brightness) GetBrightnessLite(int channel) { byte[] recvData = new byte[recvFormatSize]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_GET_BRIGHTNESS_LITE, channel), recvData) >0) { string[] result = ParsingRecvMsg(recvData); if (result.Count() == 3) { return (Convert.ToInt16(result[0]), Convert.ToInt16(result[1]), Convert.ToInt16(result[2])); } } return (-1, -1, -1); } public bool SetOnOffApi(int channels) { return SerialConn.Write(CreateSetOnReqMsg(CMD_SET_ON_OFF, channels)); } public (int index,byte channelStatus) GetOnOffApi() { #warning ERI TEST MODULE 참조 만약 정확하게 먹지않으면 아래 주석 제거 byte[] recvData = new byte[recvFormatSize]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_GET_ON_OFF), recvData) > 0 && recvData.Length > 2) { string[] result = ParsingRecvMsg(recvData); if (result.Count() == 3) { return (Convert.ToInt16(result[1]), Convert.ToByte(result[2], 16)); } } return (-1, 0); } public bool SaveBright(int index) { return SerialConn.Write(CreateSetOnReqMsg(CMD_SAVE_BRIGHT, index)); } public bool LoadBright(int index) { return SerialConn.Write(CreateSetOnReqMsg(CMD_LOAD_BRIGHT, index)); } public int GetBrightIndex() { byte[] recvData = new byte[recvFormatSize]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_GET_BRIGHT_INDEX), recvData) > 0) { string[] result = ParsingRecvMsg(recvData); if (result.Count() == 2) { return Convert.ToInt32(result[1]); } } return -1; } public eErr GetErrorStatus() { byte[] recvData = new byte[recvFormatSize]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_GET_ERROR_STATUS), recvData) > 0) { string[] result = ParsingRecvMsg(recvData); if (result.Count() >= 2) { if (result[1] == "0") { return eErr.NONE; } else { return (eErr)Convert.ToInt16(result[2]); } } } return eErr.UNKNOWN; } /// /// Buzzer 사용 여부, Enable시 command 인식될때마다 부저음 발생 /// /// Buzzer를 Eanble 할지 여부( True : Enable | False: Disable) /// public bool SetBuzzer(bool isEnable) { return SerialConn.Write(CreateSetOnReqMsg(CMD_SET_BUZZER, isEnable ? 1 : 0)); } public string Help() { byte[] recvData = new byte[recvFormatSize]; if (SerialConn.WriteAndRead(CreateSetOnReqMsg(CMD_HELP), recvData) > 0 ) { string[] result = ParsingRecvMsg(recvData); return string.Join(" ",result); } else { return eErr.UNKNOWN.ToString(); } } #endregion #region utils internal byte[] CreateSetOnReqMsg(string command) { string msg = string.Format(command); return Encoding.UTF8.GetBytes(msg); } internal byte[] CreateSetOnReqMsg(string command, int param1) { string msg = string.Format(command, param1); return Encoding.UTF8.GetBytes(msg); } internal byte[] CreateSetOnReqMsg(string command, int param1, int param2) { string msg = string.Format(command, param1, param2); return Encoding.UTF8.GetBytes(msg); } internal string[] ParsingRecvMsg(byte[] recvMsg) { recvMsg = recvMsg.Take(Array.IndexOf(recvMsg, Convert.ToByte('\n'))).ToArray(); return Encoding.UTF8.GetString(recvMsg).Split(' '); } #endregion } }