LGES-2170-ACW_CCW-Welder/AuroraDevices/AuroraPowerMeter/Coherent/UCCoherentPowerMeterDeviceViewModel.cs
2026-01-26 18:56:53 +09:00

141 lines
4.9 KiB
C#

using Aurora;
using Aurora.Api;
using Aurora.Api.Devices;
using Aurora.View;
using AuroraDeviceCommon.Views;
using AuroraPowerMeter;
using AuroraUIComponent.Chart;
using Hermes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
namespace AuroraPowerMeter.Coherent
{
public class UCCoherentPowerMeterDeviceViewModel : BaseDeviceViewModel
{
public ICommand CMD_MeasurePower { get; }
private readonly DispatcherTimer MonitorTimer;
//2023.01.14 YDY 구교동 대리가 수정한부분 같음...파워 메터 포트 부분 수정 했다고 들음...
private string _CurrentPowerName;
public string CurrentPowerName { get => _CurrentPowerName; set => SetProperty(ref _CurrentPowerName, value); }
private string _CurrentPortNumber;
public string CurrentPortNumber { get => _CurrentPortNumber; set => SetProperty(ref _CurrentPortNumber, value); }
private string _CurrentState;
public string CurrentState { get => _CurrentState; set => SetProperty(ref _CurrentState, value); }
private double _CurrentPower;
public double CurrentPower { get => _CurrentPower; set => SetProperty(ref _CurrentPower, value); }
public UCLineChartViewModel PowerMeterChart { get; }
bool _ContinuesMeasure;
public bool ContinuesMeasure { get => _ContinuesMeasure; set => SetProperty(ref _ContinuesMeasure, value); }
public UCCoherentPowerMeterDeviceViewModel(IAuroraEnvironment aurora, Device powerMeter)
: base(aurora, powerMeter)
{
CMD_MeasurePower = new DelegateCommand(MeasurePW);
PowerMeterChart = new UCLineChartViewModel(aurora);
PowerMeterChart.SetChart("POWER", "", 8, 0);
PowerMeterChart.SetChartLine("Power", 6);
PowerMeterChart.SetChartLineRange(true, 1, 0, 10);
PowerMeterChart.InitChart();
CurrentPowerName = "";
CurrentPortNumber = "";
_CurrentState = string.Empty;
_CurrentPower = 0.0;
_ContinuesMeasure = false;
MonitorTimer = new DispatcherTimer();
MonitorTimer.Tick += OnMonitoring;
MonitorTimer.Interval = TimeSpan.FromMilliseconds(1000);
// 파워미터가 두개라 디바이스 인덱스 같은걸로 받는 이벤트 등록 나눠야할듯. 아직 어떤 디바이스가 붙을지 몰라 보류.
aurora.EventObservable.AsObservable(PowerMeterEvent.EVENT_ID_MEASURE_RESULT)
.Select(msg => (ValueTuple<string, double>)msg.Param)
.Where(msg => msg.Item1 == powerMeter.DeviceId)
.Subscribe(power => OnPowerMeasured(power.Item2));
}
protected override void VisibleChanged(object obj)
{
bool visible = (bool)obj;
if (visible) {
MonitorTimer.Start();
} else {
ContinuesMeasure = false;
MonitorTimer.Stop();
}
}
private void OnMonitoring(object sender, EventArgs e)
{
if (_Device.IsActivated) {
var powerMeter = _Device as PowerMeter;
CurrentPowerName = _Device.DeviceId;
var deviceConfig = Application.Current.AuroraEnv().DeviceManager.GetDeviceConfig(_Device.DeviceId) as PowerMeterConfig;
CurrentPortNumber = string.Format("{0}", (deviceConfig.ConnConfig as SerialConnConfig).PortNum);
if (ContinuesMeasure) {
CurrentState = "측정중";
} else {
CurrentState = "대기중";
}
if (ContinuesMeasure) {
GetMeasurePower(null);
}
return;
} else {
CurrentState = "연결안됨";
}
}
private void OnPowerMeasured(double _value)
{
Application.Current.Dispatcher.InvokeAsync(() => PowerMeterChart.AddPoint(_value));
}
private void MeasurePW(object obj)
{
if (!_Device.IsActivated) {
ContinuesMeasure = false;
return;
}
if (ContinuesMeasure) {
ContinuesMeasure = false;
} else {
ContinuesMeasure = true;
}
}
private void GetMeasurePower(object obj)
{
if (!_Device.IsActivated) {
ContinuesMeasure = false;
return;
}
var powerMeter = _Device as PowerMeter;
double power = 0.0;
if (powerMeter.Measure(out power) == E1.OK) {
CurrentPower = power;
PowerMeterChart.AddPoint(power);
}
}
}
}