FirmwareFtpUploadProcedure.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using AwInitilizer.Assist;
  2. using FluentFTP;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. namespace AwInitilizer.Procedure.FirmwareBundleUpload
  11. {
  12. public class FirmwareFtpUploadProcedure : ProcedureBase
  13. {
  14. public ErrorType Error { get; set; } = ErrorType.None;
  15. private ProcedureLog.LogWriter<FirmwareFtpUploadProcedure, LogEvent> LogWriter;
  16. private readonly static Dictionary<LogEvent, string> ReportDict = new Dictionary<LogEvent, string>()
  17. {
  18. { LogEvent.UploadStartWait, "UploadStartWait" },
  19. { LogEvent.FirmwareUpload, "FirmwareUpload" },
  20. };
  21. private readonly static Dictionary<LogEvent, string> LogDict = new Dictionary<LogEvent, string>()
  22. {
  23. { LogEvent.UploadStartWait, "Wait restart {0}" },
  24. { LogEvent.FirmwareUpload, "Firmware Upload {0}" },
  25. };
  26. public FirmwareFtpUploadProcedure() : base()
  27. {
  28. Name = string.Format("Firmware Upload");
  29. Content = string.Format("Upload all Firemware");
  30. LogWriter = new ProcedureLog.LogWriter<FirmwareFtpUploadProcedure, LogEvent>(this)
  31. {
  32. ReportPair = ReportDict,
  33. LogPair = LogDict
  34. };
  35. }
  36. internal override async Task<bool> Run()
  37. {
  38. bool response = false;
  39. int pollingCnt = 0;
  40. for (pollingCnt = 0; pollingCnt < 56; pollingCnt++)
  41. {
  42. await Task.Delay(TimeSpan.FromSeconds(15));
  43. response = await CheckGetQueryAction();
  44. if (response)
  45. break;
  46. }
  47. LogWriter.Log(string.Format("EVSE connet elapsed minute(s) : {0}, Expect:<14", pollingCnt * 0.25));
  48. //timeout
  49. if (pollingCnt >= 56)
  50. {
  51. LogWriter.Report(LogEvent.UploadStartWait, "fail", isError: true);
  52. Error = ErrorType.StartWaitTimeout;
  53. return false;
  54. }
  55. LogWriter.Report(LogEvent.UploadStartWait, "success");
  56. //upload firmware
  57. bool result = false;
  58. for (int tryCnt = 0; tryCnt < 10; tryCnt++)
  59. {
  60. result = await UploadWithFtp();
  61. if (result)
  62. break;
  63. else
  64. await Task.Delay(1000);
  65. }
  66. if (!result)
  67. {
  68. Error = ErrorType.UploadFailed;
  69. return false;
  70. }
  71. //signal Update start
  72. var signalUpdateResult = await SignalUpdate();
  73. return result;
  74. }
  75. private async Task<bool> UploadWithFtp()
  76. {
  77. var updateList = UpdateData.FirmwareUpdateModels;
  78. //FtpClient client = new FtpClient(ServerIpAddress, "root", "y42j/4cj84");
  79. FtpClient client = new FtpClient(ServerIpAddress, "vern", "vern@delta");
  80. try
  81. {
  82. var profile = await client.AutoConnectAsync();
  83. if (profile == null)
  84. {
  85. throw new Exception("profile null");
  86. }
  87. }
  88. catch
  89. {
  90. LogWriter.Log($"Ftp Connect failed");
  91. LogWriter.Report(LogEvent.FirmwareUpload, "fail", isError: true);
  92. return false;
  93. }
  94. for (int modelIndex = 0; modelIndex < updateList.Count; modelIndex++) //foreach (var model in updateList)
  95. {
  96. var model = updateList[modelIndex];
  97. var firmwareFilePath = Path.Combine(Directory.GetCurrentDirectory(), model.FirmwareFileName);
  98. var remoteFilePath = string.Format("/mnt/{0}", Path.GetFileName(model.FirmwareFileName));
  99. var status = await client.UploadFileAsync(model.FirmwareFileName, remoteFilePath);
  100. if(status != FtpStatus.Success)
  101. {
  102. LogWriter.Log($"Firmware {modelIndex} upload failed");
  103. LogWriter.Report(LogEvent.FirmwareUpload, "fail", isError: true);
  104. return false;
  105. }
  106. }
  107. await client.DisconnectAsync();
  108. return true;
  109. }
  110. private async Task<bool> SignalUpdate()
  111. {
  112. try
  113. {
  114. var result = await EvApi.SignalUpdateFirmware();
  115. LogWriter.Log(result.Response);
  116. return result.Result;
  117. }
  118. catch (Exception e)
  119. {
  120. LogWriter.Log(e.Message, isError: true, isDebugLog: true);
  121. if (e.InnerException != null)
  122. {
  123. LogWriter.Log(e.InnerException.Message, isError: true, isDebugLog: true);
  124. }
  125. return false;
  126. }
  127. }
  128. }
  129. }