MainWindow.xaml.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. using AwInitilizer.Model;
  2. using AwInitilizer.Procedure;
  3. using Microsoft.Win32;
  4. using Newtonsoft.Json;
  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;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Controls;
  15. using System.Windows.Data;
  16. using System.Windows.Documents;
  17. using System.Windows.Input;
  18. using System.Windows.Media;
  19. using System.Windows.Media.Imaging;
  20. using System.Windows.Navigation;
  21. using System.Windows.Threading;
  22. namespace AwInitilizer
  23. {
  24. /// <summary>
  25. /// Interaction logic for MainWindow.xaml
  26. /// </summary>
  27. public partial class MainWindow : Window, Interface.IIogger
  28. {
  29. private string barCode = string.Empty;
  30. private DispatcherTimer CleanInputTimer;
  31. private bool IsInitilizing = false;
  32. private SystemID inputSystemID;
  33. private string csuFilePath;
  34. private string mcuFilePath;
  35. private MainViewModel ViewModel => DataContext as MainViewModel;
  36. public MainWindow()
  37. {
  38. InitializeComponent();
  39. ServicePointManager.ServerCertificateValidationCallback +=
  40. (sender, cert, chain, sslPolicyErrors) => true;
  41. System.Net.ServicePointManager.Expect100Continue = false;
  42. CleanInputTimer = new DispatcherTimer();
  43. CleanInputTimer.Interval = TimeSpan.FromSeconds(2);
  44. CleanInputTimer.Tick += CleanInputTimer_Tick;
  45. Loaded += MainWindow_Loaded;
  46. PreviewKeyDown += MainWindow_PreviewKeyDown;
  47. //this.DataContext = new MainViewModel();
  48. this.DataContext = new MainViewModel() {
  49. //ModelName = "DSYE601E0ED2PH",
  50. //SerialNumber = "NeedSetupSN",
  51. //FourGenModuleVersion = "EC25AFFAR07A08M4G",
  52. //IsSimInsert = false,
  53. //ICCID = "12345678901234567890",
  54. //IMSI = "123456789012345",
  55. //CSUVersion = "V1.01.01.0601.00",
  56. //MCUVersion = "D0.52.40.1770.P0"
  57. };
  58. this.DataContextChanged += MainWindow_DataContextChanged;
  59. }
  60. private void MainWindow_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
  61. {
  62. }
  63. private void CleanInputTimer_Tick(object sender, EventArgs e)
  64. {
  65. CleanInputTimer.Stop();
  66. barCode = string.Empty;
  67. }
  68. private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
  69. {
  70. barCode += e.Key;
  71. CleanInputTimer.Stop();
  72. CleanInputTimer.Start();
  73. if (SystemID.TryParse(barCode,out SystemID systemID))
  74. {
  75. inputSystemID = systemID;
  76. uxModelName.Text = systemID.ModelName.ToString();
  77. uxSerialNumber.Text = systemID.SerialNumber;
  78. if(ViewModel!=null && !string.IsNullOrEmpty(ViewModel.ModelName))
  79. {
  80. if (systemID.ModelName.ToString() != ViewModel.ModelName)
  81. {
  82. MessageBox.Show("Model Name Mismatch");
  83. }
  84. }
  85. }
  86. }
  87. private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  88. {
  89. Loaded -= MainWindow_Loaded;
  90. //init intilize procedure list
  91. //procedures.Add(new BasicInfoUpdateProcedure());
  92. //procedures.Add(new FourGenModuleCheckProcedure());
  93. //procedures.Add(new CsuFirmwareUpdateProcedure());
  94. //procedures.Add(new McuFirmwareUpdateProcedure());
  95. //procedures.Add(new ButtonStatusCheckPorcedure());
  96. //procedures.Add(new RestarttoIdelProcedure());
  97. //uxProcedureDataGrid.ItemsSource = procedures;
  98. }
  99. private void StartInit_Click(object sender, RoutedEventArgs e)
  100. {
  101. if(CheckInputData())
  102. {
  103. ViewModel.IsUdatIng = true;
  104. _ = UpdateTask();
  105. }
  106. }
  107. //private void CSUFileSelect_Click(object sender, RoutedEventArgs e)
  108. //{
  109. // OpenFileDialog openFileDialog = new OpenFileDialog();
  110. // if (openFileDialog.ShowDialog() == true){
  111. // ViewModel.CSUFileName = openFileDialog.SafeFileName;
  112. // ViewModel.CSUFilePath = openFileDialog.FileName;
  113. // }
  114. //}
  115. //private void MCUFileSelect_Click(object sender, RoutedEventArgs e)
  116. //{
  117. // OpenFileDialog openFileDialog = new OpenFileDialog();
  118. // if (openFileDialog.ShowDialog() == true)
  119. // {
  120. // ViewModel.MCUFileName = openFileDialog.SafeFileName;
  121. // ViewModel.MCUFilePath = openFileDialog.FileName;
  122. // }
  123. //}
  124. #region
  125. private bool CheckInputData()
  126. {
  127. bool isAvaliable = true;
  128. string alertMsg = string.Empty;
  129. UpdateData updateData;
  130. if(DataContext is MainViewModel viewModel)
  131. {
  132. updateData = viewModel;
  133. }
  134. else
  135. {
  136. throw new Exception("DataContext type error");
  137. }
  138. if(string.IsNullOrEmpty(updateData.ModelName))
  139. {
  140. alertMsg += "Model Name is Required\n";
  141. isAvaliable = false;
  142. }
  143. else if(ViewModel.SettingModelName!= updateData.ModelName)
  144. {
  145. alertMsg += "Model Name setting is Mismathed\n";
  146. isAvaliable = false;
  147. }
  148. if (string.IsNullOrEmpty(updateData.SerialNumber))
  149. {
  150. alertMsg += "Serial Number is Required\n";
  151. isAvaliable = false;
  152. }
  153. var systemIDString = updateData.ModelName + updateData.SerialNumber;
  154. if(!string.IsNullOrEmpty(systemIDString))
  155. {
  156. if(SystemID.TryParse(systemIDString,out SystemID systemID))
  157. {
  158. updateData.SystemID = systemID;
  159. }
  160. else
  161. {
  162. alertMsg += "Model Name format Error\n";
  163. isAvaliable = false;
  164. }
  165. }
  166. if (updateData.SystemID!=null &&
  167. updateData.SystemID.ModelName.Network.ToString().Contains("4G"))
  168. {
  169. if (string.IsNullOrEmpty(updateData.FourGenModuleVersion))
  170. {
  171. alertMsg += "4G Module Version is Required\n";
  172. isAvaliable = false;
  173. }
  174. if (updateData.IsSimInsert)
  175. {
  176. if (string.IsNullOrEmpty(updateData.ICCID))
  177. {
  178. alertMsg += "ICCID is Required when sim installed\n";
  179. isAvaliable = false;
  180. }
  181. if (string.IsNullOrEmpty(updateData.IMSI))
  182. {
  183. alertMsg += "IMSI is Required when sim installed\n";
  184. isAvaliable = false;
  185. }
  186. }
  187. }
  188. if (updateData.FirmwareUpdateModels == null)
  189. {
  190. alertMsg += "FirmwareUpdateModels should be decalred\n";
  191. isAvaliable = false;
  192. }
  193. else
  194. {
  195. foreach (var model in updateData.FirmwareUpdateModels)
  196. {
  197. if (string.IsNullOrEmpty(model.Module))
  198. {
  199. alertMsg += "Firmware module name is Required\n";
  200. isAvaliable = false;
  201. }
  202. if (string.IsNullOrEmpty(model.Version))
  203. {
  204. alertMsg += "Firmware module name is Required\n";
  205. isAvaliable = false;
  206. }
  207. if (string.IsNullOrEmpty(model.FirmwareFileName))
  208. {
  209. alertMsg += "Firmware file is Required\n";
  210. isAvaliable = false;
  211. }
  212. }
  213. }
  214. if(!isAvaliable)
  215. {
  216. MessageBox.Show(alertMsg);
  217. }
  218. return isAvaliable;
  219. }
  220. private async Task UpdateTask()
  221. {
  222. ProcedureBase.UpdateData = ViewModel;
  223. ProcedureBase.Logger = this;
  224. uxTerminal.Inlines.Clear();
  225. ViewModel.IsUdatIng = true;
  226. var procedureList = ViewModel.UpdateProcedure.Where(x => x.IsActivated).ToList();
  227. int procedureIndex;
  228. for (procedureIndex = 0; procedureIndex < procedureList.Count; procedureIndex++)
  229. {
  230. procedureList[procedureIndex].Reset();
  231. }
  232. for (procedureIndex = 0; procedureIndex < procedureList.Count; procedureIndex++)
  233. {
  234. uxProgress.Value = (procedureIndex * 100 / procedureList.Count);
  235. uxProgressRate.Content = ((int)(procedureIndex * 100 / procedureList.Count)) + "%";
  236. var result = await procedureList[procedureIndex].DoWork();
  237. if (!result)
  238. break;
  239. }
  240. if (procedureIndex == procedureList.Count)
  241. {
  242. uxProgress.Value = 100;
  243. uxProgressRate.Content = "100%";
  244. }
  245. CreateLogFile();
  246. ViewModel.IsUdatIng = false;
  247. }
  248. private void CreateLogFile()
  249. {
  250. var fileName = ViewModel.SystemID + ViewModel.SerialNumber + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".txt";
  251. var folderName = "Log";
  252. var filePath = Path.Combine(folderName, fileName);
  253. string content = "";
  254. if(File.Exists(fileName))
  255. {
  256. File.Delete(fileName);
  257. }
  258. FileStream fileStream = new FileStream(filePath, FileMode.Create);
  259. StreamWriter fileWriter = new StreamWriter(fileStream);
  260. fileWriter.WriteLine("Barcode");
  261. fileWriter.WriteLine($"Model name:{ ViewModel.ModelName } , Serial number: { ViewModel.SerialNumber }");
  262. fileWriter.WriteLine("==========================");
  263. fileWriter.WriteLine("Setting file");
  264. fileWriter.WriteLine($"Model name:{ ViewModel.SettingModelName}");
  265. fileWriter.WriteLine($"4G Module Version:{ ViewModel.FourGenModuleVersion}");
  266. fileWriter.WriteLine($"Is sim insert:{ ViewModel.IsSimInsert}");
  267. fileWriter.WriteLine($"sim ICCID:{ ViewModel.ICCID}");
  268. fileWriter.WriteLine($"sim IMSI:{ ViewModel.IMSI}");
  269. foreach(var model in ViewModel.FirmwareUpdateModels)
  270. {
  271. fileWriter.WriteLine($"{model.Module} version:{ model.Version}");
  272. }
  273. var procedureList = ViewModel.UpdateProcedure.ToList();
  274. for (int procedureIndex = 0; procedureIndex < procedureList.Count; procedureIndex++)
  275. {
  276. var procedure = procedureList[procedureIndex];
  277. fileWriter.WriteLine("==========================");
  278. fileWriter.WriteLine(procedure.Name);
  279. fileWriter.WriteLine("Is Activated:" + (procedure.IsActivated ? "Yes" : "No"));
  280. fileWriter.WriteLine("Status:" + procedure.Status.ToString());
  281. fileWriter.WriteLine(procedure.InfoLog);
  282. }
  283. fileWriter.WriteLine("==========================");
  284. fileWriter.Close();
  285. //fileStream.Close();
  286. }
  287. public void Print(string msg, bool isError = false)
  288. {
  289. Dispatcher.Invoke(()=> {
  290. Span line = new Span();
  291. line.Inlines.Add(msg+"\n");
  292. Span.SetForeground(line, isError ? Brushes.Red : Brushes.Green);
  293. uxTerminal.Inlines.Add(line);
  294. uxTerminalScroller.ScrollToEnd();
  295. });
  296. }
  297. #endregion
  298. private void SettingFileSelect_Click(object sender, RoutedEventArgs e)
  299. {
  300. OpenFileDialog openFileDialog = new OpenFileDialog();
  301. openFileDialog.Filter = "Setting file|*.ini";
  302. openFileDialog.Multiselect = false;
  303. if (openFileDialog.ShowDialog() == true)
  304. {
  305. //check format
  306. var filePath = openFileDialog.FileName;
  307. if (!string.IsNullOrEmpty(filePath) &&
  308. File.Exists(filePath))
  309. {
  310. var settingString = File.ReadAllText(filePath);
  311. SettingConfig setting;
  312. try
  313. {
  314. setting = JsonConvert.DeserializeObject<SettingConfig>(settingString);
  315. }
  316. catch
  317. {
  318. MessageBox.Show("Setting file ERROR");
  319. return;
  320. }
  321. if(CheckSettingConfig(System.IO.Path.GetDirectoryName(filePath),ref setting))
  322. {
  323. ViewModel.SettingModelName = setting.ModelName;
  324. ViewModel.SettingFileName = Path.GetFileName(filePath);
  325. ViewModel.FourGenModuleVersion = setting.FourGenModuleVersion;
  326. ViewModel.IsSimInsert = setting.IsSimInsert;
  327. ViewModel.ICCID = setting.ICCID;
  328. ViewModel.IMSI = setting.IMSI;
  329. ViewModel.FirmwareUpdateModels = setting.FirmwareUpdateList
  330. .Where(x => !string.IsNullOrEmpty(x.Module) && !string.IsNullOrEmpty(x.Version) && !string.IsNullOrEmpty(x.FirmwareFileName)
  331. ).ToList() ;
  332. UpdateProcedure();
  333. }
  334. }
  335. }
  336. }
  337. private void UpdateProcedure()
  338. {
  339. List<ProcedureBase> procedures = new List<ProcedureBase>();
  340. //init intilize procedure list
  341. procedures.Add(new BasicInfoUpdateProcedure());
  342. procedures.Add(new FourGenModuleCheckProcedure());
  343. for (int firemwareIndex = 0; firemwareIndex < ViewModel.FirmwareUpdateModels.Count ; firemwareIndex++)
  344. {
  345. procedures.Add(new FirmwareUpdateProcedure(ViewModel.FirmwareUpdateModels[firemwareIndex]));
  346. }
  347. procedures.Add(new ButtonStatusCheckPorcedure());
  348. procedures.Add(new RestarttoIdelProcedure());
  349. ViewModel.UpdateProcedure.Clear();
  350. foreach(var p in procedures)
  351. {
  352. ViewModel.UpdateProcedure.Add(p);
  353. }
  354. //uxProcedureDataGrid.ItemsSource = procedures;
  355. }
  356. private bool CheckSettingConfig(string folderPath, ref SettingConfig setting)
  357. {
  358. if (setting == null)
  359. return false;
  360. bool isCheckPassed = true;
  361. if (string.IsNullOrEmpty(setting.ModelName))
  362. {
  363. MessageBox.Show("ModelName is requred");
  364. isCheckPassed = false;
  365. }
  366. else if(!ModelName.TryParse(setting.ModelName,out _))
  367. {
  368. MessageBox.Show("ModelName format Error");
  369. isCheckPassed = false;
  370. }
  371. if (setting.IsSimInsert)
  372. {
  373. if (string.IsNullOrEmpty(setting.ICCID))
  374. {
  375. MessageBox.Show("ICCID should not empty while IsSimInsert is set");
  376. isCheckPassed = false;
  377. }
  378. if (string.IsNullOrEmpty(setting.IMSI))
  379. {
  380. MessageBox.Show("IMSI should not empty while IsSimInsert is set");
  381. isCheckPassed = false;
  382. }
  383. }
  384. if(setting.FirmwareUpdateList!=null)
  385. {
  386. for (int firmwareIndex = 0; firmwareIndex < setting.FirmwareUpdateList.Count; firmwareIndex++)
  387. {
  388. var model = setting.FirmwareUpdateList[firmwareIndex];
  389. bool isVersionVaild = !string.IsNullOrEmpty(model.Version);
  390. bool isFileNameVaild = !string.IsNullOrEmpty(model.FirmwareFileName);
  391. bool isNoduleNameVaild = !string.IsNullOrEmpty(model.Module);
  392. if(!isNoduleNameVaild)
  393. {
  394. MessageBox.Show("Firmware module name should not empty");
  395. isCheckPassed = false;
  396. }
  397. if (isVersionVaild || isFileNameVaild)
  398. {
  399. if (!isVersionVaild)
  400. {
  401. MessageBox.Show($"Version should not empty while {model.Module} firmware is set");
  402. isCheckPassed = false;
  403. }
  404. if (!isFileNameVaild)
  405. {
  406. MessageBox.Show($"File name should not empty while {model.Module} version is set");
  407. isCheckPassed = false;
  408. }
  409. if (isVersionVaild && isFileNameVaild)
  410. {
  411. var filePath = System.IO.Path.Combine(folderPath, model.FirmwareFileName);
  412. //check file exist
  413. if (!File.Exists(filePath))
  414. {
  415. MessageBox.Show($"{model.Module} Firemware file is missing");
  416. isCheckPassed = false;
  417. }
  418. else
  419. {
  420. try
  421. {
  422. using (var fs = File.OpenRead(filePath))
  423. {
  424. byte[] systemIDBytes = new byte[16];
  425. if (fs.Read(systemIDBytes, 0, 16) == 16)
  426. {
  427. if (systemIDBytes.ToList().Contains(0x00))
  428. {
  429. int endIndex = Array.FindIndex(systemIDBytes, (x) => { return x == 0x00; });
  430. //int endIndex = parameter.FindIndex((x) => { return x == 0x00; });
  431. if (endIndex != default && endIndex != -1)
  432. {
  433. systemIDBytes = systemIDBytes.Take(endIndex).ToArray();
  434. }
  435. }
  436. if (ModelName.TryParse(systemIDBytes, out var modelName))
  437. {
  438. if (modelName.ToString() != setting.ModelName)
  439. {
  440. MessageBox.Show($"{model.Module} Firemware and ModelName is Mismatched");
  441. isCheckPassed = false;
  442. }
  443. }
  444. else
  445. {
  446. MessageBox.Show($"{model.Module} Firemware header ERROR");
  447. isCheckPassed = false;
  448. }
  449. }
  450. else
  451. {
  452. MessageBox.Show($"{model.Module} Firemware header ERROR");
  453. isCheckPassed = false;
  454. }
  455. byte[] imgType = new byte[4];
  456. if (fs.Read(imgType, 0, 4) == 4)
  457. {
  458. if (!imgType.SequenceEqual(new byte[] { 0x10, 0x00, 0x00, 0x04, }))
  459. {
  460. MessageBox.Show($"{model.Module} Firemware type ERROR");
  461. isCheckPassed = false;
  462. }
  463. }
  464. else
  465. {
  466. MessageBox.Show($"{model.Module} Firemware header ERROR");
  467. isCheckPassed = false;
  468. }
  469. }
  470. }
  471. catch
  472. {
  473. MessageBox.Show($"{model.Module} Firemware header ERROR");
  474. isCheckPassed = false;
  475. }
  476. model.FirmwareFileName = filePath;
  477. }
  478. }
  479. }
  480. }
  481. }
  482. return isCheckPassed;
  483. }
  484. }
  485. }