/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
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
}
}