2026-06-05 13:44:39 +09:00

207 lines
7.4 KiB
C#

using ACS.SPiiPlusNET;
using Aurora;
using Aurora.Api;
using Aurora.Api.DataType;
using Aurora.View;
using Hermes.Functional;
using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Reactive.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
namespace AuroraACS.Views
{
public class UCACSDeviceViewModel : NotifyPropertyChangedBase
{
private IAuroraEnvironment _env;
private ACSDevice _dev;
private string _settingId;
private ACSDeviceSetting _setting;
public ICommand CMD_VisibleChanged { get; }
public ICommand CMD_BufferStart { get; }
public ICommand CMD_BufferStop { get; }
//public ICommand CMD_BufferAdd { get; }
//public ICommand CMD_BufferDelete { get; }
//public ICommand CMD_BufferSave { get; }
//public ICommand CMD_BufferLoad { get; }
public ICommand CMD_VariableValueWrite { get; }
//public ICommand CMD_VariableValueAdd { get; }
//public ICommand CMD_VariableValueDelete { get; }
//public ICommand CMD_VariableValueSave { get; }
//public ICommand CMD_VariableValueLoad { get; }
public ObservableCollection<BufferInfo> BufferInfoList { get => _BufferInfoList; set => SetProperty(ref _BufferInfoList, value); }
private ObservableCollection<BufferInfo> _BufferInfoList;
public BufferInfo SelectedBufferInfo {
get => _SelectedBufferInfo;
set {
if(SetProperty(ref _SelectedBufferInfo, value))
UpdateSelectedReference();
}
}
private BufferInfo _SelectedBufferInfo;
public VariableValueCollection VariableValueList { get => _VariableValueList; set => SetProperty(ref _VariableValueList, value); }
private VariableValueCollection _VariableValueList;
public VariableValue SelectedVariableValue { get => _SelectedVariableValue; set => SetProperty(ref _SelectedVariableValue, value); }
private VariableValue _SelectedVariableValue;
public string WriteText { get => _WriteText; set => SetProperty(ref _WriteText, value); }
private string _WriteText;
public string HelpImagePath { get => _HelpImagePath; set => SetProperty(ref _HelpImagePath, value); }
private string _HelpImagePath;
private readonly DispatcherTimer _monitorTimer;
public UCACSDeviceViewModel(IAuroraEnvironment aurora, string deviceId, string settingId)
{
_env = aurora;
_dev = aurora.DeviceManager[deviceId] as ACSDevice;
_settingId = settingId;
_setting = aurora.SettingEntry[settingId] as ACSDeviceSetting;
HelpImagePath = $"file:///{_setting.HelpImagePath}";
_monitorTimer = new DispatcherTimer();
_monitorTimer.Tick += OnMonitoring;
_monitorTimer.Interval = TimeSpan.FromMilliseconds(100);
CMD_VisibleChanged = new DelegateCommand(VisibleChanged);
CMD_BufferStart = new DelegateCommand(OnBufferStart);
CMD_BufferStop = new DelegateCommand(OnBufferStop);
CMD_VariableValueWrite = new DelegateCommand(OnVariableValueWrite);
BufferInfoList = new BufferInfoCollection(_setting.BufferInfoList.Where(item => item.BufferNo != -1));
VariableValueList = new VariableValueCollection(_setting.VariableValueList.Where(item => item.VariableValueName != string.Empty));
for(int i = 0; i < VariableValueList.Count; i++)
_setting.VariableValueList[i].Index = VariableValueList[i].Index = i;
aurora.SettingEntry.Save(settingId, _setting, "IndexUpdator");
}
private void UpdateSelectedReference()
{
if (SelectedBufferInfo == null)
return;
// 초기화 값이면 리턴
int selectedBufferNo = SelectedBufferInfo.BufferNo;
if (selectedBufferNo == -1)
return;
// 버퍼와 연결된 데이터 UI 하이라이트
foreach (var value in VariableValueList)
value.IsSelectReference = (value.ReferenceBuffer == selectedBufferNo);
CollectionViewSource.GetDefaultView(VariableValueList).Refresh();
}
private void OnBufferStart(object obj)
{
if (_dev == null)
return;
if (obj is BufferInfo info) {
if (info == null || info.BufferNo == -1)
return;
if (MessageUtil.ShowYesNoMessageDialog("실행", "실행하시겠습니까?")) {
_dev.RunBuffer((ProgramBuffer)info.BufferNo, info.Label);
}
}
}
private void OnBufferStop(object obj)
{
if (_dev == null)
return;
if (obj is BufferInfo info) {
if (info == null || info.BufferNo == -1)
return;
if (MessageUtil.ShowYesNoMessageDialog("실행", "실행하시겠습니까?")) {
_dev.StopBuffer((ProgramBuffer)info.BufferNo);
}
}
}
private void OnVariableValueWrite(object obj)
{
if (SelectedVariableValue == null) {
MessageBox.Show("선택된 셀이 없습니다.");
return;
}
if(string.IsNullOrEmpty(WriteText)) {
MessageBox.Show("입력된 Text가 없습니다.");
return;
}
if (!SelectedVariableValue.Authority.Contains("W")) {
MessageBox.Show("쓰기 권한이 없습니다.");
return;
}
if (MessageUtil.ShowYesNoMessageDialog("입력", $"'{WriteText}'을 입력하시겠습니까?")) {
double.TryParse(WriteText, out double write);
_dev.WriteVariable(SelectedVariableValue.VariableValueName, write, ProgramBuffer.ACSC_NONE);
WriteText = string.Empty;
}
}
private void OnMonitoring(object sender, EventArgs e)
{
if (!_dev.IsActivated)
return;
foreach (var item in VariableValueList) {
if(item.VariableValueName == string.Empty)
continue;
item.Value = (int)_dev.ReadVariableInt(item.VariableValueName);
}
}
public void UpdateGlobalParameter(object data)
{
if(data is VariableValue select) {
if (MessageUtil.ShowYesNoMessageDialog("업데이트", $"상태를 업데이트하시겠습니까?")) {
if(select.DataType.Contains("I"))
select.Value = (int)_dev.ReadVariable(select.VariableValueName);
if (select.DataType.Contains("R"))
select.Value = (double)_dev.ReadVariable(select.VariableValueName);
//select.Value = (int)_dev.ReadVariableInt(select.VariableValueName);
CollectionViewSource.GetDefaultView(VariableValueList).Refresh();
}
}
}
private void VisibleChanged(object obj)
{
//bool visible = (bool)obj;
//if (visible) {
// _monitorTimer.Start();
//} else {
// _monitorTimer.Stop();
//}
}
}
}