FirmwareFtpUploadProcedure.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. if (!signalUpdateResult)
  74. {
  75. LogWriter.Log($"SignalUpdate failed");
  76. Error = ErrorType.SignalUpdateFailed;
  77. return false;
  78. }
  79. return result;
  80. }
  81. private async Task<bool> UploadWithFtp()
  82. {
  83. var updateList = UpdateData.FirmwareUpdateModels;
  84. //FtpClient client = new FtpClient(ServerIpAddress, "root", "y42j/4cj84");
  85. FtpClient client = new FtpClient(ServerIpAddress, "vern", "vern@delta");
  86. try
  87. {
  88. var profile = await client.AutoConnectAsync();
  89. if (profile == null)
  90. {
  91. throw new Exception("profile null");
  92. }
  93. }
  94. catch
  95. {
  96. LogWriter.Log($"Ftp Connect failed");
  97. LogWriter.Report(LogEvent.FirmwareUpload, "fail", isError: true);
  98. return false;
  99. }
  100. for (int modelIndex = 0; modelIndex < updateList.Count; modelIndex++) //foreach (var model in updateList)
  101. {
  102. var model = updateList[modelIndex];
  103. var firmwareFilePath = Path.Combine(Directory.GetCurrentDirectory(), model.FirmwareFileName);
  104. var remoteFilePath = string.Format("/mnt/{0}", Path.GetFileName(model.FirmwareFileName));
  105. var status = await client.UploadFileAsync(model.FirmwareFileName, remoteFilePath);
  106. if(status != FtpStatus.Success)
  107. {
  108. LogWriter.Log($"Firmware {modelIndex} upload failed");
  109. LogWriter.Report(LogEvent.FirmwareUpload, "fail", isError: true);
  110. return false;
  111. }
  112. }
  113. await client.DisconnectAsync();
  114. return true;
  115. }
  116. private async Task<bool> SignalUpdate()
  117. {
  118. try
  119. {
  120. var result = await EvApi.SignalUpdateFirmware();
  121. LogWriter.Log(result.Response);
  122. return result.Result;
  123. }
  124. catch (Exception e)
  125. {
  126. LogWriter.Log(e.Message, isError: true, isDebugLog: true);
  127. if (e.InnerException != null)
  128. {
  129. LogWriter.Log(e.InnerException.Message, isError: true, isDebugLog: true);
  130. }
  131. return false;
  132. }
  133. }
  134. }
  135. }