MainViewModel.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  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 unsafe 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. OilSourceConfig = OilSourceConfigViewModel.Instance.Model,
  342. };
  343. });
  344. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<ShakerConfigModel>()?.Subscrip((sender, args) =>
  345. {
  346. ShakerConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  347. });
  348. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<ShakerControlModel>()?.Subscrip((sender, args) =>
  349. {
  350. ShakerControlViewModel.Instance.ReceiveServiceModel(args.Data);
  351. });
  352. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<SweepConfigModel>()?.Subscrip((sender, args) =>
  353. {
  354. SweepConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  355. });
  356. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<RandomConfigModel>()?.Subscrip((sender, args) =>
  357. {
  358. RandomConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  359. });
  360. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<OilSourceConfigModel>()?.Subscrip((sender, args) =>
  361. {
  362. OilSourceConfigViewModel.Instance.ReceiveServiceModel(args.Data);
  363. });
  364. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<DeviceInfoModel?>()?.Publish(this, ViewModels.DeviceMangerViewModel.Instance.CurrentDevice?.Model);
  365. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<RandomTestStep>()?.Subscrip((sender, args) =>
  366. {
  367. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<RandomTestStep>()?.Publish(this, args.Data);
  368. });
  369. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<MainPageType>()?.Subscrip((sender, args) =>
  370. {
  371. MainPageViewModel.Instance.MainPageType = args.Data;
  372. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<MainPageType>()?.Publish(this, args.Data);
  373. });
  374. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<MainPageType>()?.Subscrip((sender, args) =>
  375. {
  376. MainPageViewModel.Instance.MainPageType = args.Data;
  377. });
  378. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Shaker.Models.Topic.START)?.Subscrip((_, _) =>
  379. {
  380. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.START)?.Publish(this);
  381. });
  382. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STARTRANDOMTEST)?.Subscrip((_, _) =>
  383. {
  384. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STARTRANDOMTEST)?.Publish(this);
  385. });
  386. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STOP)?.Subscrip((_, _) =>
  387. {
  388. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this);
  389. });
  390. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RISETABLE)?.Subscrip((_, _) =>
  391. {
  392. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RISETABLE)?.Publish(this);
  393. });
  394. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ZEROCHANGE)?.Subscrip((_, e) =>
  395. {
  396. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ZEROCHANGE)?.Publish(this, null, e.Data[0]);
  397. });
  398. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.DROPTABLE)?.Subscrip((_, _) =>
  399. {
  400. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.DROPTABLE)?.Publish(this);
  401. });
  402. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Subscrip((_, _) =>
  403. {
  404. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Publish(this);
  405. });
  406. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.VALVEPOWER)?.Subscrip((_, e) =>
  407. {
  408. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOPSIGNALGEN)?.Publish(this, null, e.Data[0]);
  409. });
  410. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.STARTSIGNALGEN)?.Subscrip((_, _) =>
  411. {
  412. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STARTSIGNALGEN)?.Publish(this);
  413. });
  414. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RESETERROR)?.Subscrip((_, _) =>
  415. {
  416. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RESETERROR)?.Publish(this);
  417. });
  418. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitPressure)?.Subscrip((sender, args) =>
  419. {
  420. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is float pressure)
  421. {
  422. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitPressure)?.Publish(this, null, index, pressure);
  423. }
  424. });
  425. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitStart)?.Subscrip((sender, args) =>
  426. {
  427. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is bool state)
  428. {
  429. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitStart)?.Publish(this, null, index, state);
  430. }
  431. });
  432. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CircuitLoad)?.Subscrip((sender, args) =>
  433. {
  434. if (args.Data.Length >= 2 && args.Data[0] is int index && args.Data[1] is bool state)
  435. {
  436. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CircuitLoad)?.Publish(this, null, index, state);
  437. }
  438. });
  439. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerPressure)?.Subscrip((sender, args) =>
  440. {
  441. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  442. {
  443. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerPressure)?.Publish(this, null, pressure);
  444. }
  445. });
  446. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerStart)?.Subscrip((sender, args) =>
  447. {
  448. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  449. {
  450. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerStart)?.Publish(this, null, state);
  451. }
  452. });
  453. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.ForerunnerLoad)?.Subscrip((sender, args) =>
  454. {
  455. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  456. {
  457. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.ForerunnerLoad)?.Publish(this, null, state);
  458. }
  459. });
  460. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantPressure)?.Subscrip((sender, args) =>
  461. {
  462. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  463. {
  464. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantPressure)?.Publish(this, null, pressure);
  465. }
  466. });
  467. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantStart)?.Subscrip((sender, args) =>
  468. {
  469. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  470. {
  471. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantStart)?.Publish(this, null, state);
  472. }
  473. });
  474. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.AssistantLoad)?.Subscrip((sender, args) =>
  475. {
  476. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  477. {
  478. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.AssistantLoad)?.Publish(this, null, state);
  479. }
  480. });
  481. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculatePressure)?.Subscrip((sender, args) =>
  482. {
  483. if (args.Data.Length >= 1 && args.Data[0] is float pressure)
  484. {
  485. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculatePressure)?.Publish(this, null, pressure);
  486. }
  487. });
  488. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculateStart)?.Subscrip((sender, args) =>
  489. {
  490. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  491. {
  492. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateStart)?.Publish(this, null, state);
  493. }
  494. });
  495. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.CirculateLoad)?.Subscrip((sender, args) =>
  496. {
  497. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  498. {
  499. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.CirculateLoad)?.Publish(this, null, state);
  500. }
  501. });
  502. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.OilEmergencyStop)?.Subscrip((sender, args) =>
  503. {
  504. if (args.Data.Length >= 1 && args.Data[0] is bool state)
  505. {
  506. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.OilEmergencyStop)?.Publish(this, null, state);
  507. }
  508. });
  509. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent(Topic.RANDOMNEXTLEVEL)?.Subscrip((_, _) =>
  510. {
  511. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.RANDOMNEXTLEVEL)?.Publish(this);
  512. });
  513. }
  514. public ICommand RandomConfigCommand => new RelayCommand<string?>(RandomConfig);
  515. private async void RandomConfig(string? p)
  516. {
  517. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  518. {
  519. RandomConfigViewModel.Instance.InitData();
  520. RandomConfigViewModel.Instance.Title = p;
  521. BaseDialogWindow window = new BaseDialogWindow();
  522. window.DataContext = RandomConfigViewModel.Instance;
  523. await window.ShowDialog(desktop.MainWindow!);
  524. }
  525. }
  526. public ICommand AboutCommand => new RelayCommand<string?>(About);
  527. private async void About(string? p)
  528. {
  529. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  530. {
  531. AboutViewModel.Instance.InitData();
  532. AboutViewModel.Instance.Title = p;
  533. BaseDialogWindow window = new BaseDialogWindow();
  534. window.DataContext = AboutViewModel.Instance;
  535. await window.ShowDialog(desktop.MainWindow!);
  536. }
  537. }
  538. public ICommand DisConnectCommand => new RelayCommand(DisConnect);
  539. private void DisConnect()
  540. {
  541. ShowAsk(App.Current?.FindResource("AskDisconnect") + "", () =>
  542. {
  543. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.STOP)?.Publish(this, null);
  544. CommunicationViewModel.Instance.DisConnect();
  545. });
  546. }
  547. public ICommand ShakerControlCommand => new RelayCommand<string?>(ShakerControl);
  548. private void ShakerControl(string? p)
  549. {
  550. if (string.IsNullOrEmpty(p)) return;
  551. if (OpenedWindows.TryGetValue(p, out var w))
  552. {
  553. if (w != null && w.IsLoaded)
  554. {
  555. w.Activate();
  556. return;
  557. }
  558. }
  559. ShakerStatusViewModel.Instance.InitData();
  560. ShakerStatusViewModel.Instance.Title = p;
  561. BaseDialogWindow window = new BaseDialogWindow();
  562. window.DataContext = ShakerStatusViewModel.Instance;
  563. OpenedWindows[p] = window;
  564. ShakerStatusViewModel.Instance.CloseWindowAction = () =>
  565. {
  566. window?.Close();
  567. OpenedWindows[p] = null;
  568. };
  569. window.Show();
  570. }
  571. public ICommand LogCommand =>new RelayCommand<string?>(Log);
  572. private async void Log(string? p)
  573. {
  574. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  575. {
  576. LogViewModel.Instance.InitData();
  577. LogViewModel.Instance.Title = p;
  578. BaseDialogWindow window = new BaseDialogWindow();
  579. window.DataContext = LogViewModel.Instance;
  580. await window.ShowDialog(desktop.MainWindow!);
  581. }
  582. }
  583. public void SyncConfig()
  584. {
  585. LogViewModel.Instance.AddLog($"同步控制器设置参数");
  586. CommunicationViewModel.Instance.LocalCommunication?.GetEvent<DeviceInfoModel?>()?.Subscrip((sender, args) =>
  587. {
  588. if (args.Data == null)
  589. {
  590. DeviceMangerViewModel.Instance.CurrentDevice = null;
  591. }
  592. else
  593. {
  594. if (DeviceMangerViewModel.Instance.CurrentDevice == null) DeviceMangerViewModel.Instance.CurrentDevice = new DeviceInfoViewModel();
  595. DeviceMangerViewModel.Instance.CurrentDevice.UpDateModel(args.Data);
  596. }
  597. });
  598. var config= CommunicationViewModel.Instance.LocalCommunication?.GetEvent<Shaker.Models.AllConfig>(Shaker.Models.Topic.SYNCCONFIG)?.Publish(this);
  599. if(config ==null)
  600. {
  601. LogViewModel.Instance.AddLog($"同步控制器设置参数失败", LogType.Error);
  602. base.ToastManager.CreateSimpleInfoToast()
  603. .WithTitle(App.Current?.FindResource("PromptTitle") + "")
  604. .WithContent(App.Current?.FindResource("GetConfigError")+"")
  605. .Queue();
  606. CommunicationViewModel.Instance.LocalCommunication?.Close();
  607. return;
  608. }
  609. LogViewModel.Instance.AddLog($"同步控制器设置参数成功");
  610. GetEvent<AllConfig>().Publish(this, config);
  611. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<AllConfig>(Topic.SYNCCONFIG)?.Publish(this,null, config);
  612. CommunicationViewModel.Instance.LocalCommunication?.GetEvent(Topic.START)?.Publish(this);
  613. OnPropertyChanged(nameof(Title));
  614. OnPropertyChanged(nameof(TitleColor));
  615. CommunicationViewModel.Instance.ServiceCommunication?.GetEvent<DeviceInfoModel?>()?.Publish(this, DeviceMangerViewModel.Instance.CurrentDevice?.Model);
  616. }
  617. public static MainViewModel Default { get; } = new MainViewModel();
  618. public ICommand ChannelSettingCommand => new RelayCommand<string>(ChannelSetting);
  619. private async void ChannelSetting(string? p)
  620. {
  621. if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && !string.IsNullOrEmpty(p))
  622. {
  623. ShakerChannelViewModel.Instance.InitData();
  624. ShakerChannelViewModel.Instance.Title = p;
  625. BaseDialogWindow window = new BaseDialogWindow();
  626. window.DataContext = ShakerChannelViewModel.Instance;
  627. await window.ShowDialog(desktop.MainWindow!);
  628. }
  629. }
  630. }