249 lines
7.5 KiB
C#
249 lines
7.5 KiB
C#
/*
|
|
* 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 {
|
|
/// <summary>
|
|
/// LightBase (SerialModbus)
|
|
/// </summary>
|
|
public abstract class LightBase_ModbusSerial : LightBase {
|
|
/// <summary> 시리얼 통신 베이스 </summary>
|
|
protected ModbusConn _ModbusConn = null;
|
|
/// <summary>
|
|
/// 생성자
|
|
/// EquipmentInfo.SimulationMode로 시뮬레이션 상태를 설정한다.
|
|
/// </summary>
|
|
/// <param name="deviceId">디바이스 ID</param>
|
|
public LightBase_ModbusSerial(string deviceId) : base(deviceId) {
|
|
LightConnType = eLightConnType.ModbusSereial;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 생성자
|
|
/// </summary>
|
|
/// <param name="deviceId">디바이스 ID</param>
|
|
/// <param name="isSimul">시뮬레이션 상태</param>
|
|
protected LightBase_ModbusSerial(string deviceId, bool isSimul)
|
|
: base(deviceId, isSimul) {
|
|
LightConnType = eLightConnType.ModbusSereial;
|
|
IsSimul = isSimul;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 디바이스 Activate
|
|
/// </summary>
|
|
/// <param name="config">디바이스 컨피그</param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 디바이스 Deactivate
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
protected override int DoDeactivate() {
|
|
ClearLastChParams();
|
|
|
|
if (EquipAdapter.Instance.EquipMode.IsSimulMode()) {
|
|
return E1.OK;
|
|
}
|
|
else {
|
|
if (_ModbusConn != null) {
|
|
return _ModbusConn.Disconnect();
|
|
}
|
|
}
|
|
|
|
return E1.OK;
|
|
}
|
|
/// <summary>
|
|
/// 조명 켜기
|
|
/// </summary>
|
|
/// <param name="channel">채널 번호</param>
|
|
/// <returns>조명 제어 결과</returns>
|
|
public eLightResult SetOn(int channel = -1) {
|
|
if (!IsConnected()) {
|
|
return eLightResult.NG;
|
|
}
|
|
return base.SetOn(channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 조명 끄기
|
|
/// </summary>
|
|
/// <param name="channel">채널 번호</param>
|
|
/// <returns>조명 제어 결과</returns>
|
|
public new eLightResult SetOff(int channel = -1) {
|
|
if (!IsConnected()) {
|
|
return eLightResult.NG;
|
|
}
|
|
return base.SetOff(channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 조명 상태 가져오기
|
|
/// </summary>
|
|
/// <param name="channel">채널 번호</param>
|
|
/// <returns>조명 상태 (on : true, off : false)</returns>
|
|
public new bool GetOnOff(int channel) {
|
|
return base.GetOnOff(channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 조명 값 가져오기
|
|
/// </summary>
|
|
/// <param name="channel">채널 번호</param>
|
|
/// <returns>조명 값</returns>
|
|
public new int GetLevel(int channel) {
|
|
if (!IsConnected()) {
|
|
return 0;
|
|
}
|
|
return base.GetLevel(channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 조명 값 제어 (개별)
|
|
/// </summary>
|
|
/// <param name="level">레벨</param>
|
|
/// <param name="channel">채널 번호</param>
|
|
/// <returns>조명 제어 결과</returns>
|
|
public new eLightResult SetLevel(int level, int channel = -1) {
|
|
if (!IsConnected()) {
|
|
return eLightResult.NG;
|
|
}
|
|
return base.SetLevel(level, channel);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 연결되어있는지 확인 필요
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Write double world
|
|
/// </summary>
|
|
/// <param name="address">주소</param>
|
|
/// <param name="value">값</param>
|
|
/// <returns></returns>
|
|
public int WriteDoubleWord(int address, int value) {
|
|
if (!IsActivated) {
|
|
return E2.NOT_CONNECTED;
|
|
}
|
|
if (IsSimul) {
|
|
return E1.OK;
|
|
}
|
|
return _ModbusConn.WriteDoubleWord((ushort)address, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Write Real
|
|
/// </summary>
|
|
/// <param name="address"> 주소 </param>
|
|
/// <param name="word">값</param>
|
|
/// <returns></returns>
|
|
public int WriteReal(int address, float word) {
|
|
if (!IsActivated) {
|
|
return E2.NOT_CONNECTED;
|
|
}
|
|
if (IsSimul) {
|
|
return E1.OK;
|
|
}
|
|
return _ModbusConn.WriteReal((ushort)address, word);
|
|
}
|
|
/// <summary>
|
|
/// Read Word
|
|
/// </summary>
|
|
/// <param name="address"> 주소 </param>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read Double Word
|
|
/// </summary>
|
|
/// <param name="address"> 주소 </param>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read Real
|
|
/// </summary>
|
|
/// <param name="address">주소</param>
|
|
/// <returns></returns>
|
|
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
|
|
}
|
|
}
|