RFCalibrationViewModel.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Venus_Core;
  7. using Prism.Commands;
  8. using Prism.Mvvm;
  9. using MECF.Framework.Common.DataCenter;
  10. using Aitex.Core.Common.DeviceData;
  11. using MECF.Framework.Common.CommonData;
  12. using System.Xml.Serialization;
  13. using Aitex.Core.Util;
  14. using MECF.Framework.Common.OperationCenter;
  15. using LiveCharts;
  16. namespace Venus_MainPages.ViewModels
  17. {
  18. public class RFCalibrationViewModel : BindableBase
  19. {
  20. #region 字段
  21. public ObservableCollection<CalibrationTableItem> m_CalibrationItems = new ObservableCollection<CalibrationTableItem>();
  22. public string ModuleName;
  23. private CalibrationTableItem m_CurrentSelection;
  24. public AITRfData rf;
  25. private string _GeneratorSerialNumber;
  26. private string _SensorSerialNumber;
  27. private double _RFPhysicalMaxPower;
  28. private double _CurrentRFMaxPower;
  29. private double _RFCalibratedMaxPower;
  30. private bool _IsSelectedAllEnable;
  31. private ObservableCollection<NotifiableCalibrationTableItem> _TableData;
  32. private AITRfData _CurrentSelectionRF;
  33. private bool _IsNextEnable;
  34. private JetChamber _JetChamber;
  35. private bool _firstLoad = true;
  36. private List<int> selectedIndexs = new List<int>();
  37. public bool _IsSaveEnable = true;
  38. private int _TableDataSelectedIndex;
  39. ChartValues<double> m_SetPointLineSeries = new ChartValues<double>();
  40. ChartValues<double> m_FeedBackLineSeries = new ChartValues<double>();
  41. #endregion
  42. #region 属性
  43. public ObservableCollection<CalibrationTableItem> CalibrationItems
  44. {
  45. get { return m_CalibrationItems; }
  46. set { SetProperty(ref m_CalibrationItems, value); }
  47. }
  48. public CalibrationTableItem CurrentSelection
  49. {
  50. get { return m_CurrentSelection; }
  51. set
  52. {
  53. ChangeSelection(value);
  54. SetProperty(ref m_CurrentSelection, value);
  55. }
  56. }
  57. public string GeneratorSerialNumber
  58. {
  59. get { return _GeneratorSerialNumber; }
  60. set { SetProperty(ref _GeneratorSerialNumber, value); }
  61. }
  62. public string SensorSerialNumber
  63. {
  64. get { return _SensorSerialNumber; }
  65. set { SetProperty(ref _SensorSerialNumber, value); }
  66. }
  67. public double RFPhysicalMaxPower
  68. {
  69. get { return _RFPhysicalMaxPower; }
  70. set { SetProperty(ref _RFPhysicalMaxPower, value); }
  71. }
  72. public double CurrentRFMaxPower
  73. {
  74. get { return _CurrentRFMaxPower; }
  75. set { SetProperty(ref _CurrentRFMaxPower, value); }
  76. }
  77. public double RFCalibratedMaxPower
  78. {
  79. get { return _RFCalibratedMaxPower; }
  80. set { SetProperty(ref _RFCalibratedMaxPower, value); }
  81. }
  82. public ObservableCollection<NotifiableCalibrationTableItem> TableData
  83. {
  84. get { return _TableData; }
  85. set { SetProperty(ref _TableData, value); }
  86. }
  87. public AITRfData CurrentSelectionRF
  88. {
  89. get { return _CurrentSelectionRF; }
  90. set { SetProperty(ref _CurrentSelectionRF, value); }
  91. }
  92. public bool IsSelectedAllEnable
  93. {
  94. get { return _IsSelectedAllEnable; }
  95. set { SetProperty(ref _IsSelectedAllEnable, value); }
  96. }
  97. public bool IsNextEnable
  98. {
  99. get { return _IsNextEnable; }
  100. set { SetProperty(ref _IsNextEnable, value); }
  101. }
  102. public bool IsSaveEnable
  103. {
  104. get { return _IsSaveEnable; }
  105. set { SetProperty(ref _IsSaveEnable, value); }
  106. }
  107. public int TableDataSelectedIndex
  108. {
  109. get { return _TableDataSelectedIndex; }
  110. set
  111. {
  112. SetProperty(ref _TableDataSelectedIndex, value);
  113. }
  114. }
  115. public ChartValues<double> SetPointLineSeries
  116. {
  117. get { return m_SetPointLineSeries; }
  118. set { SetProperty(ref m_SetPointLineSeries, value); }
  119. }
  120. public ChartValues<double> FeedBackLineSeries
  121. {
  122. get { return m_FeedBackLineSeries; }
  123. set { SetProperty(ref m_FeedBackLineSeries, value); }
  124. }
  125. #endregion
  126. #region 命令
  127. private DelegateCommand _CheckCommand;
  128. public DelegateCommand CheckCommand =>
  129. _CheckCommand ?? (_CheckCommand = new DelegateCommand(OnCheck));
  130. private DelegateCommand _UnCheckCommand;
  131. public DelegateCommand UnCheckCommand =>
  132. _UnCheckCommand ?? (_UnCheckCommand = new DelegateCommand(OnUnCheck));
  133. private DelegateCommand _StartCommand;
  134. public DelegateCommand StartCommand =>
  135. _StartCommand ?? (_StartCommand = new DelegateCommand(OnStart));
  136. private DelegateCommand _NextCommand;
  137. public DelegateCommand NextCommand =>
  138. _NextCommand ?? (_NextCommand = new DelegateCommand(OnNext));
  139. private DelegateCommand _EndCommand;
  140. public DelegateCommand EndCommand =>
  141. _EndCommand ?? (_EndCommand = new DelegateCommand(OnEnd));
  142. private DelegateCommand _LoadedCommand;
  143. public DelegateCommand LoadedCommand =>
  144. _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(OnLoaded));
  145. private DelegateCommand _SaveCommand;
  146. public DelegateCommand SaveCommand =>
  147. _SaveCommand ?? (_SaveCommand = new DelegateCommand(OnSave));
  148. #endregion
  149. #region 构造函数
  150. public RFCalibrationViewModel()
  151. {
  152. }
  153. #endregion
  154. #region 命令方法
  155. private void OnLoaded()
  156. {
  157. if (_firstLoad)
  158. {
  159. _firstLoad = false;
  160. _JetChamber = (JetChamber)Enum.Parse(typeof(JetChamber), QueryDataClient.Instance.Service.GetConfig($"{ModuleName}.ChamberType").ToString());
  161. CalibrationItems.Add(new CalibrationTableItem()
  162. {
  163. DisplayName = "Source RF",
  164. ItemEnableScName = $"{ModuleName}.Rf.EnableCalibration",
  165. ItemTableScName = $"{ModuleName}.Rf.CalibrationTable",
  166. });
  167. //CalibrationItems.Add(new CalibrationTableItem()
  168. //{
  169. // DisplayName = "Bias RF",
  170. // ItemEnableScName = $"{ModuleName}.BiasRf.EnableCalibration",
  171. // ItemTableScName = $"{ModuleName}.BiasRf.CalibrationTable",
  172. //});
  173. if (_JetChamber != JetChamber.Kepler2200A && _JetChamber != JetChamber.Kepler2200B)
  174. {
  175. CalibrationItems.Add(new CalibrationTableItem()
  176. {
  177. DisplayName = "Bias RF",
  178. ItemEnableScName = $"{ModuleName}.BiasRf.EnableCalibration",
  179. ItemTableScName = $"{ModuleName}.BiasRf.CalibrationTable",
  180. });
  181. }
  182. }
  183. }
  184. public void OnCheck()
  185. {
  186. if (TableData != null && TableData.Count > 0)
  187. {
  188. for (int i = 0; i < TableData.Count; i++)
  189. {
  190. TableData[i].IsSelected = true;
  191. }
  192. }
  193. }
  194. public void OnUnCheck()
  195. {
  196. if (TableData != null && TableData.Count > 0)
  197. {
  198. for (int i = 0; i < TableData.Count; i++)
  199. {
  200. TableData[i].IsSelected = false;
  201. }
  202. }
  203. }
  204. public void OnStart()
  205. {
  206. selectedIndexs = new List<int>();
  207. for (int i = 0; i < TableData.Count; i++)
  208. {
  209. if (TableData[i].IsSelected)
  210. {
  211. TableData[i].ForwardPowerUI = 0;
  212. TableData[i].ForwardPowerMeter = 0;
  213. TableData[i].ReflectedPower = 0;
  214. selectedIndexs.Add(i);
  215. }
  216. IsSelectedAllEnable = false;
  217. TableData[i].SetPointEnable = false;
  218. TableData[i].IsSelectedEnable = false;
  219. TableData[i].InvokePropertyChanged("SetPointEnable");
  220. TableData[i].InvokePropertyChanged("IsSelectedEnable");
  221. }
  222. IsNextEnable = true;
  223. IsSaveEnable = false;
  224. Next();
  225. }
  226. public void OnNext()
  227. {
  228. Next();
  229. }
  230. public void OnEnd()
  231. {
  232. var rf = GetRFbyDisplayName(CurrentSelection.DisplayName);
  233. if (rf == null)
  234. return;
  235. InvokeClient.Instance.Service.DoOperation($"{rf.Module}.{rf.DeviceName}.{AITRfOperation.SetPower}", 0F);
  236. InvokeClient.Instance.Service.DoOperation($"{rf.Module}.{rf.DeviceName}.SetPowerOff");
  237. selectedIndexs = new List<int>();
  238. TableDataSelectedIndex = 0;
  239. CalcResult();
  240. }
  241. #endregion
  242. #region 私有方法
  243. protected void ChangeSelection(CalibrationTableItem item)
  244. {
  245. string name = item.DisplayName == "Source RF" ? VenusDevice.Rf.ToString() : VenusDevice.BiasRf.ToString();
  246. CurrentSelectionRF = rf = (AITRfData)QueryDataClient.Instance.Service.GetData($"{ModuleName}.{name}.DeviceData");
  247. if (rf == null) return;
  248. GeneratorSerialNumber = QueryDataClient.Instance.Service.GetConfig($"{rf.Module}.{rf.DeviceName}.GeneratorSerialNumber")?.ToString();
  249. SensorSerialNumber = QueryDataClient.Instance.Service.GetConfig($"{rf.Module}.{rf.DeviceName}.SensorSerialNumber")?.ToString();
  250. double result;
  251. double.TryParse(QueryDataClient.Instance.Service.GetConfig($"{rf.Module}.{rf.DeviceName}.RFPhysicalMaxPower")?.ToString(), out result);
  252. RFPhysicalMaxPower = result;
  253. double.TryParse(QueryDataClient.Instance.Service.GetConfig($"{rf.Module}.{rf.DeviceName}.CurrentRFMaxPower")?.ToString(), out result);
  254. CurrentRFMaxPower = result;
  255. double.TryParse(QueryDataClient.Instance.Service.GetConfig($"{rf.Module}.{rf.DeviceName}.RFCalibratedMaxPower")?.ToString(), out result);
  256. RFCalibratedMaxPower = result;
  257. var tableValues = QueryDataClient.Instance.Service.GetConfig($"{item.ItemTableDetailScName}");
  258. if (tableValues == null)
  259. return;
  260. var scValue = (string)tableValues;
  261. if (string.IsNullOrEmpty(scValue))
  262. {
  263. InitTableData(item);
  264. return;
  265. }
  266. try
  267. {
  268. var tableData = CustomXmlSerializer.Deserialize<List<NotifiableCalibrationTableItem>>(scValue);
  269. TableData = new ObservableCollection<NotifiableCalibrationTableItem>(tableData);
  270. }
  271. catch
  272. {
  273. InitTableData(item);
  274. }
  275. }
  276. private void InitTableData(CalibrationTableItem item)
  277. {
  278. var tableData = new List<NotifiableCalibrationTableItem>();
  279. for (int i = 0; i < 20; i++)
  280. {
  281. tableData.Add(new NotifiableCalibrationTableItem() { DisplayName = item.DisplayName, SetPoint = (i + 1) * 100, ForwardPowerUI = (i + 1) * 100, ForwardPowerMeter = (i + 1) * 100 });
  282. }
  283. TableData = new ObservableCollection<NotifiableCalibrationTableItem>(tableData);
  284. }
  285. public void Next()
  286. {
  287. if (selectedIndexs.Count > 0)
  288. {
  289. TableDataSelectedIndex = selectedIndexs[0];
  290. RFCalibration(TableData[TableDataSelectedIndex]);
  291. selectedIndexs.RemoveAt(0);
  292. }
  293. else
  294. {
  295. CalcResult();
  296. }
  297. }
  298. private void RFCalibration(NotifiableCalibrationTableItem tableItem)
  299. {
  300. var rf = GetRFbyDisplayName(tableItem.DisplayName);
  301. if (rf == null)
  302. return;
  303. IsNextEnable = false;
  304. InvokeClient.Instance.Service.DoOperation($"{rf.Module}.{rf.DeviceName}.{AITRfOperation.SetPower}", tableItem.SetPoint);
  305. if (!rf.IsRfOn)
  306. InvokeClient.Instance.Service.DoOperation($"{rf.Module}.{rf.DeviceName}.SetPowerOn");
  307. Task.Delay(10*1000).ContinueWith(x =>
  308. {
  309. UpdateForwardPower(tableItem);
  310. IsNextEnable = true;
  311. });
  312. }
  313. private AITRfData GetRFbyDisplayName(string displayName)
  314. {
  315. switch (displayName)
  316. {
  317. case "Source RF":
  318. return (AITRfData)QueryDataClient.Instance.Service.GetData($"{ModuleName}.{VenusDevice.Rf}.DeviceData");
  319. case "Bias RF":
  320. return (AITRfData)QueryDataClient.Instance.Service.GetData($"{ModuleName}.{VenusDevice.BiasRf}.DeviceData");
  321. }
  322. return null;
  323. }
  324. private void UpdateForwardPower(NotifiableCalibrationTableItem tableItem)
  325. {
  326. var tableDataItem = TableData.FirstOrDefault(x => x.SetPoint == tableItem.SetPoint);
  327. if (tableDataItem != null)
  328. tableDataItem.ForwardPowerUI = GetRFbyDisplayName(tableItem.DisplayName).ForwardPower;
  329. }
  330. private void CalcResult()
  331. {
  332. IsNextEnable = false;
  333. IsSaveEnable = true;
  334. //RenderableSeries = new ObservableCollection<IRenderableSeries>();
  335. //var ForwardPowerMeterLine = new ChartDataLine(CurrentSelection.DisplayName + " ForwardPowerMeter/SetPoint", CurrentSelection.DisplayName + " ForwardPowerMeter/SetPoint", System.Windows.Media.Color.FromRgb(Color.Red.R, Color.Red.G, Color.Red.B));
  336. //var SetPointLine = new ChartDataLine(CurrentSelection.DisplayName + " SetPoint/SetPoint", CurrentSelection.DisplayName + " SetPoint/SetPoint", System.Windows.Media.Color.FromRgb(Color.Blue.R, Color.Blue.G, Color.Blue.B));
  337. for (int i = 0; i < TableData.Count; i++)
  338. {
  339. //if (TableData[i].IsSelected)
  340. //{
  341. // ForwardPowerMeterLine.Append(TableData[i].SetPoint, TableData[i].ForwardPowerMeter);
  342. // SetPointLine.Append(TableData[i].SetPoint, TableData[i].SetPoint);
  343. //}
  344. IsSelectedAllEnable = true;
  345. TableData[i].SetPointEnable = true;
  346. TableData[i].IsSelectedEnable = true;
  347. TableData[i].InvokePropertyChanged("SetPointEnable");
  348. TableData[i].InvokePropertyChanged("IsSelectedEnable");
  349. }
  350. //RenderableSeries.Add(ForwardPowerMeterLine);
  351. //RenderableSeries.Add(SetPointLine);
  352. if (TableData.Count(x => x.IsSelected) == 0)
  353. return;
  354. RFCalibratedMaxPower = CurrentRFMaxPower * 100 / (100 - TableData.Where(x => x.IsSelected).Average(x => x.Difference));
  355. }
  356. private void OnSave()
  357. {
  358. SetPointLineSeries.Clear();
  359. FeedBackLineSeries.Clear();
  360. for (int i = 0; i < TableData.Count; i++)
  361. {
  362. SetPointLineSeries.Add(TableData[i].SetPoint);
  363. FeedBackLineSeries.Add(TableData[i].ForwardPowerUI);
  364. }
  365. if (CurrentSelection == null)
  366. return;
  367. string detailData = CustomXmlSerializer.Serialize(TableData);
  368. string data = "";
  369. foreach (var item in TableData)
  370. {
  371. data += $"{item.SetPoint}#{item.ForwardPowerMeter};";
  372. }
  373. if (rf == null)
  374. return;
  375. InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{rf.Module}.{rf.DeviceName}.GeneratorSerialNumber", GeneratorSerialNumber);
  376. InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{rf.Module}.{rf.DeviceName}.SensorSerialNumber", SensorSerialNumber);
  377. InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{rf.Module}.{rf.DeviceName}.RFPhysicalMaxPower", RFPhysicalMaxPower.ToString());
  378. InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{rf.Module}.{rf.DeviceName}.CurrentRFMaxPower", CurrentRFMaxPower.ToString());
  379. InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{rf.Module}.{rf.DeviceName}.RFCalibratedMaxPower", RFCalibratedMaxPower.ToString());
  380. InvokeClient.Instance.Service.DoOperation("System.SetConfig", CurrentSelection.ItemTableScName, data);
  381. InvokeClient.Instance.Service.DoOperation("System.SetConfig", CurrentSelection.ItemTableDetailScName, detailData);
  382. ChangeSelection(CurrentSelection);
  383. }
  384. #endregion
  385. }
  386. public class CalibrationTableItem
  387. {
  388. public string DisplayName { get; set; }
  389. public string ItemTableScName { get; set; }
  390. public string ItemTableDetailScName
  391. {
  392. get => ItemTableScName + "Detail";
  393. }
  394. public string ItemEnableScName { get; set; }
  395. }
  396. public class NotifiableCalibrationTableItem : NotifiableItem
  397. {
  398. public string DisplayName { get; set; }
  399. private bool _IsSelected;
  400. public bool IsSelected
  401. {
  402. get
  403. {
  404. return _IsSelected;
  405. }
  406. set
  407. {
  408. _IsSelected = value;
  409. InvokePropertyChanged("IsSelected");
  410. }
  411. }
  412. [XmlIgnore]
  413. public bool IsSelectedEnable { get; set; } = true;
  414. public float _setPoint;
  415. public float SetPoint
  416. {
  417. get
  418. {
  419. return _setPoint;
  420. }
  421. set
  422. {
  423. _setPoint = value;
  424. InvokePropertyChanged("SetPoint");
  425. }
  426. }
  427. [XmlIgnore]
  428. public bool SetPointEnable { get; set; } = true;
  429. public float _forwardPowerUI;
  430. public float ForwardPowerUI
  431. {
  432. get
  433. {
  434. return _forwardPowerUI;
  435. }
  436. set
  437. {
  438. _forwardPowerUI = value;
  439. InvokePropertyChanged("ForwardPowerUI");
  440. }
  441. }
  442. private float _forwardPowerMeter;
  443. public float ForwardPowerMeter
  444. {
  445. get
  446. {
  447. return _forwardPowerMeter;
  448. }
  449. set
  450. {
  451. _forwardPowerMeter = value;
  452. InvokePropertyChanged("ForwardPowerMeter");
  453. InvokePropertyChanged("Difference");
  454. InvokePropertyChanged("DifferenceBackground");
  455. }
  456. }
  457. public float ReflectedPower { get; set; }
  458. public float Difference
  459. {
  460. get
  461. {
  462. if (SetPoint == 0)
  463. return 0;
  464. return (ForwardPowerMeter - SetPoint) * 100 / SetPoint;
  465. }
  466. }
  467. public string DifferenceBackground
  468. {
  469. get
  470. {
  471. return Math.Abs(Difference) <= 3 ? "LightGreen" : "Red";
  472. }
  473. }
  474. }
  475. }