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

292 lines
7.7 KiB
C#

using Aurora.Api;
using Aurora.Api.DataType;
using Aurora.Api.Devices;
using Hermes;
using PropertyTools.DataAnnotations;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AuroraPowerMeter.Gentec
{
// Gentec
// refer https://www.gentec-eo.com/Content/downloads/user-manual/User_Manual_P-LINK_V14.pdf
public class PowerMeterGT : SerialConn, IPowerMeter
{
public const string CMD_ATTENUATOR_ON = "*ATT";
public const string CMD_ATTENUATOR_OFF = "*ATF";
public const string CMD_ENDCAUMODE = "*CSU";
public const string CMD_RETURNSINGLEMEASUREMENT = "*CVU";
public const string CMD_ANTICIPATION_ON = "*ANT";
public const string CMD_ANTICIPATION_OFF = "*ANF";
public const string CMD_POWERCORRECTION_ON = "*CFT";
public const string CMD_POWERCORRECTION_OFF = "*CFF";
public const string CMD_ENERGYMODE_ON = "*CMW";
public const string CMD_ENERGYMODE_OFF = "*CMX";
public const string CMD_SENDDATAPOINT = "*CAU";
public const string CMD_RESETDEVICE = "*RST";
public const string CMD_SETZEROOFFSET = "*SOU";
public const string CMD_PHYSICALSCALEDOWN = "*SHI";
public const string CMD_PHYSICALSCALEUP = "*SLO";
public const string CMD_AUTOSCALEMODEON = "*FAS";
public const string CMD_WAVELENGTHCORRECTION = "*PWC{0:D5}";
public const string CMD_MODIFYTRIGGERLEVEL = "*TLC{0:0.00E+00}";
public const string CMD_MODIFYMULTIFACTOR = "*MUL{0:0.00E+0}";
public const string CMD_MODIFYOFFSET = "*OFF{0:0.00E+00}";
public const string REPLY_ACK = "ACK";
private SerialConnConfig _connConfig;
public PowerMeterGT(string deviceId, bool isSimul) : base(deviceId, isSimul)
{
}
public int Connect(SerialConnConfig config)
{
_connConfig = config;
if (IsPortOpen()) {
return E1.OK;
}
return Open(config);
}
public int Disconnect()
{
return Close();
}
public int Reconnect()
{
// 1. 컴포트가 열려있으면 닫기
Disconnect();
// 2. 연결
if (IsPortOpen()) {
return E1.OK;
}
return Open(_connConfig);
//throw new NotImplementedException();
}
public bool Measure(out double power)
{
power = 0;
var reply = SendAndRepely(CMD_RETURNSINGLEMEASUREMENT);
if (reply == null || reply != REPLY_ACK) {
return false;
}
reply = ReadLine();
if (string.IsNullOrEmpty(reply)) {
return false;
}
try {
decimal value = decimal.Parse(reply, System.Globalization.NumberStyles.Float);
power = decimal.ToDouble(value);
return true;
} catch (Exception ex) {
Log.FuncE(ex.Message);
}
return false;
}
public bool SetZero()
{
var reply = SendAndRepely(CMD_SETZEROOFFSET);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
private string SendAndRepely(string commnad)
{
var reply = WriteAndReadLine(commnad);
if (string.IsNullOrEmpty(reply)) {
return null;
}
return reply.Trim("\r\n ".ToCharArray());
}
public bool AttenuatorOn(bool bOn) // On / Off 같이 쓰자
{
string cmd = bOn ? CMD_ATTENUATOR_ON : CMD_ATTENUATOR_OFF;
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
// 미사용..리턴값도 잘못되었다..“9.793354e-01\r\r\n
// Not Complete
public bool SendDataPoint()
{
var reply = SendAndRepely(CMD_SENDDATAPOINT);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
// 미사용
public bool EndCAUMode()
{
var reply = SendAndRepely(CMD_ENDCAUMODE);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
// 미사용
public bool AnticipationOn(bool bOn) // on/off 같이 쓰지
{
string cmd = bOn ? CMD_ANTICIPATION_ON : CMD_ANTICIPATION_OFF;
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
// 미사용
public bool PowerCorrectionOn(bool bOn)
{
string cmd = bOn ? CMD_POWERCORRECTION_ON : CMD_POWERCORRECTION_OFF;
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
// 미사용
public bool ResetDevice()
{
var reply = SendAndRepely(CMD_RESETDEVICE);
if (reply == null || reply != "") {
return false;
}
return true;
}
// 사용
public bool WaveLengthCorrection(int nLength)
{
string cmd = string.Format(CMD_WAVELENGTHCORRECTION, nLength);
if (!Write(cmd)) {
return false;
} else {
return true;
}
}
// 미사용
public bool ModifyTriggerLevel(double fLevel)
{
string cmd = string.Format(CMD_MODIFYTRIGGERLEVEL, fLevel);
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool ModifyMultiFactor(double fFactor)
{
string cmd = string.Format(CMD_MODIFYMULTIFACTOR, fFactor);
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool ModifyOffset(int nOffset)
{
string cmd = string.Format(CMD_MODIFYOFFSET, nOffset);
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool EnergyModeOn(bool bOn)
{
string cmd = bOn ? CMD_ENERGYMODE_ON : CMD_ENERGYMODE_OFF;
var reply = SendAndRepely(cmd);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool PhysicalScaleDown()
{
var reply = SendAndRepely(CMD_PHYSICALSCALEDOWN);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool PhysicalScaleUp()
{
var reply = SendAndRepely(CMD_PHYSICALSCALEUP);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
public bool AutoScaleModeOn()
{
var reply = SendAndRepely(CMD_AUTOSCALEMODEON);
if (reply == null || reply != REPLY_ACK) {
return false;
}
return true;
}
}
}