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; } } }