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