MinerProfileViewModel.cs 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. using NTMiner.Core;
  2. using NTMiner.Core.Kernels;
  3. using NTMiner.Core.Profile;
  4. using NTMiner.MinerStudio.Vms;
  5. using NTMiner.Ws;
  6. using System;
  7. using System.Diagnostics;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text.RegularExpressions;
  11. using System.Windows;
  12. using System.Windows.Input;
  13. namespace NTMiner.Vms {
  14. public class MinerProfileViewModel : ViewModelBase, IMinerProfile, IWsStateViewModel {
  15. public static MinerProfileViewModel Instance { get; private set; } = new MinerProfileViewModel();
  16. private readonly string _linkFileFullName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "开源矿工.lnk");
  17. private string _argsAssembly;
  18. private bool _isMining = NTMinerContext.Instance.IsMining;
  19. private bool _isWsOnline;
  20. private string _wsDescription;
  21. private int _wsNextTrySecondsDelay;
  22. private DateTime _wsLastTryOn;
  23. private bool _isConnecting;
  24. private double _wsRetryIconAngle;
  25. private string _wsServerIp;
  26. public ICommand Up { get; private set; }
  27. public ICommand Down { get; private set; }
  28. public ICommand WsRetry { get; private set; }
  29. public ICommand CopyArgsAssembly { get; private set; }
  30. public MinerProfileViewModel() {
  31. if (WpfUtil.IsInDesignMode) {
  32. return;
  33. }
  34. if (Instance != null) {
  35. throw new InvalidProgramException();
  36. }
  37. if (this.IsCreateShortcut) {
  38. CreateShortcut();
  39. }
  40. this.Up = new DelegateCommand<string>(propertyName => {
  41. WpfUtil.Up(this, propertyName);
  42. });
  43. this.Down = new DelegateCommand<string>(propertyName => {
  44. WpfUtil.Down(this, propertyName);
  45. });
  46. this.WsRetry = new DelegateCommand(() => {
  47. RpcRoot.Client.NTMinerDaemonService.StartOrStopWsAsync(isResetFailCount: true);
  48. IsConnecting = true;
  49. });
  50. string GetRowArgsAssembly(){
  51. string argsAssembly = this.ArgsAssembly ?? "无";
  52. if (argsAssembly.Contains("{logfile}")) {
  53. argsAssembly = Regex.Replace(argsAssembly, "\\s\\S+\\s\"\\{logfile\\}\"", string.Empty);
  54. }
  55. return argsAssembly.Trim();
  56. }
  57. this.CopyArgsAssembly = new DelegateCommand(() => {
  58. string argsAssembly = GetRowArgsAssembly();
  59. Clipboard.SetDataObject(argsAssembly, true);
  60. VirtualRoot.Out.ShowSuccess("命令行", header: "复制成功");
  61. });
  62. if (ClientAppType.IsMinerClient) {
  63. if (this.IsSystemName) {
  64. this.MinerName = NTKeyword.GetSafeMinerName(NTMinerContext.ThisPcName);
  65. }
  66. VirtualRoot.BuildCmdPath<SetAutoStartCommand>(message => {
  67. this.IsAutoStart = message.IsAutoStart;
  68. this.IsAutoBoot = message.IsAutoBoot;
  69. }, this.GetType(), LogEnum.None);
  70. VirtualRoot.BuildEventPath<StartingMineFailedEvent>("开始挖矿失败", LogEnum.DevConsole,
  71. path: message => {
  72. IsMining = false;
  73. NTMinerConsole.UserError(message.Message);
  74. }, location: this.GetType());
  75. // 群控客户端已经有一个执行RefreshWsStateCommand命令的路径了
  76. VirtualRoot.BuildCmdPath<RefreshWsStateCommand>(message => {
  77. #region
  78. if (message.WsClientState != null) {
  79. this.WsServerIp = message.WsClientState.WsServerIp;
  80. this.IsWsOnline = message.WsClientState.Status == WsClientStatus.Open;
  81. if (message.WsClientState.ToOut) {
  82. VirtualRoot.Out.ShowWarn(message.WsClientState.Description, autoHideSeconds: 3);
  83. }
  84. if (!message.WsClientState.ToOut || !this.IsWsOnline) {
  85. this.WsDescription = message.WsClientState.Description;
  86. }
  87. if (!this.IsWsOnline) {
  88. if (message.WsClientState.LastTryOn != DateTime.MinValue) {
  89. this.WsLastTryOn = message.WsClientState.LastTryOn;
  90. }
  91. if (message.WsClientState.NextTrySecondsDelay > 0) {
  92. WsNextTrySecondsDelay = message.WsClientState.NextTrySecondsDelay;
  93. }
  94. }
  95. }
  96. #endregion
  97. }, this.GetType(), LogEnum.DevConsole);
  98. VirtualRoot.BuildEventPath<Per1SecondEvent>("外网群控重试秒表倒计时", LogEnum.None, path: message => {
  99. if (IsOuterUserEnabled && !IsWsOnline) {
  100. if (WsNextTrySecondsDelay > 0) {
  101. WsNextTrySecondsDelay--;
  102. }
  103. else if (WsLastTryOn == DateTime.MinValue) {
  104. this.RefreshWsDaemonState();
  105. }
  106. OnPropertyChanged(nameof(WsLastTryOnText));
  107. }
  108. }, this.GetType());
  109. VirtualRoot.BuildEventPath<WsServerOkEvent>("服务器Ws服务已可用", LogEnum.DevConsole, path: message => {
  110. if (IsOuterUserEnabled && !IsWsOnline) {
  111. StartOrStopWs();
  112. }
  113. }, this.GetType());
  114. }
  115. NTMinerContext.SetRefreshArgsAssembly((reason) => {
  116. NTMinerConsole.DevDebug(() => $"RefreshArgsAssembly" + reason, ConsoleColor.Cyan);
  117. #region 确保双挖权重在合法的范围内
  118. if (CoinVm != null && CoinVm.CoinKernel != null && CoinVm.CoinKernel.Kernel != null) {
  119. var coinKernelProfile = CoinVm.CoinKernel.CoinKernelProfile;
  120. var kernelInput = CoinVm.CoinKernel.Kernel.KernelInputVm;
  121. if (coinKernelProfile != null && kernelInput != null) {
  122. if (coinKernelProfile.IsDualCoinEnabled && !kernelInput.IsAutoDualWeight) {
  123. if (coinKernelProfile.DualCoinWeight > kernelInput.DualWeightMax) {
  124. coinKernelProfile.DualCoinWeight = kernelInput.DualWeightMax;
  125. }
  126. else if (coinKernelProfile.DualCoinWeight < kernelInput.DualWeightMin) {
  127. coinKernelProfile.DualCoinWeight = kernelInput.DualWeightMin;
  128. }
  129. NTMinerContext.Instance.MinerProfile.SetCoinKernelProfileProperty(coinKernelProfile.CoinKernelId, nameof(coinKernelProfile.DualCoinWeight), coinKernelProfile.DualCoinWeight);
  130. }
  131. }
  132. }
  133. #endregion
  134. NTMinerContext.Instance.CurrentMineContext = NTMinerContext.Instance.CreateMineContext();
  135. if (NTMinerContext.Instance.CurrentMineContext != null) {
  136. this.ArgsAssembly = NTMinerContext.Instance.CurrentMineContext.CommandLine;
  137. }
  138. else {
  139. this.ArgsAssembly = string.Empty;
  140. }
  141. });
  142. AppRoot.BuildEventPath<AutoBootStartRefreshedEvent>("刷新开机启动和自动挖矿的展示", LogEnum.DevConsole,
  143. path: message => {
  144. this.OnPropertyChanged(nameof(IsAutoBoot));
  145. this.OnPropertyChanged(nameof(IsAutoStart));
  146. }, location: this.GetType());
  147. AppRoot.BuildEventPath<MinerProfilePropertyChangedEvent>("MinerProfile设置变更后刷新VM内存", LogEnum.DevConsole,
  148. path: message => {
  149. OnPropertyChanged(message.PropertyName);
  150. }, location: this.GetType());
  151. VirtualRoot.BuildEventPath<LocalContextReInitedEventHandledEvent>("本地上下文视图模型集刷新后刷新界面", LogEnum.DevConsole,
  152. path: message => {
  153. AllPropertyChanged();
  154. if (CoinVm != null) {
  155. CoinVm.OnPropertyChanged(nameof(CoinVm.Wallets));
  156. CoinVm.CoinKernel?.CoinKernelProfile.SelectedDualCoin?.OnPropertyChanged(nameof(CoinVm.Wallets));
  157. CoinVm.CoinProfile?.OnPropertyChanged(nameof(CoinVm.CoinProfile.SelectedWallet));
  158. CoinVm.CoinKernel?.CoinKernelProfile.SelectedDualCoin?.CoinProfile?.OnPropertyChanged(nameof(CoinVm.CoinProfile.SelectedDualCoinWallet));
  159. }
  160. }, location: this.GetType());
  161. VirtualRoot.BuildEventPath<CoinVmAddedEvent>("Vm集添加了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, path: message => {
  162. OnPropertyChanged(nameof(CoinVm));
  163. }, this.GetType());
  164. VirtualRoot.BuildEventPath<CoinVmRemovedEvent>("Vm集删除了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, path: message => {
  165. OnPropertyChanged(nameof(CoinVm));
  166. }, this.GetType());
  167. }
  168. public void RefreshWsDaemonState() {
  169. RpcRoot.Client.NTMinerDaemonService.GetWsDaemonStateAsync((WsClientState state, Exception e) => {
  170. if (state != null) {
  171. this.WsDescription = state.Description;
  172. this.WsServerIp = state.WsServerIp;
  173. this.IsWsOnline = state.Status == WsClientStatus.Open;
  174. if (state.NextTrySecondsDelay > 0) {
  175. this.WsNextTrySecondsDelay = state.NextTrySecondsDelay;
  176. }
  177. this.WsLastTryOn = state.LastTryOn;
  178. }
  179. });
  180. }
  181. #region IWsStateViewModel的成员
  182. // 由守护进程根据外网群控是否正常更新
  183. public bool IsWsOnline {
  184. get => _isWsOnline;
  185. set {
  186. if (_isWsOnline != value) {
  187. _isWsOnline = value;
  188. OnPropertyChanged(nameof(IsWsOnline));
  189. OnPropertyChanged(nameof(WsStateText));
  190. OnPropertyChanged(nameof(WsNextTrySecondsDelayVisible));
  191. }
  192. }
  193. }
  194. public string WsDescription {
  195. get {
  196. if (!IsOuterUserEnabled) {
  197. return "未启用";
  198. }
  199. if (string.IsNullOrEmpty(OuterUserId)) {
  200. return "未填写用户";
  201. }
  202. if (string.IsNullOrEmpty(_wsDescription)) {
  203. return WsStateText;
  204. }
  205. return _wsDescription;
  206. }
  207. set {
  208. if (_wsDescription != value) {
  209. _wsDescription = value;
  210. OnPropertyChanged(nameof(WsDescription));
  211. }
  212. }
  213. }
  214. public string WsServerIp {
  215. get => _wsServerIp;
  216. set {
  217. _wsServerIp = value;
  218. OnPropertyChanged(nameof(WsServerIp));
  219. }
  220. }
  221. public int WsNextTrySecondsDelay {
  222. get {
  223. if (_wsNextTrySecondsDelay < 0) {
  224. return 0;
  225. }
  226. return _wsNextTrySecondsDelay;
  227. }
  228. set {
  229. if (_wsNextTrySecondsDelay != value) {
  230. _wsNextTrySecondsDelay = value;
  231. OnPropertyChanged(nameof(WsNextTrySecondsDelay));
  232. OnPropertyChanged(nameof(WsNextTrySecondsDelayText));
  233. OnPropertyChanged(nameof(WsNextTrySecondsDelayVisible));
  234. IsConnecting = value <= 0;
  235. }
  236. }
  237. }
  238. public DateTime WsLastTryOn {
  239. get => _wsLastTryOn;
  240. set {
  241. if (_wsLastTryOn != value) {
  242. _wsLastTryOn = value;
  243. OnPropertyChanged(nameof(WsLastTryOn));
  244. OnPropertyChanged(nameof(WsLastTryOnText));
  245. }
  246. }
  247. }
  248. public bool IsConnecting {
  249. get => _isConnecting;
  250. set {
  251. if (_isConnecting != value) {
  252. _isConnecting = value;
  253. OnPropertyChanged(nameof(IsConnecting));
  254. OnPropertyChanged(nameof(WsRetryText));
  255. if (value) {
  256. VirtualRoot.SetInterval(TimeSpan.FromMilliseconds(100), perCallback: () => {
  257. WsRetryIconAngle += 40;
  258. }, stopCallback: () => {
  259. WsRetryIconAngle = 0;
  260. IsConnecting = false;
  261. }, timeout: TimeSpan.FromSeconds(10), requestStop: () => {
  262. return !IsConnecting;
  263. });
  264. }
  265. }
  266. }
  267. }
  268. #endregion
  269. public double WsRetryIconAngle {
  270. get { return _wsRetryIconAngle; }
  271. set {
  272. _wsRetryIconAngle = value;
  273. OnPropertyChanged(nameof(WsRetryIconAngle));
  274. }
  275. }
  276. public string WsRetryText {
  277. get {
  278. if (IsConnecting) {
  279. return "重试中";
  280. }
  281. return "立即重试";
  282. }
  283. }
  284. public string WsLastTryOnText {
  285. get {
  286. if (IsWsOnline || WsLastTryOn == DateTime.MinValue) {
  287. return string.Empty;
  288. }
  289. return Timestamp.GetTimeSpanBeforeText(WsLastTryOn);
  290. }
  291. }
  292. public string WsNextTrySecondsDelayText {
  293. get {
  294. int seconds = WsNextTrySecondsDelay;
  295. if (!IsOuterUserEnabled || IsWsOnline) {
  296. return string.Empty;
  297. }
  298. return Timestamp.GetTimeSpanAfterText(seconds);
  299. }
  300. }
  301. public Visibility WsNextTrySecondsDelayVisible {
  302. get {
  303. if (!IsOuterUserEnabled || IsWsOnline) {
  304. return Visibility.Collapsed;
  305. }
  306. return Visibility.Visible;
  307. }
  308. }
  309. public string WsStateText {
  310. get {
  311. if (IsWsOnline) {
  312. return $"连接服务器成功 {WsServerIp}";
  313. }
  314. return $"离线 {WsServerIp}";
  315. }
  316. }
  317. public bool IsOuterUserEnabled {
  318. get => NTMinerContext.Instance.MinerProfile.IsOuterUserEnabled;
  319. set {
  320. if (NTMinerContext.Instance.MinerProfile.IsOuterUserEnabled != value) {
  321. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsOuterUserEnabled), value);
  322. OnPropertyChanged(nameof(IsOuterUserEnabled));
  323. OnPropertyChanged(nameof(WsNextTrySecondsDelayVisible));
  324. StartOrStopWs();
  325. }
  326. }
  327. }
  328. public string OuterUserId {
  329. get => NTMinerContext.Instance.MinerProfile.OuterUserId;
  330. set {
  331. if (NTMinerContext.Instance.MinerProfile.OuterUserId != value) {
  332. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(OuterUserId), value);
  333. OnPropertyChanged(nameof(OuterUserId));
  334. OnPropertyChanged(nameof(OuterUserText));
  335. StartOrStopWs();
  336. }
  337. }
  338. }
  339. public string OuterUserText {
  340. get {
  341. if (string.IsNullOrEmpty(OuterUserId)) {
  342. return "群控";
  343. }
  344. return OuterUserId;
  345. }
  346. }
  347. private void StartOrStopWs() {
  348. // 只要外网启用状态变更或用户变更就调用,不管是启用还是禁用也不管用户是否正确是否为空都要调用
  349. // 未启用时以及不正确的用户时调用是为了通知守护进程关闭连接
  350. RpcRoot.Client.NTMinerDaemonService.StartOrStopWsAsync(isResetFailCount: false);
  351. }
  352. // 是否主矿池和备矿池都是用户名密码模式的矿池
  353. public bool IsAllMainCoinPoolIsUserMode {
  354. get {
  355. if (CoinVm == null || CoinVm.CoinProfile == null) {
  356. return false;
  357. }
  358. var mainCoinPool = CoinVm.CoinProfile.MainCoinPool;
  359. if (mainCoinPool == null) {
  360. return false;
  361. }
  362. if (mainCoinPool.NoPool1) {
  363. return true;
  364. }
  365. if (CoinVm.CoinKernel.IsSupportPool1) {
  366. var mainCoinPool1 = CoinVm.CoinProfile.MainCoinPool1;
  367. if (mainCoinPool1 == null) {
  368. return mainCoinPool.IsUserMode;
  369. }
  370. return mainCoinPool.IsUserMode && mainCoinPool1.IsUserMode;
  371. }
  372. return mainCoinPool.IsUserMode;
  373. }
  374. }
  375. public IMineWork MineWork {
  376. get {
  377. return NTMinerContext.Instance.MinerProfile.MineWork;
  378. }
  379. }
  380. public bool IsFreeClient {
  381. get {
  382. return MineWork == null || ClientAppType.IsMinerStudio;
  383. }
  384. }
  385. public Guid Id {
  386. get { return NTMinerContext.Instance.MinerProfile.GetId(); }
  387. }
  388. public Guid GetId() {
  389. return this.Id;
  390. }
  391. public string MinerName {
  392. get {
  393. string minerName = NTMinerContext.Instance.MinerProfile.MinerName;
  394. return minerName;
  395. }
  396. set {
  397. if (NTMinerContext.Instance.MinerProfile.MinerName != value) {
  398. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(MinerName), value);
  399. NTMinerContext.RefreshArgsAssembly.Invoke("MinerProfile上放置的挖矿矿机名发生了变更");
  400. OnPropertyChanged(nameof(MinerName));
  401. }
  402. }
  403. }
  404. public bool IsSystemName {
  405. get { return NTMinerContext.Instance.MinerProfile.IsSystemName; }
  406. set {
  407. if (IsMining) {
  408. VirtualRoot.Out.ShowWarn("请先停止挖矿", header: "提示", autoHideSeconds: 3);
  409. return;
  410. }
  411. if (NTMinerContext.Instance.MinerProfile.IsSystemName != value) {
  412. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsSystemName), value);
  413. OnPropertyChanged(nameof(IsSystemName));
  414. }
  415. if (value) {
  416. this.MinerName = NTMinerContext.ThisPcName;
  417. }
  418. }
  419. }
  420. public bool IsShowInTaskbar {
  421. get => NTMinerContext.Instance.MinerProfile.IsShowInTaskbar;
  422. set {
  423. if (NTMinerContext.Instance.MinerProfile.IsShowInTaskbar != value) {
  424. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsShowInTaskbar), value);
  425. OnPropertyChanged(nameof(IsShowInTaskbar));
  426. }
  427. }
  428. }
  429. public bool IsPreventDisplaySleep {
  430. get => NTMinerContext.Instance.MinerProfile.IsPreventDisplaySleep;
  431. set {
  432. if (NTMinerContext.Instance.MinerProfile.IsPreventDisplaySleep != value) {
  433. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsPreventDisplaySleep), value);
  434. OnPropertyChanged(nameof(IsPreventDisplaySleep));
  435. }
  436. }
  437. }
  438. public bool IsNoUi {
  439. get { return NTMinerRegistry.GetIsNoUi(); }
  440. set {
  441. if (NTMinerRegistry.GetIsNoUi() != value) {
  442. NTMinerRegistry.SetIsNoUi(value);
  443. OnPropertyChanged(nameof(IsNoUi));
  444. }
  445. }
  446. }
  447. public bool IsAutoNoUi {
  448. get { return NTMinerContext.Instance.MinerProfile.IsAutoNoUi; }
  449. set {
  450. if (NTMinerContext.Instance.MinerProfile.IsAutoNoUi != value) {
  451. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoNoUi), value);
  452. OnPropertyChanged(nameof(IsAutoNoUi));
  453. }
  454. }
  455. }
  456. public int AutoNoUiMinutes {
  457. get { return NTMinerContext.Instance.MinerProfile.AutoNoUiMinutes; }
  458. set {
  459. if (NTMinerContext.Instance.MinerProfile.AutoNoUiMinutes != value) {
  460. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(AutoNoUiMinutes), value);
  461. OnPropertyChanged(nameof(AutoNoUiMinutes));
  462. }
  463. }
  464. }
  465. public bool IsShowNotifyIcon {
  466. get => NTMinerContext.Instance.MinerProfile.IsShowNotifyIcon;
  467. set {
  468. if (NTMinerContext.Instance.MinerProfile.IsShowNotifyIcon != value) {
  469. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsShowNotifyIcon), value);
  470. OnPropertyChanged(nameof(IsShowNotifyIcon));
  471. AppRoot.NotifyIcon?.RefreshIcon();
  472. }
  473. }
  474. }
  475. public bool IsCloseMeanExit {
  476. get => NTMinerContext.Instance.MinerProfile.IsCloseMeanExit;
  477. set {
  478. if (NTMinerContext.Instance.MinerProfile.IsCloseMeanExit != value) {
  479. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsCloseMeanExit), value);
  480. OnPropertyChanged(nameof(IsCloseMeanExit));
  481. }
  482. }
  483. }
  484. public bool Is1080PillEnabled {
  485. get => NTMinerContext.Instance.MinerProfile.Is1080PillEnabled;
  486. set {
  487. if (NTMinerContext.Instance.MinerProfile.Is1080PillEnabled != value) {
  488. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(Is1080PillEnabled), value);
  489. OnPropertyChanged(nameof(Is1080PillEnabled));
  490. }
  491. }
  492. }
  493. public string HotKey {
  494. get { return HotKeyUtil.GetHotKey(); }
  495. set {
  496. if (HotKeyUtil.GetHotKey() != value) {
  497. if (HotKeyUtil.SetHotKey(value)) {
  498. OnPropertyChanged(nameof(HotKey));
  499. }
  500. }
  501. }
  502. }
  503. public string ArgsAssembly {
  504. get {
  505. return _argsAssembly;
  506. }
  507. set {
  508. _argsAssembly = value;
  509. OnPropertyChanged(nameof(ArgsAssembly));
  510. }
  511. }
  512. public bool IsAutoBoot {
  513. get => NTMinerContext.Instance.MinerProfile.IsAutoBoot;
  514. set {
  515. if (NTMinerContext.Instance.MinerProfile.IsAutoBoot != value) {
  516. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoBoot), value);
  517. OnPropertyChanged(nameof(IsAutoBoot));
  518. }
  519. }
  520. }
  521. public bool IsAutoStart {
  522. get => NTMinerContext.Instance.MinerProfile.IsAutoStart;
  523. set {
  524. if (NTMinerContext.Instance.MinerProfile.IsAutoStart != value) {
  525. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoStart), value);
  526. OnPropertyChanged(nameof(IsAutoStart));
  527. }
  528. }
  529. }
  530. public bool IsAutoDisableWindowsFirewall {
  531. get => NTMinerContext.Instance.MinerProfile.IsAutoDisableWindowsFirewall;
  532. set {
  533. if (NTMinerContext.Instance.MinerProfile.IsAutoDisableWindowsFirewall != value) {
  534. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoDisableWindowsFirewall), value);
  535. OnPropertyChanged(nameof(IsAutoDisableWindowsFirewall));
  536. }
  537. }
  538. }
  539. public bool IsDisableUAC {
  540. get => NTMinerContext.Instance.MinerProfile.IsDisableUAC;
  541. set {
  542. if (NTMinerContext.Instance.MinerProfile.IsDisableUAC != value) {
  543. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsDisableUAC), value);
  544. OnPropertyChanged(nameof(IsDisableUAC));
  545. }
  546. }
  547. }
  548. public bool IsDisableWAU {
  549. get => NTMinerContext.Instance.MinerProfile.IsDisableWAU;
  550. set {
  551. if (NTMinerContext.Instance.MinerProfile.IsDisableWAU != value) {
  552. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsDisableWAU), value);
  553. OnPropertyChanged(nameof(IsDisableWAU));
  554. }
  555. }
  556. }
  557. public bool IsDisableAntiSpyware {
  558. get => NTMinerContext.Instance.MinerProfile.IsDisableAntiSpyware;
  559. set {
  560. if (NTMinerContext.Instance.MinerProfile.IsDisableAntiSpyware != value) {
  561. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsDisableAntiSpyware), value);
  562. OnPropertyChanged(nameof(IsDisableAntiSpyware));
  563. }
  564. }
  565. }
  566. public bool IsNoShareRestartKernel {
  567. get => NTMinerContext.Instance.MinerProfile.IsNoShareRestartKernel;
  568. set {
  569. if (NTMinerContext.Instance.MinerProfile.IsNoShareRestartKernel != value) {
  570. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsNoShareRestartKernel), value);
  571. OnPropertyChanged(nameof(IsNoShareRestartKernel));
  572. }
  573. }
  574. }
  575. public int NoShareRestartKernelMinutes {
  576. get => NTMinerContext.Instance.MinerProfile.NoShareRestartKernelMinutes;
  577. set {
  578. if (NTMinerContext.Instance.MinerProfile.NoShareRestartKernelMinutes != value) {
  579. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(NoShareRestartKernelMinutes), value);
  580. OnPropertyChanged(nameof(NoShareRestartKernelMinutes));
  581. }
  582. }
  583. }
  584. public bool IsNoShareRestartComputer {
  585. get => NTMinerContext.Instance.MinerProfile.IsNoShareRestartComputer;
  586. set {
  587. if (NTMinerContext.Instance.MinerProfile.IsNoShareRestartComputer != value) {
  588. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsNoShareRestartComputer), value);
  589. OnPropertyChanged(nameof(IsNoShareRestartComputer));
  590. }
  591. }
  592. }
  593. public int NoShareRestartComputerMinutes {
  594. get => NTMinerContext.Instance.MinerProfile.NoShareRestartComputerMinutes;
  595. set {
  596. if (NTMinerContext.Instance.MinerProfile.NoShareRestartComputerMinutes != value) {
  597. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(NoShareRestartComputerMinutes), value);
  598. OnPropertyChanged(nameof(NoShareRestartComputerMinutes));
  599. }
  600. }
  601. }
  602. public bool IsPeriodicRestartKernel {
  603. get => NTMinerContext.Instance.MinerProfile.IsPeriodicRestartKernel;
  604. set {
  605. if (NTMinerContext.Instance.MinerProfile.IsPeriodicRestartKernel != value) {
  606. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsPeriodicRestartKernel), value);
  607. OnPropertyChanged(nameof(IsPeriodicRestartKernel));
  608. }
  609. }
  610. }
  611. public int PeriodicRestartKernelHours {
  612. get => NTMinerContext.Instance.MinerProfile.PeriodicRestartKernelHours;
  613. set {
  614. if (NTMinerContext.Instance.MinerProfile.PeriodicRestartKernelHours != value) {
  615. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(PeriodicRestartKernelHours), value);
  616. OnPropertyChanged(nameof(PeriodicRestartKernelHours));
  617. }
  618. }
  619. }
  620. public bool IsPeriodicRestartComputer {
  621. get => NTMinerContext.Instance.MinerProfile.IsPeriodicRestartComputer;
  622. set {
  623. if (NTMinerContext.Instance.MinerProfile.IsPeriodicRestartComputer != value) {
  624. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsPeriodicRestartComputer), value);
  625. OnPropertyChanged(nameof(IsPeriodicRestartComputer));
  626. }
  627. }
  628. }
  629. public int PeriodicRestartComputerHours {
  630. get => NTMinerContext.Instance.MinerProfile.PeriodicRestartComputerHours;
  631. set {
  632. if (NTMinerContext.Instance.MinerProfile.PeriodicRestartComputerHours != value) {
  633. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(PeriodicRestartComputerHours), value);
  634. OnPropertyChanged(nameof(PeriodicRestartComputerHours));
  635. }
  636. }
  637. }
  638. public bool IsAutoRestartKernel {
  639. get => NTMinerContext.Instance.MinerProfile.IsAutoRestartKernel;
  640. set {
  641. if (NTMinerContext.Instance.MinerProfile.IsAutoRestartKernel != value) {
  642. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoRestartKernel), value);
  643. OnPropertyChanged(nameof(IsAutoRestartKernel));
  644. }
  645. }
  646. }
  647. public int AutoRestartKernelTimes {
  648. get => NTMinerContext.Instance.MinerProfile.AutoRestartKernelTimes;
  649. set {
  650. if (value < 3) {
  651. value = 3;
  652. }
  653. if (NTMinerContext.Instance.MinerProfile.AutoRestartKernelTimes != value) {
  654. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(AutoRestartKernelTimes), value);
  655. OnPropertyChanged(nameof(AutoRestartKernelTimes));
  656. }
  657. }
  658. }
  659. public bool IsSpeedDownRestartComputer {
  660. get => NTMinerContext.Instance.MinerProfile.IsSpeedDownRestartComputer;
  661. set {
  662. if (NTMinerContext.Instance.MinerProfile.IsSpeedDownRestartComputer != value) {
  663. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsSpeedDownRestartComputer), value);
  664. OnPropertyChanged(nameof(IsSpeedDownRestartComputer));
  665. }
  666. }
  667. }
  668. public int PeriodicRestartKernelMinutes {
  669. get => NTMinerContext.Instance.MinerProfile.PeriodicRestartKernelMinutes;
  670. set {
  671. if (NTMinerContext.Instance.MinerProfile.PeriodicRestartKernelMinutes != value) {
  672. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(PeriodicRestartKernelMinutes), value);
  673. OnPropertyChanged(nameof(PeriodicRestartKernelMinutes));
  674. if (value < 0 || value > 60) {
  675. throw new ValidationException("无效的值");
  676. }
  677. }
  678. }
  679. }
  680. public int PeriodicRestartComputerMinutes {
  681. get => NTMinerContext.Instance.MinerProfile.PeriodicRestartComputerMinutes;
  682. set {
  683. if (NTMinerContext.Instance.MinerProfile.PeriodicRestartComputerMinutes != value) {
  684. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(PeriodicRestartComputerMinutes), value);
  685. OnPropertyChanged(nameof(PeriodicRestartComputerMinutes));
  686. if (value < 0 || value > 60) {
  687. throw new ValidationException("无效的值");
  688. }
  689. }
  690. }
  691. }
  692. public int RestartComputerSpeedDownPercent {
  693. get => NTMinerContext.Instance.MinerProfile.RestartComputerSpeedDownPercent;
  694. set {
  695. if (NTMinerContext.Instance.MinerProfile.RestartComputerSpeedDownPercent != value) {
  696. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(RestartComputerSpeedDownPercent), value);
  697. OnPropertyChanged(nameof(RestartComputerSpeedDownPercent));
  698. }
  699. }
  700. }
  701. public bool IsNetUnavailableStopMine {
  702. get => NTMinerContext.Instance.MinerProfile.IsNetUnavailableStopMine;
  703. set {
  704. if (NTMinerContext.Instance.MinerProfile.IsNetUnavailableStopMine != value) {
  705. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsNetUnavailableStopMine), value);
  706. OnPropertyChanged(nameof(IsNetUnavailableStopMine));
  707. if (value) {
  708. IsNetAvailableStartMine = true;
  709. }
  710. }
  711. }
  712. }
  713. public int NetUnavailableStopMineMinutes {
  714. get => NTMinerContext.Instance.MinerProfile.NetUnavailableStopMineMinutes;
  715. set {
  716. if (NTMinerContext.Instance.MinerProfile.NetUnavailableStopMineMinutes != value) {
  717. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(NetUnavailableStopMineMinutes), value);
  718. OnPropertyChanged(nameof(NetUnavailableStopMineMinutes));
  719. }
  720. }
  721. }
  722. public bool IsNetAvailableStartMine {
  723. get => NTMinerContext.Instance.MinerProfile.IsNetAvailableStartMine;
  724. set {
  725. if (NTMinerContext.Instance.MinerProfile.IsNetAvailableStartMine != value) {
  726. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsNetAvailableStartMine), value);
  727. OnPropertyChanged(nameof(IsNetAvailableStartMine));
  728. }
  729. }
  730. }
  731. public int NetAvailableStartMineSeconds {
  732. get => NTMinerContext.Instance.MinerProfile.NetAvailableStartMineSeconds;
  733. set {
  734. if (NTMinerContext.Instance.MinerProfile.NetAvailableStartMineSeconds != value) {
  735. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(NetAvailableStartMineSeconds), value);
  736. OnPropertyChanged(nameof(NetAvailableStartMineSeconds));
  737. }
  738. }
  739. }
  740. public bool IsEChargeEnabled {
  741. get => NTMinerContext.Instance.MinerProfile.IsEChargeEnabled;
  742. set {
  743. if (NTMinerContext.Instance.MinerProfile.IsEChargeEnabled != value) {
  744. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsEChargeEnabled), value);
  745. OnPropertyChanged(nameof(IsEChargeEnabled));
  746. }
  747. }
  748. }
  749. public double EPrice {
  750. get => NTMinerContext.Instance.MinerProfile.EPrice;
  751. set {
  752. if (NTMinerContext.Instance.MinerProfile.EPrice != value) {
  753. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(EPrice), value);
  754. OnPropertyChanged(nameof(EPrice));
  755. }
  756. }
  757. }
  758. public bool IsPowerAppend {
  759. get => NTMinerContext.Instance.MinerProfile.IsPowerAppend;
  760. set {
  761. if (NTMinerContext.Instance.MinerProfile.IsPowerAppend != value) {
  762. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsPowerAppend), value);
  763. OnPropertyChanged(nameof(IsPowerAppend));
  764. }
  765. }
  766. }
  767. public int PowerAppend {
  768. get => NTMinerContext.Instance.MinerProfile.PowerAppend;
  769. set {
  770. if (NTMinerContext.Instance.MinerProfile.PowerAppend != value) {
  771. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(PowerAppend), value);
  772. OnPropertyChanged(nameof(PowerAppend));
  773. }
  774. }
  775. }
  776. public bool IsShowCommandLine {
  777. get { return NTMinerContext.Instance.MinerProfile.IsShowCommandLine; }
  778. set {
  779. if (NTMinerContext.Instance.MinerProfile.IsShowCommandLine != value) {
  780. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsShowCommandLine), value);
  781. OnPropertyChanged(nameof(IsShowCommandLine));
  782. }
  783. }
  784. }
  785. private void CreateShortcut() {
  786. try {
  787. if (!ClientAppType.IsMinerClient) {
  788. return;
  789. }
  790. bool isDo = !File.Exists(_linkFileFullName);
  791. if (!isDo) {
  792. string targetPath = WindowsShortcut.GetTargetPath(_linkFileFullName);
  793. isDo = !VirtualRoot.AppFileFullName.Equals(targetPath, StringComparison.OrdinalIgnoreCase);
  794. }
  795. if (isDo) {
  796. WindowsShortcut.CreateShortcut(_linkFileFullName, VirtualRoot.AppFileFullName);
  797. }
  798. }
  799. catch (Exception e) {
  800. Logger.ErrorDebugLine(e);
  801. }
  802. }
  803. public bool IsCreateShortcut {
  804. get { return NTMinerContext.Instance.MinerProfile.IsCreateShortcut; }
  805. set {
  806. if (NTMinerContext.Instance.MinerProfile.IsCreateShortcut != value) {
  807. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsCreateShortcut), value);
  808. OnPropertyChanged(nameof(IsCreateShortcut));
  809. if (ClientAppType.IsMinerClient) {
  810. if (value) {
  811. CreateShortcut();
  812. }
  813. else {
  814. File.Delete(_linkFileFullName);
  815. }
  816. }
  817. }
  818. }
  819. }
  820. public Guid CoinId {
  821. get => NTMinerContext.Instance.MinerProfile.CoinId;
  822. set {
  823. if (NTMinerContext.Instance.MinerProfile.CoinId != value) {
  824. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(CoinId), value);
  825. OnPropertyChanged(nameof(CoinId));
  826. }
  827. }
  828. }
  829. public int MaxTemp {
  830. get => NTMinerContext.Instance.MinerProfile.MaxTemp;
  831. set {
  832. if (NTMinerContext.Instance.MinerProfile.MaxTemp != value) {
  833. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(MaxTemp), value);
  834. OnPropertyChanged(nameof(MaxTemp));
  835. }
  836. }
  837. }
  838. public int AutoStartDelaySeconds {
  839. get => NTMinerContext.Instance.MinerProfile.AutoStartDelaySeconds;
  840. set {
  841. if (NTMinerContext.Instance.MinerProfile.AutoStartDelaySeconds != value) {
  842. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(AutoStartDelaySeconds), value);
  843. OnPropertyChanged(nameof(AutoStartDelaySeconds));
  844. }
  845. }
  846. }
  847. public bool IsAutoStopByCpu {
  848. get => NTMinerContext.Instance.MinerProfile.IsAutoStopByCpu;
  849. set {
  850. if (NTMinerContext.Instance.MinerProfile.IsAutoStopByCpu != value) {
  851. NTMinerContext.Instance.CpuPackage.Reset();
  852. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoStopByCpu), value);
  853. OnPropertyChanged(nameof(IsAutoStopByCpu));
  854. }
  855. }
  856. }
  857. public int CpuStopTemperature {
  858. get => NTMinerContext.Instance.MinerProfile.CpuStopTemperature;
  859. set {
  860. if (NTMinerContext.Instance.MinerProfile.CpuStopTemperature != value) {
  861. NTMinerContext.Instance.CpuPackage.Reset();
  862. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(CpuStopTemperature), value);
  863. OnPropertyChanged(nameof(CpuStopTemperature));
  864. }
  865. }
  866. }
  867. public int CpuGETemperatureSeconds {
  868. get => NTMinerContext.Instance.MinerProfile.CpuGETemperatureSeconds;
  869. set {
  870. if (NTMinerContext.Instance.MinerProfile.CpuGETemperatureSeconds != value) {
  871. NTMinerContext.Instance.CpuPackage.Reset();
  872. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(CpuGETemperatureSeconds), value);
  873. OnPropertyChanged(nameof(CpuGETemperatureSeconds));
  874. }
  875. }
  876. }
  877. public bool IsAutoStartByCpu {
  878. get => NTMinerContext.Instance.MinerProfile.IsAutoStartByCpu;
  879. set {
  880. if (NTMinerContext.Instance.MinerProfile.IsAutoStartByCpu != value) {
  881. NTMinerContext.Instance.CpuPackage.Reset();
  882. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoStartByCpu), value);
  883. OnPropertyChanged(nameof(IsAutoStartByCpu));
  884. }
  885. }
  886. }
  887. public int CpuStartTemperature {
  888. get => NTMinerContext.Instance.MinerProfile.CpuStartTemperature;
  889. set {
  890. if (NTMinerContext.Instance.MinerProfile.CpuStartTemperature != value) {
  891. NTMinerContext.Instance.CpuPackage.Reset();
  892. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(CpuStartTemperature), value);
  893. OnPropertyChanged(nameof(CpuStartTemperature));
  894. }
  895. }
  896. }
  897. public int CpuLETemperatureSeconds {
  898. get => NTMinerContext.Instance.MinerProfile.CpuLETemperatureSeconds;
  899. set {
  900. if (NTMinerContext.Instance.MinerProfile.CpuLETemperatureSeconds != value) {
  901. NTMinerContext.Instance.CpuPackage.Reset();
  902. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(CpuLETemperatureSeconds), value);
  903. OnPropertyChanged(nameof(CpuLETemperatureSeconds));
  904. }
  905. }
  906. }
  907. public bool IsRaiseHighCpuEvent {
  908. get => NTMinerContext.Instance.MinerProfile.IsRaiseHighCpuEvent;
  909. set {
  910. if (NTMinerContext.Instance.MinerProfile.IsRaiseHighCpuEvent != value) {
  911. NTMinerContext.Instance.CpuPackage.Reset();
  912. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsRaiseHighCpuEvent), value);
  913. OnPropertyChanged(nameof(IsRaiseHighCpuEvent));
  914. }
  915. }
  916. }
  917. public int HighCpuBaseline {
  918. get => NTMinerContext.Instance.MinerProfile.HighCpuBaseline;
  919. set {
  920. if (NTMinerContext.Instance.MinerProfile.HighCpuBaseline != value) {
  921. NTMinerContext.Instance.CpuPackage.Reset();
  922. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(HighCpuBaseline), value);
  923. OnPropertyChanged(nameof(HighCpuBaseline));
  924. }
  925. }
  926. }
  927. public int HighCpuSeconds {
  928. get => NTMinerContext.Instance.MinerProfile.HighCpuSeconds;
  929. set {
  930. if (NTMinerContext.Instance.MinerProfile.HighCpuSeconds != value) {
  931. NTMinerContext.Instance.CpuPackage.Reset();
  932. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(HighCpuSeconds), value);
  933. OnPropertyChanged(nameof(HighCpuSeconds));
  934. }
  935. }
  936. }
  937. public CoinViewModel CoinVm {
  938. get {
  939. if (!AppRoot.CoinVms.TryGetCoinVm(this.CoinId, out CoinViewModel coinVm) || !coinVm.IsSupported) {
  940. coinVm = AppRoot.CoinVms.MainCoins.Where(a => a.IsSupported).FirstOrDefault();
  941. if (coinVm != null) {
  942. CoinId = coinVm.Id;
  943. }
  944. }
  945. return coinVm;
  946. }
  947. set {
  948. if (value == null) {
  949. value = AppRoot.CoinVms.MainCoins.Where(a => a.IsSupported).OrderBy(a => a.Code).FirstOrDefault();
  950. }
  951. if (value != null) {
  952. this.CoinId = value.Id;
  953. OnPropertyChanged(nameof(CoinVm));
  954. NTMinerContext.RefreshArgsAssembly.Invoke("MinerProfile上引用的主挖币种发生了切换");
  955. AppRoot.MinerProfileVm.OnPropertyChanged(nameof(AppRoot.MinerProfileVm.IsAllMainCoinPoolIsUserMode));
  956. foreach (var item in AppRoot.GpuSpeedViewModels.Instance.List) {
  957. item.OnPropertyChanged(nameof(item.GpuProfileVm));
  958. }
  959. }
  960. }
  961. }
  962. public bool IsWorker {
  963. get {
  964. return MineWork != null && !ClientAppType.IsMinerStudio;
  965. }
  966. }
  967. public bool IsMining {
  968. get => _isMining;
  969. set {
  970. _isMining = value;
  971. OnPropertyChanged(nameof(IsMining));
  972. }
  973. }
  974. public bool IsWorkerOrMining {
  975. get {
  976. return IsMining || IsWorker;
  977. }
  978. }
  979. public bool IsAutoReboot {
  980. get => NTMinerContext.Instance.MinerProfile.IsAutoReboot;
  981. set {
  982. if (NTMinerContext.Instance.MinerProfile.IsAutoReboot != value) {
  983. Windows.Crash.SetAutoReboot(value);
  984. NTMinerContext.Instance.MinerProfile.SetMinerProfileProperty(nameof(IsAutoReboot), value);
  985. OnPropertyChanged(nameof(IsAutoReboot));
  986. }
  987. }
  988. }
  989. }
  990. }