EvseConfigPanel.xaml.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. using InitializerModel;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Converters;
  4. using PhihongEv.Lib;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Controls;
  14. using System.Windows.Data;
  15. using System.Windows.Documents;
  16. using System.Windows.Input;
  17. using System.Windows.Media;
  18. using System.Windows.Media.Imaging;
  19. using System.Windows.Navigation;
  20. using System.Windows.Shapes;
  21. namespace ConfigEditor.SubPage.EvseConfig
  22. {
  23. /// <summary>
  24. /// EvseConfigPanel.xaml 的互動邏輯
  25. /// </summary>
  26. public partial class EvseConfigPanel : UserControl
  27. {
  28. public EvseConfigPanel()
  29. {
  30. InitializeComponent();
  31. uxEvseModelNameList.SelectionChanged += UxEvseModelNameList_SelectionChanged;
  32. }
  33. internal void Reset()
  34. {
  35. var modelList = EvseSettingConfig.GetModelList();
  36. uxEvseModelNameList.SelectedIndex = -1;
  37. uxEvseModelNameList.ItemsSource = modelList;
  38. uxButtonTestMode.ItemsSource = Enum.GetValues(typeof(ButtonTestModeType)).Cast<ButtonTestModeType>();
  39. uxFirmwareStackPanel.Children.Clear();
  40. this.DataContext = new EvseSettingConfigModel();
  41. }
  42. private void UxEvseModelNameList_SelectionChanged(object sender, SelectionChangedEventArgs e)
  43. {
  44. ReloadEvseConfig();
  45. }
  46. private void uxSaveConfigBtn_Click(object sender, RoutedEventArgs e)
  47. {
  48. if (!CheckSetting())
  49. {
  50. return;
  51. }
  52. SaveCurrent();
  53. }
  54. private void uxNewConfigBtn_Click(object sender, RoutedEventArgs e)
  55. {
  56. CreateNewConfig();
  57. }
  58. private void ReloadEvseConfig()
  59. {
  60. var modelName = uxEvseModelNameList.SelectedItem as string;
  61. if (string.IsNullOrEmpty(modelName))
  62. {
  63. //this.DataContext = new EvseSettingConfigModel();
  64. Reset();
  65. return;
  66. }
  67. var loadResult = EvseSettingConfig.TryLoad(modelName);
  68. EvseSettingConfigModel config = null;
  69. if (loadResult != null && loadResult.Error == EvseSettingConfigLoadError.LoadConfigModelInitNotfound)
  70. {
  71. config = new EvseSettingConfigModel() {
  72. ModelName = modelName
  73. };
  74. }
  75. if (loadResult != null && loadResult.Error == EvseSettingConfigLoadError.None)
  76. {
  77. config = loadResult.Result;
  78. }
  79. if (config is null)
  80. {
  81. MessageBox.Show($"load failed:{loadResult.Error}");
  82. return;
  83. }
  84. //EvseSettingConfigModel config = loadResult.Result;
  85. //string folderPath = loadResult.ConfigFolderPath;
  86. string folderPath = EvseSettingConfig.GetModelFolder(modelName);
  87. SystemID.TryLooseParse(modelName, out var systemID);
  88. this.DataContext = config;
  89. uxFirstTelcom.Visibility = systemID.ModelName.GetTelecomCnt() > 0 ? Visibility.Visible : Visibility.Collapsed;
  90. uxSecondTelcom.Visibility = systemID.ModelName.GetTelecomCnt() > 1 ? Visibility.Visible : Visibility.Collapsed;
  91. int maxDispenser = 0;
  92. if (config.PreFlashFirmwareUpdateList != null &&
  93. config.PreFlashFirmwareUpdateList.Count > 0)
  94. {
  95. var preFlashMaxDispenser = config.PreFlashFirmwareUpdateList.Max(x => EvseVersion.GetVersionIndex(x.Module));
  96. maxDispenser = Math.Max(maxDispenser, preFlashMaxDispenser);
  97. }
  98. if (config.FirmwareUpdateList != null &&
  99. config.FirmwareUpdateList.Count > 0)
  100. {
  101. var flashMaxDispenser = config.FirmwareUpdateList.Max(x => EvseVersion.GetVersionIndex(x.Module));
  102. maxDispenser = Math.Max(maxDispenser, flashMaxDispenser);
  103. }
  104. InitializeFirmwarePanel(uxPreFlashStackPanel, "PreFlash", folderPath, config.PreFlashFirmwareUpdateList, maxDispenser);
  105. InitializeFirmwarePanel(uxFirmwareStackPanel, "", folderPath, config.FirmwareUpdateList, maxDispenser);
  106. }
  107. private void InitializeFirmwarePanel(StackPanel firmwareStackPanel, string headerPrefix, string folderPath, List<FirmwareUpdateModel> preFlashFirmwareUpdateList, int dispenserCnt)
  108. {
  109. //var groupedPreFlashFrimware = preFlashFirmwareUpdateList is null ? new List<IGrouping<int, FirmwareUpdateModel>>() : preFlashFirmwareUpdateList.GroupBy(x => EvseVersion.GetVersionIndex(x.Module));
  110. //groupedPreFlashFrimware = groupedPreFlashFrimware.OrderBy(x => x.Key);
  111. Dictionary<int, List<FirmwareUpdateModel>> groupedPreFlashFrimware = preFlashFirmwareUpdateList is null ? new Dictionary<int, List<FirmwareUpdateModel>>(): preFlashFirmwareUpdateList.GroupBy(x => EvseVersion.GetVersionIndex(x.Module)).ToDictionary(x=>x.Key, x=> x.ToList());
  112. //groupedPreFlashFrimware = groupedPreFlashFrimware.OrderBy(x => x.Key);
  113. firmwareStackPanel.Children.Clear();
  114. for (int index = 0; index <= dispenserCnt; index++)
  115. {
  116. var firmwareList = groupedPreFlashFrimware.ContainsKey(index) ? groupedPreFlashFrimware[index] : new List<FirmwareUpdateModel>();
  117. FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, index, firmwareList);
  118. firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
  119. firmwareStackPanel.Children.Add(firmwarePanel);
  120. }
  121. //foreach (var firmwareGroup in groupedPreFlashFrimware)
  122. //{
  123. // FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, firmwareGroup.Key, firmwareGroup.ToList());
  124. // firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
  125. // firmwareStackPanel.Children.Add(firmwarePanel);
  126. //}
  127. //if (!groupedPreFlashFrimware.Select(x => x.Key).Contains(0))
  128. //{
  129. // FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(headerPrefix, folderPath, 0, new List<FirmwareUpdateModel>());
  130. // firmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
  131. // firmwareStackPanel.Children.Add(firmwarePanel);
  132. //}
  133. }
  134. private void ClearUi()
  135. {
  136. //uxIpAddress.Text = string.Empty;
  137. uxFirstTelcom.Visibility = Visibility.Collapsed;
  138. uxSecondTelcom.Visibility = Visibility.Collapsed;
  139. }
  140. private FirmwareVersionPanel CreateFirmwarePanel(string headerPrefix, string folderPath, int key, List<FirmwareUpdateModel> firmwareUpdateModels)
  141. {
  142. var toReturn = new FirmwareVersionPanel();
  143. toReturn.HeaderPrefix = headerPrefix;
  144. toReturn.Index = key;
  145. toReturn.FileFolderPath = folderPath;
  146. toReturn.VersionPairs = firmwareUpdateModels;
  147. //{ Index = key , VersionPairs = firmwareUpdateModels, FileFolderPath = folderPath };
  148. return toReturn;
  149. }
  150. private bool CheckSetting()
  151. {
  152. var modelNameString = uxEvseModelNameList.SelectedItem as string;
  153. EvseSettingConfigModel config = this.DataContext as EvseSettingConfigModel;
  154. if (string.IsNullOrEmpty(modelNameString) ||
  155. config == null)
  156. {
  157. MessageBox.Show("load model failed");
  158. return false;
  159. }
  160. var systemidParse = SystemID.TryLooseParse(modelNameString, out var systemID);
  161. if (!systemidParse)
  162. {
  163. MessageBox.Show("model name error");
  164. return false;
  165. }
  166. var modelName = systemID.ModelName;
  167. if (modelName.GetTelecomCnt() > 0 && string.IsNullOrEmpty(config.FourGenModuleVersion))
  168. {
  169. MessageBox.Show("ModuleVersion should not be empty");
  170. return false;
  171. }
  172. if (modelName.GetTelecomCnt() > 1 && string.IsNullOrEmpty(config.SubFourGenModuleVersion))
  173. {
  174. MessageBox.Show("ModuleVersion should not be empty");
  175. return false;
  176. }
  177. if (config.IsSimInsert)
  178. {
  179. if (string.IsNullOrEmpty(config.SimICCID) ||
  180. string.IsNullOrEmpty(config.SimIMSI))
  181. {
  182. MessageBox.Show("ICCID and IMSI should not be empty");
  183. return false;
  184. }
  185. }
  186. if (config.IsSubSimInsert)
  187. {
  188. if (string.IsNullOrEmpty(config.SubSimICCID) ||
  189. string.IsNullOrEmpty(config.SubSimIMSI))
  190. {
  191. MessageBox.Show("Sub ICCID and IMSI should not be empty");
  192. return false;
  193. }
  194. }
  195. return true;
  196. }
  197. private void SaveCurrent()
  198. {
  199. var modelName = uxEvseModelNameList.SelectedItem as string;
  200. EvseSettingConfigModel config = this.DataContext as EvseSettingConfigModel;
  201. var firmwareUpdateList = LoadFirmwareUpdateListFromPanel(uxFirmwareStackPanel);
  202. CopyAndRenameFirmwareUpdateList(config.ModelName, firmwareUpdateList);
  203. config.FirmwareUpdateList = firmwareUpdateList;
  204. var preFlashFirmwareUpdateList = LoadFirmwareUpdateListFromPanel(uxPreFlashStackPanel);
  205. CopyAndRenameFirmwareUpdateList(config.ModelName, preFlashFirmwareUpdateList);
  206. config.PreFlashFirmwareUpdateList = preFlashFirmwareUpdateList;
  207. //var test = JsonConvert.SerializeObject(config);
  208. File.WriteAllText(
  209. EvseSettingConfig.GetModelIniPath(config.ModelName),
  210. JsonConvert.SerializeObject(
  211. config,
  212. Formatting.Indented,
  213. new StringEnumConverter()
  214. ));
  215. Reset();
  216. }
  217. private List<FirmwareUpdateModel> LoadFirmwareUpdateListFromPanel(StackPanel firmwareStackPanel)
  218. {
  219. var toReturn = new List<FirmwareUpdateModel>();
  220. foreach (var uiPanel in firmwareStackPanel.Children)
  221. {
  222. FirmwareVersionPanel firmwareVersionPanel = uiPanel as FirmwareVersionPanel;
  223. if (firmwareVersionPanel is null)
  224. {
  225. continue;
  226. }
  227. toReturn.AddRange(firmwareVersionPanel.VersionPairs);
  228. }
  229. return toReturn;
  230. }
  231. private void CopyAndRenameFirmwareUpdateList(string modelName, List<FirmwareUpdateModel> firmwareUpdateList)
  232. {
  233. if (firmwareUpdateList == null)
  234. {
  235. return;
  236. }
  237. var modelPath = EvseSettingConfig.GetModelFolder(modelName);
  238. foreach (var model in firmwareUpdateList)
  239. {
  240. if (string.IsNullOrEmpty(model.FirmwareFileName))
  241. {
  242. continue;
  243. }
  244. var firmwarePath = System.IO.Path.GetDirectoryName(model.FirmwareFileName);
  245. var firmwareName = System.IO.Path.GetFileName(model.FirmwareFileName);
  246. if (firmwarePath != modelPath)
  247. {
  248. //Copy
  249. var copyToPathFileName = System.IO.Path.Combine(modelPath, firmwareName);
  250. if (File.Exists(copyToPathFileName))
  251. {
  252. File.Delete(copyToPathFileName);
  253. }
  254. File.Copy(model.FirmwareFileName, copyToPathFileName);
  255. }
  256. model.FirmwareFileName = firmwareName;
  257. }
  258. }
  259. private void CreateNewConfig()
  260. {
  261. var dlg = new NewModelNameDlg();
  262. dlg.Owner = MainWindow.Instance;
  263. dlg.ShowDialog();
  264. if (dlg.DialogResult != true)
  265. {
  266. return;
  267. }
  268. var modelName = dlg.ModelName;
  269. var modelFolderPath = EvseSettingConfig.GetModelFolder(modelName);
  270. var modelIniPath = EvseSettingConfig.GetModelIniPath(modelName);
  271. if (!Directory.Exists(modelFolderPath))
  272. {
  273. Directory.CreateDirectory(modelFolderPath);
  274. }
  275. var initModelSetting = new EvseSettingConfigModel() { ModelName = modelName };
  276. File.WriteAllText(
  277. modelIniPath,
  278. JsonConvert.SerializeObject(
  279. initModelSetting,
  280. Formatting.Indented,
  281. new StringEnumConverter()
  282. ));
  283. Reset();
  284. }
  285. private void AddDispenser_Click(object sender, RoutedEventArgs e)
  286. {
  287. List<int> createdFrimwareIndex = new List<int>();
  288. foreach (var uiElement in uxFirmwareStackPanel.Children)
  289. {
  290. FirmwareVersionPanel firmwarePanel = uiElement as FirmwareVersionPanel;
  291. if (firmwarePanel is null)
  292. {
  293. continue;
  294. }
  295. createdFrimwareIndex.Add(firmwarePanel.Index);
  296. //FirmwareVersionPanel firmwarePanel = CreateFirmwarePanel(folderPath, firmwareGroup.Key, firmwareGroup.ToList());
  297. //uxFrimwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
  298. //uxFrimwareStackPanel.Children.Add(firmwarePanel);
  299. }
  300. int toCreateIndex = 0;
  301. while (createdFrimwareIndex.Contains(toCreateIndex))
  302. {
  303. toCreateIndex++;
  304. }
  305. var modelName = uxEvseModelNameList.SelectedItem as string;
  306. var folderPath = EvseSettingConfig.GetModelFolder(modelName);
  307. FirmwareVersionPanel createdFirmwarePanel = CreateFirmwarePanel("PreFlash", folderPath, toCreateIndex, new List<FirmwareUpdateModel>());
  308. uxPreFlashStackPanel.Children.Add(new Rectangle() { Height = 10 });
  309. uxPreFlashStackPanel.Children.Add(createdFirmwarePanel);
  310. FirmwareVersionPanel createdPreFlashFirmwarePanel = CreateFirmwarePanel("", folderPath, toCreateIndex, new List<FirmwareUpdateModel>());
  311. uxFirmwareStackPanel.Children.Add(new Rectangle() { Height = 10 });
  312. uxFirmwareStackPanel.Children.Add(createdPreFlashFirmwarePanel);
  313. }
  314. }
  315. }