2026-01-26 18:56:53 +09:00

209 lines
9.1 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using System;
using System.Linq;
using System.Text;
namespace VisionLight {
/// <summary>
/// 이력 : SG PamRU Project 에서 사용하는 Light Controller
/// CAS Esmart시리즈
/// </summary>
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;
}
/// <summary>
/// Buzzer 사용 여부, Enable시 command 인식될때마다 부저음 발생
/// </summary>
/// <param name="isEnable">Buzzer를 Eanble 할지 여부( True : Enable | False: Disable)</param>
/// <returns></returns>
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
}
}