MainViewModel.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. using Avalonia;
  2. using Avalonia.Collections;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.ApplicationLifetimes;
  5. using Avalonia.Controls.Documents;
  6. using Avalonia.Media;
  7. using Avalonia.Threading;
  8. using CommunityToolkit.Mvvm.ComponentModel;
  9. using CommunityToolkit.Mvvm.Input;
  10. using FxpConvert.Common;
  11. using Shaker.Models;
  12. using ShakerApp.Tools;
  13. using ShakerApp.ViewModels;
  14. using SukiUI.Dialogs;
  15. using SukiUI.Toasts;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Linq;
  19. using System.Reflection;
  20. using System.Runtime.CompilerServices;
  21. using System.Threading.Tasks;
  22. using System.Windows.Input;
  23. namespace ShakerApp.ViewModels;
  24. public class MainViewModel : DisplayViewModelBase<IModel>
  25. {
  26. private AvaloniaDictionary<string, Window?> OpenedWindows = new AvaloniaDictionary<string, Window?>();
  27. private bool canDebug = false;
  28. private MainViewModel()
  29. {
  30. #if DEBUG
  31. CanDebug = true;
  32. #else
  33. CanDebug = false;
  34. #endif
  35. GetEvent(ShakerSettingViewModel.LANGUAGECHANGEDEVENT).Subscrip((_, _) =>
  36. {
  37. OnPropertyChanged(nameof(Title));
  38. });
  39. GetEvent(Topic.DisConnect).Subscrip((_, _) =>
  40. {
  41. OnPropertyChanged(nameof(Title));
  42. OnPropertyChanged(nameof(TitleColor));
  43. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.DisConnect)?.Publish(this);
  44. });
  45. CommunicationViewModel.Instance.PropertyChanged += (sender, args) =>
  46. {
  47. switch (args.PropertyName)
  48. {
  49. case nameof(CommunicationViewModel.LocalIsConnect):
  50. OnPropertyChanged(nameof(TitleColor));
  51. OnPropertyChanged(nameof(Title));
  52. break;
  53. }
  54. };
  55. MainPageViewModel.Instance.PropertyChanged += (sender, args) =>
  56. {
  57. switch(args.PropertyName)
  58. {
  59. case nameof(MainPageViewModel.MainPageType):
  60. OnPropertyChanged(nameof(Title));
  61. break;
  62. }
  63. };
  64. this.GetType().Assembly.GetTypes()
  65. .Where(x => x.IsAnsiClass && !x.IsAbstract && x.IsAssignableTo(typeof(ObservableObject)))
  66. .ToList()
  67. .ForEach(x =>
  68. {
  69. var val = x.GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public)
  70. .FirstOrDefault(y => y.PropertyType == x);
  71. val?.GetValue(null);
  72. });
  73. List<(MethodInfo Method, string Key)> infos = this.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
  74. .Where(x => x.GetCustomAttribute<MenuClickAttribute>() != null)
  75. .Select(x =>
  76. {
  77. var att = x.GetCustomAttribute<MenuClickAttribute>();
  78. return (x, att!.Key);
  79. }).ToList();
  80. MenuViewModel.Instance.MenuClick += (menu) =>
  81. {
  82. if (menu == null) return;
  83. infos.FirstOrDefault(x => x.Key == menu.Header).Method?.Invoke(Default, new[] { menu.Header });
  84. };
  85. }
  86. static MainViewModel()
  87. {
  88. }
  89. public Avalonia.Media.IBrush TitleColor => CommunicationViewModel.Instance.LocalIsConnect ? Brushes.Black : Brushes.Black;
  90. public ICommand ExitCommand => new RelayCommand(()=>Exit(""));
  91. [MenuClick("MenuExit")]
  92. private void Exit(string? p)
  93. {
  94. ShowAsk(App.Current?.FindResource("PromptExitMsg")+"",()=>
  95. {
  96. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null);
  97. Environment.Exit(0);
  98. });
  99. }
  100. private string GetTitle()
  101. {
  102. string s = string.Empty;
  103. if(ViewModels.CommunicationViewModel.Instance.LocalIsConnect)
  104. {
  105. if(MainPageViewModel.Instance.MainPageType == MainPageType.StartPage)
  106. {
  107. s = $"{App.Current?.FindResource("Title")}-{ViewModels.DeviceMangerViewModel.Instance.CurrentDevice!.DeviceName}[{CommunicationViewModel.Instance.LocalCommunication.IP}:{CommunicationViewModel.Instance.LocalCommunication.Port}]";
  108. }
  109. else
  110. {
  111. s = $"{App.Current?.FindResource("Title")}-{ViewModels.DeviceMangerViewModel.Instance.CurrentDevice!.DeviceName}-[{App.Current?.FindResource(MainPageViewModel.Instance.MainPageType.Description())}]";
  112. }
  113. }
  114. else
  115. {
  116. s = App.Current?.FindResource("Title") + "-" + App.Current?.FindResource("Offline");
  117. }
  118. return s;
  119. }
  120. public ICommand DataReviewCommand =>new RelayCommand<string>(DataReview);
  121. private async void DataReview(string? p)
  122. {
  123. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  124. {
  125. SelectTestDataViewModel.Instance.InitData();
  126. SelectTestDataViewModel.Instance.Title = p;
  127. BaseDialogWindow window = new BaseDialogWindow();
  128. window.DataContext = SelectTestDataViewModel.Instance;
  129. SelectTestDataViewModel.Instance.CloseWindowAction = () => window?.Close();
  130. await window.ShowDialog(desktop.MainWindow!);
  131. }
  132. }
  133. public ICommand ConnectCommand => new RelayCommand(Connect);
  134. private void Connect()
  135. {
  136. CommunicationViewModel.Instance.Connect(ViewModels.ShakerSettingViewModel.Instance.RemoteIP, ViewModels.ShakerSettingViewModel.Instance.RemotePort);
  137. }
  138. public override string Title => GetTitle();
  139. public bool CanDebug
  140. {
  141. get => canDebug;
  142. set
  143. {
  144. SetProperty(ref canDebug, value);
  145. MenuViewModel.Instance["CanDebug"]!.IsVisible = value;
  146. MenuViewModel.Instance["MenuDebug"]!.IsVisible = value;
  147. }
  148. }
  149. public ICommand SettingCommand => new RelayCommand<string?>(Setting);
  150. private async void Setting(string? p)
  151. {
  152. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  153. {
  154. ShakerSettingViewModel.Instance.InitData();
  155. ShakerSettingViewModel.Instance.Title = p;
  156. BaseDialogWindow window = new BaseDialogWindow();
  157. window.DataContext = ShakerSettingViewModel.Instance;
  158. await window.ShowDialog(desktop.MainWindow!);
  159. }
  160. }
  161. public ICommand DeviceMangerCommand => new RelayCommand<string?>(DeviceManger);
  162. private async void DeviceManger(string? p)
  163. {
  164. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  165. {
  166. DeviceMangerViewModel.Instance.InitData();
  167. DeviceMangerViewModel.Instance.Title = p;
  168. BaseDialogWindow window = new BaseDialogWindow();
  169. window.DataContext = DeviceMangerViewModel.Instance;
  170. DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close();
  171. await window.ShowDialog(desktop.MainWindow!);
  172. }
  173. }
  174. public ICommand SelectTestTypeCommand => new RelayCommand<MainPageType>(SelectTestType);
  175. private void SelectTestType(MainPageType type)
  176. {
  177. MainPageViewModel.Instance.MainPageType = type;
  178. }
  179. public ICommand SaveConfigCommand => new RelayCommand<string?>(SaveConfig);
  180. [MenuClick("MenuSaveConfig")]
  181. private async void SaveConfig(string? p)
  182. {
  183. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  184. {
  185. SaveConfigViewModel.Instance.InitData();
  186. SaveConfigViewModel.Instance.Title = p;
  187. BaseDialogWindow window = new BaseDialogWindow();
  188. window.DataContext = SaveConfigViewModel.Instance;
  189. DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close();
  190. await window.ShowDialog(desktop.MainWindow!);
  191. }
  192. }
  193. public ICommand SignalPreviewCommand=> new RelayCommand<string?>(SignalPreview);
  194. private void SignalPreview(string? p)
  195. {
  196. if (string.IsNullOrEmpty(p)) return;
  197. if (OpenedWindows.TryGetValue(p, out var w))
  198. {
  199. if (w != null && w.IsLoaded)
  200. {
  201. w.Activate();
  202. return;
  203. }
  204. }
  205. SignalPreviewViewModel.Instance.InitData();
  206. SignalPreviewViewModel.Instance.Title = p;
  207. BaseDialogWindow window = new BaseDialogWindow();
  208. window.DataContext = SignalPreviewViewModel.Instance;
  209. OpenedWindows[p] = window;
  210. SignalPreviewViewModel.Instance.CloseWindowAction = () =>
  211. {
  212. window?.Close();
  213. OpenedWindows[p] = null;
  214. };
  215. window.Show();
  216. }
  217. public ICommand LoadConfigCommand => new RelayCommand<string?>(LoadConfig);
  218. [MenuClick("MenuLoadConfig")]
  219. private async void LoadConfig(string? p)
  220. {
  221. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  222. {
  223. LoadConfigViewModel.Instance.InitData();
  224. LoadConfigViewModel.Instance.Title = p;
  225. BaseDialogWindow window = new BaseDialogWindow();
  226. window.DataContext = LoadConfigViewModel.Instance;
  227. DeviceMangerViewModel.Instance.CloseWindowAction = () => window?.Close();
  228. await window.ShowDialog(desktop.MainWindow!);
  229. }
  230. }
  231. public ICommand ShakerConfigCommand => new RelayCommand<string?>(ShakerConfig);
  232. private async void ShakerConfig(string? p)
  233. {
  234. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  235. {
  236. ShakerConfigViewModel.Instance.InitData();
  237. ShakerConfigViewModel.Instance.Title = p;
  238. BaseDialogWindow window = new BaseDialogWindow();
  239. window.DataContext = ShakerConfigViewModel.Instance;
  240. ShakerConfigViewModel.Instance.CloseWindowAction = () => window?.Close();
  241. await window.ShowDialog(desktop.MainWindow!);
  242. }
  243. }
  244. public ICommand OilControlCommand => new RelayCommand<string?>(OilControl);
  245. private void OilControl(string? p)
  246. {
  247. if (string.IsNullOrEmpty(p)) return;
  248. if(OpenedWindows.TryGetValue(p,out var w))
  249. {
  250. if(w!=null && w.IsLoaded)
  251. {
  252. w.Activate();
  253. return;
  254. }
  255. }
  256. OilSourceStatusViewModel.Instance.InitData();
  257. OilSourceStatusViewModel.Instance.Title = p;
  258. BaseDialogWindow window = new BaseDialogWindow();
  259. window.DataContext = OilSourceStatusViewModel.Instance;
  260. OpenedWindows[p] = window;
  261. OilSourceStatusViewModel.Instance.CloseWindowAction = () =>
  262. {
  263. window?.Close();
  264. OpenedWindows[p] = null;
  265. };
  266. window.Show();
  267. }
  268. public ICommand CloseCommand => new RelayCommand(Close);
  269. private void Close()
  270. {
  271. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null);
  272. Environment.Exit(0);
  273. }
  274. public ICommand DebugCommand => new RelayCommand<string?>(Debug);
  275. public async void Debug(string? p)
  276. {
  277. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  278. {
  279. InputPassWordViewModel.Instance.InitData();
  280. BaseDialogWindow window = new BaseDialogWindow();
  281. window.DataContext = InputPassWordViewModel.Instance;
  282. InputPassWordViewModel.Instance.CloseWindowAction = () => window?.Close();
  283. InputPassWordViewModel.Instance.InputAction = (pass) =>
  284. {
  285. window?.Close();
  286. if(pass != "123456")
  287. {
  288. ToastManager.CreateSimpleInfoToast().WithTitle(App.Current?.FindResource("PromptTitle")+"").WithContent(App.Current?.FindResource("PassWordError") + "").Queue();
  289. return;
  290. }
  291. ShowDebug(p);
  292. };
  293. await window.ShowDialog(desktop.MainWindow!);
  294. }
  295. }
  296. private async void ShowDebug(string? p)
  297. {
  298. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  299. {
  300. ShakerControlViewModel.Instance.InitData();
  301. ShakerControlViewModel.Instance.Title = p;
  302. ShakerControlViewModel.Instance.Content = typeof(Views.DebugView);
  303. BaseDialogWindow window = new BaseDialogWindow();
  304. window.DataContext = ShakerControlViewModel.Instance;
  305. ShakerControlViewModel.Instance.CloseWindowAction = () =>
  306. {
  307. window?.Close();
  308. };
  309. await window.ShowDialog(desktop.MainWindow!);
  310. }
  311. }
  312. public ICommand UpbitfileCommand => new RelayCommand<string?>(Upbitfile);
  313. private void Upbitfile(string? p)
  314. {
  315. }
  316. public ICommand SweepConfigCommand => new RelayCommand<string?>(SweepConfig);
  317. private async void SweepConfig(string? p)
  318. {
  319. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  320. {
  321. SweepConfigViewModel.Instance.InitData();
  322. SweepConfigViewModel.Instance.Title = p;
  323. BaseDialogWindow window = new BaseDialogWindow();
  324. window.DataContext = SweepConfigViewModel.Instance;
  325. await window.ShowDialog(desktop.MainWindow!);
  326. }
  327. }
  328. public void InitServiceMsg()
  329. {
  330. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<string>(Topic.SERVICERESULT)?.Subscrip((_, _) => Topic.SERVICERESULT);
  331. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<Shaker.Models.AllConfig>(Shaker.Models.Topic.SYNCCONFIG)?.Subscrip((_, _) =>
  332. {
  333. return new AllConfig()
  334. {
  335. OilSource = OilSourceStatusViewModel.Instance.Model,
  336. RandomConfig = RandomConfigViewModel.Instance.Model,
  337. ShakerConfig = ShakerConfigViewModel.Instance.Model,
  338. ShakerControl = ShakerControlViewModel.Instance.Model,
  339. ShakerStatus = ShakerStatusViewModel.Instance.Model,
  340. SweepConfig = SweepConfigViewModel.Instance.Model,
  341. };
  342. });
  343. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<ShakerConfigModel>()?.Subscrip((sender, args) =>
  344. {
  345. ShakerConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  346. });
  347. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<ShakerControlModel>()?.Subscrip((sender, args) =>
  348. {
  349. ShakerControlViewModel.Instance.ReceiveServiceModel(args.Data);
  350. });
  351. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<SweepConfigModel>()?.Subscrip((sender, args) =>
  352. {
  353. SweepConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  354. });
  355. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<RandomConfigModel>()?.Subscrip((sender, args) =>
  356. {
  357. RandomConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  358. });
  359. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<DeviceInfoModel?>()?.Publish(this, ViewModels.DeviceMangerViewModel.Instance.CurrentDevice?.Model);
  360. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<RandomTestStep>()?.Subscrip((sender, args) =>
  361. {
  362. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<RandomTestStep>()?.Publish(this, args.Data);
  363. });
  364. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<MainPageType>()?.Subscrip((sender, args) =>
  365. {
  366. MainPageViewModel.Instance.MainPageType = args.Data;
  367. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<MainPageType>()?.Publish(this, args.Data);
  368. });
  369. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<MainPageType>()?.Subscrip((sender, args) =>
  370. {
  371. MainPageViewModel.Instance.MainPageType = args.Data;
  372. });
  373. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Shaker.Models.Topic.START)?.Subscrip((_, _) =>
  374. {
  375. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.START)?.Publish(this);
  376. });
  377. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STARTRANDOMTEST)?.Subscrip((_, _) =>
  378. {
  379. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STARTRANDOMTEST)?.Publish(this);
  380. });
  381. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STOP)?.Subscrip((_, _) =>
  382. {
  383. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this);
  384. });
  385. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RISETABLE)?.Subscrip((_, _) =>
  386. {
  387. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RISETABLE)?.Publish(this);
  388. });
  389. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ZEROCHANGE)?.Subscrip((_, e) =>
  390. {
  391. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ZEROCHANGE)?.Publish(this, null, e.Data[0]);
  392. });
  393. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.DROPTABLE)?.Subscrip((_, _) =>
  394. {
  395. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.DROPTABLE)?.Publish(this);
  396. });
  397. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Subscrip((_, _) =>
  398. {
  399. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Publish(this);
  400. });
  401. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.VALVEPOWER)?.Subscrip((_, e) =>
  402. {
  403. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Publish(this, null, e.Data[0]);
  404. });
  405. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STARTSIGNALGEN)?.Subscrip((_, _) =>
  406. {
  407. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STARTSIGNALGEN)?.Publish(this);
  408. });
  409. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RESETERROR)?.Subscrip((_, _) =>
  410. {
  411. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RESETERROR)?.Publish(this);
  412. });
  413. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitPressure)?.Subscrip((sender, args) =>
  414. {
  415. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is float pressure)
  416. {
  417. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitPressure)?.Publish(this, null, index, pressure);
  418. }
  419. });
  420. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitStart)?.Subscrip((sender, args) =>
  421. {
  422. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is bool state)
  423. {
  424. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitStart)?.Publish(this, null, index, state);
  425. }
  426. });
  427. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitLoad)?.Subscrip((sender, args) =>
  428. {
  429. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is bool state)
  430. {
  431. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitLoad)?.Publish(this, null, index, state);
  432. }
  433. });
  434. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerPressure)?.Subscrip((sender, args) =>
  435. {
  436. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  437. {
  438. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerPressure)?.Publish(this, null, pressure);
  439. }
  440. });
  441. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerStart)?.Subscrip((sender, args) =>
  442. {
  443. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  444. {
  445. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerStart)?.Publish(this, null, state);
  446. }
  447. });
  448. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerLoad)?.Subscrip((sender, args) =>
  449. {
  450. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  451. {
  452. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerLoad)?.Publish(this, null, state);
  453. }
  454. });
  455. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantPressure)?.Subscrip((sender, args) =>
  456. {
  457. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  458. {
  459. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantPressure)?.Publish(this, null, pressure);
  460. }
  461. });
  462. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantStart)?.Subscrip((sender, args) =>
  463. {
  464. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  465. {
  466. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantStart)?.Publish(this, null, state);
  467. }
  468. });
  469. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantLoad)?.Subscrip((sender, args) =>
  470. {
  471. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  472. {
  473. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantLoad)?.Publish(this, null, state);
  474. }
  475. });
  476. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculatePressure)?.Subscrip((sender, args) =>
  477. {
  478. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  479. {
  480. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculatePressure)?.Publish(this, null, pressure);
  481. }
  482. });
  483. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculateStart)?.Subscrip((sender, args) =>
  484. {
  485. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  486. {
  487. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateStart)?.Publish(this, null, state);
  488. }
  489. });
  490. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculateLoad)?.Subscrip((sender, args) =>
  491. {
  492. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  493. {
  494. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateLoad)?.Publish(this, null, state);
  495. }
  496. });
  497. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.OilEmergencyStop)?.Subscrip((sender, args) =>
  498. {
  499. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  500. {
  501. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.OilEmergencyStop)?.Publish(this, null, state);
  502. }
  503. });
  504. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RANDOMNEXTLEVEL)?.Subscrip((_, _) =>
  505. {
  506. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RANDOMNEXTLEVEL)?.Publish(this);
  507. });
  508. }
  509. public ICommand RandomConfigCommand => new RelayCommand<string?>(RandomConfig);
  510. private async void RandomConfig(string? p)
  511. {
  512. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  513. {
  514. RandomConfigViewModel.Instance.InitData();
  515. RandomConfigViewModel.Instance.Title = p;
  516. BaseDialogWindow window = new BaseDialogWindow();
  517. window.DataContext = RandomConfigViewModel.Instance;
  518. await window.ShowDialog(desktop.MainWindow!);
  519. }
  520. }
  521. public ICommand AboutCommand => new RelayCommand<string?>(About);
  522. private async void About(string? p)
  523. {
  524. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  525. {
  526. AboutViewModel.Instance.InitData();
  527. AboutViewModel.Instance.Title = p;
  528. BaseDialogWindow window = new BaseDialogWindow();
  529. window.DataContext = AboutViewModel.Instance;
  530. await window.ShowDialog(desktop.MainWindow!);
  531. }
  532. }
  533. public ICommand DisConnectCommand => new RelayCommand(DisConnect);
  534. private void DisConnect()
  535. {
  536. ShowAsk(App.Current?.FindResource("AskDisconnect") + "", () =>
  537. {
  538. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null);
  539. CommunicationViewModel.Instance.DisConnect();
  540. });
  541. }
  542. public ICommand ShakerControlCommand => new RelayCommand<string?>(ShakerControl);
  543. private void ShakerControl(string? p)
  544. {
  545. if (string.IsNullOrEmpty(p)) return;
  546. if (OpenedWindows.TryGetValue(p, out var w))
  547. {
  548. if (w != null && w.IsLoaded)
  549. {
  550. w.Activate();
  551. return;
  552. }
  553. }
  554. ShakerStatusViewModel.Instance.InitData();
  555. ShakerStatusViewModel.Instance.Title = p;
  556. BaseDialogWindow window = new BaseDialogWindow();
  557. window.DataContext = ShakerStatusViewModel.Instance;
  558. OpenedWindows[p] = window;
  559. ShakerStatusViewModel.Instance.CloseWindowAction = () =>
  560. {
  561. window?.Close();
  562. OpenedWindows[p] = null;
  563. };
  564. window.Show();
  565. }
  566. public ICommand LogCommand =>new RelayCommand<string?>(Log);
  567. private async void Log(string? p)
  568. {
  569. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  570. {
  571. LogViewModel.Instance.InitData();
  572. LogViewModel.Instance.Title = p;
  573. BaseDialogWindow window = new BaseDialogWindow();
  574. window.DataContext = LogViewModel.Instance;
  575. await window.ShowDialog(desktop.MainWindow!);
  576. }
  577. }
  578. public void SyncConfig()
  579. {
  580. LogViewModel.Instance.AddLog($"同步控制器设置参数");
  581. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<DeviceInfoModel?>()?.Subscrip((sender, args) =>
  582. {
  583. if (args.Data == null)
  584. {
  585. DeviceMangerViewModel.Instance.CurrentDevice = null;
  586. }
  587. else
  588. {
  589. if (DeviceMangerViewModel.Instance.CurrentDevice == null) DeviceMangerViewModel.Instance.CurrentDevice = new DeviceInfoViewModel();
  590. DeviceMangerViewModel.Instance.CurrentDevice.UpDateModel(args.Data);
  591. }
  592. });
  593. var config= CommunicationViewModel.Instance.LocalCommunication?.GetEvent<Shaker.Models.AllConfig>(Shaker.Models.Topic.SYNCCONFIG)?.Publish(this);
  594. if(config ==null)
  595. {
  596. LogViewModel.Instance.AddLog($"同步控制器设置参数失败", LogType.Error);
  597. base.ToastManager.CreateSimpleInfoToast()
  598. .WithTitle(App.Current?.FindResource("PromptTitle") + "")
  599. .WithContent(App.Current?.FindResource("GetConfigError")+"")
  600. .Queue();
  601. CommunicationViewModel.Instance.LocalCommunication?.Close();
  602. return;
  603. }
  604. LogViewModel.Instance.AddLog($"同步控制器设置参数成功");
  605. GetEvent<AllConfig>().Publish(this, config);
  606. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<AllConfig>(Topic.SYNCCONFIG)?.Publish(this,null, config);
  607. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.START)?.Publish(this);
  608. OnPropertyChanged(nameof(Title));
  609. OnPropertyChanged(nameof(TitleColor));
  610. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<DeviceInfoModel?>()?.Publish(this, DeviceMangerViewModel.Instance.CurrentDevice?.Model);
  611. }
  612. public static MainViewModel Default { get; } = new MainViewModel();
  613. public ICommand ChannelSettingCommand => new RelayCommand<string>(ChannelSetting);
  614. private async void ChannelSetting(string? p)
  615. {
  616. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  617. {
  618. ShakerChannelViewModel.Instance.InitData();
  619. ShakerChannelViewModel.Instance.Title = p;
  620. BaseDialogWindow window = new BaseDialogWindow();
  621. window.DataContext = ShakerChannelViewModel.Instance;
  622. await window.ShowDialog(desktop.MainWindow!);
  623. }
  624. }
  625. }