123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
-
- using HandyControl.Interactivity;
- using HandyControl.Interactivity.Commands;
- using ShakerManger.Data;
- using ShakerManger.ViewModel;
- using SharpCompress.Compressors.Xz;
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Diagnostics;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Input;
- using System.Windows.Media;
- namespace ShakerManger.ViewModel
- {
- internal class ShakersViewModel:Shaker.ViewModel.DisplayViewModel<Shaker.Model.ModelBase>,IMainPageViewModel
- {
- private LayoutViewModel layout = new LayoutViewModel(2, 2);
- public ShakersViewModel()
- {
- }
- public LayoutViewModel Layout
- {
- get => layout;
- set
- {
- UpdateProperty(ref layout, value);
- if (LayoutShakers.Count > 0)
- {
- if (value.ColumnCount == 1 && value.RowCount == 1)
- {
- for(int i=0;i<LayoutShakers.Count;i++)
- {
- LayoutShakers[i].IsMax = i==0;
- }
- }
- else
- {
- for (int i = 0; i < LayoutShakers.Count; i++)
- {
- LayoutShakers[i].IsMax = false;
- }
- }
- }
- }
- }
- protected async override void OnPropertyChanged([CallerMemberName] string propertyName = "")
- {
- base.OnPropertyChanged(propertyName);
- if(propertyName == nameof(IsSelected))
- {
- if (IsSelected)
- {
- await Task.Delay(200);
- }
- foreach (var item in Shakers)
- {
- item.IsSelected = IsSelected;
- }
- }
- }
- public override void Init()
- {
- base.Init();
- var shakers = Sql.Default.Find<Shaker.Model.ShakerControlModel>(x =>!string.IsNullOrEmpty(x.ClientID)).ToList();
- if(shakers ==null || shakers.Count ==0)
- {
- Tools.MessageBoxHelper.Error("没找到可用的振动台信息");
- App.Current.Shutdown();
- return;
- }
- MainWindowViewModel.Default.DataManger.Shakers.Clear();
- MainWindowViewModel.Default.LogManger.Shakers.Clear();
- MainWindowViewModel.Default.LogManger.Shakers.Add(new KeyValuePair<string, string>("全部","All"));
- MainWindowViewModel.Default.LogManger.SelectedShaker = MainWindowViewModel.Default.LogManger.Shakers.First().Value;
- MainWindowViewModel.Default.WarnManger.Shakers.Clear();
- MainWindowViewModel.Default.WarnManger.Shakers.Add(new KeyValuePair<string, string>("全部", "All"));
- MainWindowViewModel.Default.WarnManger.SelectedShaker = MainWindowViewModel.Default.WarnManger.Shakers.First().Value;
- int i = 0;
- shakers.ForEach(x =>
- {
- MainWindowViewModel.Default.DataManger.Shakers.Add(new KeyValuePair<string, string>(x.Description,x.Id));
- MainWindowViewModel.Default.LogManger.Shakers.Add(new KeyValuePair<string, string>(x.Description, x.Id));
- MainWindowViewModel.Default.WarnManger.Shakers.Add(new KeyValuePair<string, string>(x.Description, x.Id));
- Shakers.Add(new ShakerControlViewModel(x,i));
- i++;
- LayoutShakers.Add(Shakers[^1]);
- LayoutShakers[^1].IsVisible = LayoutShakers.Count <= Layout.RowCount * Layout.ColumnCount;
- });
- MainWindowViewModel.Default.SystemConfig.ShakerPage.CurrentShaker = MainWindowViewModel.Default.Shakers.Shakers.First();
- MainWindowViewModel.Default.DataManger.SelectedShaker = MainWindowViewModel.Default.DataManger.Shakers.First().Value;
- }
- public ICommand MaxOrMinCommand => new DelegateCommand<ExCommandParameter>(MaxOrMin);
- [AllowNull]
- private LayoutViewModel lastlayout;
- private void MaxOrMin(ExCommandParameter parameter)
- {
- if(parameter.Parameter is ShakerControlViewModel shaker)
- {
- var tempshaker = Shakers.First(x => x.Model.Id == shaker.Model.Id);
- if(tempshaker.IsMax)
- {
- LayoutShakers.Clear();
- if (tempshakers.Count == 0)
- {
- foreach (var item in Shakers)
- {
- item.IsMax = false;
- item.IsVisible = false;
- LayoutShakers.Add(item);
- }
- }
- else
- {
- tempshakers.ForEach(x =>
- {
- x.IsMax = false;
- x.IsVisible = false;
- LayoutShakers.Add(x);
- });
- }
- if (lastlayout == null) lastlayout = new LayoutViewModel(2, 2);
- MainWindowViewModel.Default.LayoutManger.Selected = MainWindowViewModel.Default.LayoutManger.Layouts.First(x => x.ColumnCount == lastlayout.ColumnCount && x.RowCount == lastlayout.RowCount);
- Layout = MainWindowViewModel.Default.LayoutManger.Selected;
- }
- else
- {
- tempshakers.Clear();
- foreach (var item in LayoutShakers)
- {
- tempshakers.Add(item);
- item.IsVisible = false;
- item.IsMax = false;
- }
- LayoutShakers.Clear();
- tempshaker.IsMax = true;
- tempshaker.IsVisible = true;
- LayoutShakers.Add(tempshaker);
- lastlayout = new LayoutViewModel(Layout.RowCount, Layout.ColumnCount);
- Layout = MainWindowViewModel.Default.LayoutManger.Layouts.First(x => x.ColumnCount == 1 && x.RowCount == 1);
- MainWindowViewModel.Default.LayoutManger.Selected = Layout;
- }
- }
- }
- private List<ShakerControlViewModel> tempshakers = new List<ShakerControlViewModel>();
- private bool isEnabled = true;
- public ICommand AutoLayoutCommand => new DelegateCommand(AutoLayout);
- private void AutoLayout()
- {
- MainWindowViewModel.Default.LayoutManger.Selected = MainWindowViewModel.Default.LayoutManger.Layouts.First(x => x.ColumnCount == 2 && x.RowCount == 2);
- Layout = MainWindowViewModel.Default.LayoutManger.Selected;
- LayoutShakers.Clear();
- foreach (var item in Shakers)
- {
- LayoutShakers.Add(item);
- item.IsVisible = LayoutShakers.Count <= Layout.ColumnCount * Layout.RowCount;
- }
- }
- public ICommand SelectShakerCommand => new DelegateCommand<ExCommandParameter>(SelectShaker);
- private void SelectShaker(ExCommandParameter parameter)
- {
- if (parameter.Parameter is ShakerControlViewModel shaker)
- {
- ShakerSelectInfos.Clear();
- for (int i = 0; i < MainWindowViewModel.Default.Shakers.Shakers.Count; i++)
- {
- var model = MainWindowViewModel.Default.Shakers.Shakers[i].Model;
- ShakerSelectInfos.Add(new ShakerSelectInfoViewModel(i,model.Id)
- {
- Name = model.Description,
- IsEnble = model.Id != shaker.Model.Id,
- });
- if (!ShakerSelectInfos[^1].IsEnble)
- {
- SelectedInfo = ShakerSelectInfos[^1];
- }
- }
- SelectedIsOpen = true;
- }
- }
- public bool SelectedIsOpen { get => selectedIsOpen; set => UpdateProperty(ref selectedIsOpen, value); }
- public ICommand StartCommand => new DelegateCommand(Start);
- public ICommand StopCommand =>new DelegateCommand(Stop);
- public ICommand ResetCommand=>new DelegateCommand(Reset);
- public ICommand GainSwitchCommand => new DelegateCommand<ExCommandParameter>(GainSwitch);
- public ICommand OpenCommand => new DelegateCommand(() =>
- {
- GainSwitch(new ExCommandParameter()
- {
- Parameter = true,
- });
- });
- public ICommand CloseCommand => new DelegateCommand(() =>
- {
- GainSwitch(new ExCommandParameter()
- {
- Parameter = false,
- });
- });
- private void GainSwitch(ExCommandParameter parameter)
- {
- if(parameter.Parameter is bool value)
- {
- if (Shakers.Count(x => x.IsConnected && x.IsDeviceControl) == 0) return;
- foreach (var val in Shakers)
- {
- if (!val.IsConnected || !val.IsDeviceControl) continue;
- val.GainSwitchControlNoResult(value);
- }
- }
- }
- public short Gain
- {
- get => gain;
- set
- {
- UpdateProperty(ref gain, value);
- if (Shakers.Count(x => x.IsConnected && x.IsDeviceControl) == 0) return;
- foreach (var val in Shakers)
- {
- if (!val.IsConnected || !val.IsDeviceControl) continue;
- val.SetGainNoResult(value);
- }
- }
- }
- private async void Start()
- {
- if (MainWindowViewModel.Default.SystemConfig.GPIOControl.Level) return;
- int count = Shakers.Count(x => x.IsConnected && x.IsDeviceControl);
- if (count == 0) return;
- ViewModel.ProgressViewModel.Default.Init();
- ViewModel.ProgressViewModel.Default.Message = "开始启动振动台...";
- ViewModel.ProgressViewModel.Default.IsOpen = true;
- double i = 0;
- string lastid = string.Empty;
- bool iserror = false;
- CancellationTokenSource source = new CancellationTokenSource();
- foreach (var val in Shakers)
- {
- if (!val.IsConnected || !val.IsDeviceControl) continue;
- if (iserror)
- {
- i++;
- ViewModel.ProgressViewModel.Default.Progress = i / count;
- MainWindowViewModel.Default.LogManger.AddLog($"启动{val.Description}流程跳过!",val.Model.Id);
- continue;
- }
- Tools.DispatherInovke.Inovke(() =>
- {
- ProgressViewModel.Default.Message = $"正在启动{val.Description}...";
- i++;
- ViewModel.ProgressViewModel.Default.Progress = i / count;
- });
- MainWindowViewModel.Default.LogManger.AddLog($"{val.Description}开始启动失败",val.Model.Id);
- await val.StartNoResult();
- if (val.ClientID == lastid || string.IsNullOrEmpty(lastid))
- {
- iserror = await WaitStatus(val, source,MainWindowViewModel.Default.SystemConfig.SystemPage.StartShakerTimeOut);
- if (iserror)
- {
- MainWindowViewModel.Default.LogManger.AddLog($"{val.Description}启动失败!",val.Model.Id, Shaker.Model.LogType.Error);
- }
- }
- else
- {
- iserror = false;
- }
- lastid = val.ClientID;
- }
- ViewModel.ProgressViewModel.Default.IsOpen = false;
- }
- private Task<bool> WaitStatus(ShakerControlViewModel shaker,CancellationTokenSource source,uint timeout = 100)
- {
- return Task.Run(async () =>
- {
- DateTime dateTime = DateTime.Now;
- while(!source.IsCancellationRequested)
- {
- if (shaker.CurrentData.OperatingStatus == Shaker.Model.OperatingStatus.Warn) return true;
- if (shaker.StartupCompleted) return false;
- await Task.Delay(50);
- if ((DateTime.Now - dateTime).TotalSeconds >= timeout) return true;
- }
- return true;
- });
- }
- private void Stop()
- {
- if (Shakers.Count(x => x.IsConnected && x.IsDeviceControl) == 0) return;
- foreach (var val in Shakers)
- {
- if (!val.IsConnected || !val.IsDeviceControl) continue;
- val.StopNoResult();
- }
- }
- private void Reset()
- {
- if (Shakers.Count(x => x.IsConnected && x.IsDeviceControl) == 0) return;
- foreach (var val in Shakers)
- {
- if (!val.IsConnected || !val.IsDeviceControl) continue;
- val.ResetNoResult();
- }
- }
- private bool selectedIsOpen = false;
- private ShakerSelectInfoViewModel? selectedInfo = null;
- private short gain = 0;
- public ShakerSelectInfoViewModel? SelectedInfo
- {
- get => selectedInfo;
- set
- {
- if(selectedInfo ==null)
- {
- UpdateProperty(ref selectedInfo, value);
- SelectedIsOpen = false;
- return;
- }
- if(value ==null)
- {
- UpdateProperty(ref selectedInfo, value);
- SelectedIsOpen = false;
- return;
- }
- if (SelectedIsOpen)
- {
- int index = -1;
- for (int i = 0; i < LayoutShakers.Count; i++)
- {
- if (LayoutShakers[i].Model.Id == value.Id)
- {
- index = i;
- break;
- }
- }
- if (index == -1) return;
- var shaker = Shakers[selectedInfo.ShakerIndex];
- var tempshaker = LayoutShakers[index];
- int srcindex = -1;
- for (int i = 0; i < LayoutShakers.Count; i++)
- {
- if (LayoutShakers[i].Name == shaker.Name)
- {
- srcindex = i;
- break;
- }
- }
- LayoutShakers[index] = shaker;
- if (srcindex >= 0)
- {
- LayoutShakers[srcindex] = tempshaker;
- }
- UpdateProperty(ref selectedInfo, value);
- SelectedIsOpen = false;
- }
- }
- }
- public bool IsSelected { get; set; }
- public Data.MainPageType MainPageType => Data.MainPageType.ShakerManger;
- public string IconPath { get; } = (string)App.Current.FindResource("ShakerIcon");
- public override Type View { get; } = (typeof(View.ShakersView));
- public ObservableCollection<ShakerSelectInfoViewModel> ShakerSelectInfos { get; } = new ObservableCollection<ShakerSelectInfoViewModel>();
- /// <summary>
- /// 布局用,根据布局的变化会自动变化
- /// </summary>
- public ObservableCollection<ViewModel.ShakerControlViewModel> LayoutShakers { get; } = new ObservableCollection<ShakerControlViewModel>();
- public ObservableCollection<ViewModel.ShakerControlViewModel> Shakers { get; } = new ObservableCollection<ShakerControlViewModel>();
- public bool IsEnabled { get => isEnabled; set =>UpdateProperty(ref isEnabled, value); }
- }
- }
|