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 BufferInfoList { get => _BufferInfoList; set => SetProperty(ref _BufferInfoList, value); } private ObservableCollection _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(); //} } } }