209 lines
9.1 KiB
C#
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
|
|
}
|
|
}
|