RestarttoIdelProcedure.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.Specialized;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. namespace AwInitilizer.Procedure.RestarttoIdel
  13. {
  14. public enum ErrorType
  15. {
  16. None,
  17. SetFail,
  18. ConnectorNotIdel,
  19. }
  20. public enum LogEvent
  21. {
  22. IdelCheck
  23. }
  24. public class RestarttoIdelProcedure : ProcedureBase
  25. {
  26. public ErrorType Error { get; set; } = ErrorType.None;
  27. private ProcedureLog.LogWriter<RestarttoIdelProcedure, LogEvent> LogWriter;
  28. private readonly static Dictionary<LogEvent, string> ReportDict = new Dictionary<LogEvent, string>()
  29. {
  30. { LogEvent.IdelCheck, "IdelCheck" }
  31. };
  32. private readonly static Dictionary<LogEvent, string> LogDict = new Dictionary<LogEvent, string>()
  33. {
  34. { LogEvent.IdelCheck, "Connector status is Idel Check :{0}" }
  35. };
  36. public RestarttoIdelProcedure() : base()
  37. {
  38. Name = "Restart To Idel";
  39. Content = "Restart EVSSE and check status back to Idel";
  40. LogWriter = new ProcedureLog.LogWriter<RestarttoIdelProcedure, LogEvent>(this)
  41. {
  42. ReportPair = ReportDict,
  43. LogPair = LogDict
  44. };
  45. }
  46. internal override async Task<bool> Run()
  47. {
  48. var result = await FactorySet();
  49. if (!result)
  50. {
  51. Error = ErrorType.SetFail;
  52. return false;
  53. }
  54. else
  55. {
  56. LogWriter.Log("Waiting Factory reset complete...");
  57. //Logger.Print("Waiting Factory reset complete...");
  58. await Task.Delay(TimeSpan.FromMinutes(2));
  59. if (await CheckAllIdel())
  60. {
  61. LogWriter.Report(LogEvent.IdelCheck,"success");
  62. //Logger.Print("All Connetor is Idel");
  63. return true;
  64. }
  65. else
  66. {
  67. LogWriter.Report(LogEvent.IdelCheck, "fail");
  68. Error = ErrorType.ConnectorNotIdel;
  69. return false;
  70. }
  71. }
  72. }
  73. private async Task<bool> FactorySet()
  74. {
  75. try
  76. {
  77. using (WebClient webClient = new WebClient())
  78. {
  79. NameValueCollection parameters = new NameValueCollection();
  80. parameters.Add("SystemId", "");
  81. parameters.Add("SystemDateTime", "");
  82. parameters.Add("PhaseLossPolicy", "");
  83. parameters.Add("FactoryConfiguration", "1");
  84. parameters.Add("AuthorisationMode", "");
  85. parameters.Add("isAPP", "");
  86. parameters.Add("isQRCode", "");
  87. parameters.Add("isRFID", "");
  88. parameters.Add("QRCodeMadeMode", "");
  89. parameters.Add("QRCodeContent", "");
  90. parameters.Add("Intensity", "");
  91. parameters.Add("RfidCardNumEndian", "");
  92. parameters.Add("PsuAcInputType", "");
  93. webClient.QueryString = parameters;
  94. using (Stream stream = await webClient.OpenReadTaskAsync($"https://{ServerIpAddress}/set_system_action.php"))
  95. // 使用 StreamReader 讀取 stream 內的字元
  96. using (StreamReader reader = new StreamReader(stream))
  97. {
  98. // 將 StreamReader 所讀到的字元轉為 string
  99. string response = reader.ReadToEnd();
  100. //InfoLog += $"factory set respons:\n{request}\n";
  101. LogWriter.Log($"factory set respons: {response}", isDebugLog: true);
  102. var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);
  103. }
  104. }
  105. return true;
  106. }
  107. catch (Exception e)
  108. {
  109. LogWriter.Log("Factory reset command failed");
  110. LogWriter.Log(e.Message, isDebugLog: true);
  111. //InfoLog += "Factory reset command failed\n";
  112. //InfoLog += e.Message;
  113. //InfoLog += "\n";
  114. //Logger.Print("Factory reset command failed", isError: true);
  115. //Logger.Print(e.Message, isError: true);
  116. return false;
  117. }
  118. }
  119. private async Task<bool> CheckAllIdel()
  120. {
  121. var statusPairs = await GetConnectorStatus();
  122. if (statusPairs is null)
  123. return false;
  124. else
  125. {
  126. foreach (var statusPair in statusPairs)
  127. {
  128. if (statusPair.Value != "1")
  129. {
  130. LogWriter.Log($"Connector {statusPair.Key} status not Idel");
  131. return false;
  132. //InfoLog += $"Connector {matchIndex} status not Idel\n";
  133. //Logger.Print($"Connector {matchIndex} status not Idel", isError: true);
  134. }
  135. }
  136. return true;
  137. }
  138. }
  139. private async Task<Dictionary<int, string>> GetConnectorStatus()
  140. {
  141. Dictionary<int, string> connectorStatusPair = new Dictionary<int, string>();
  142. try
  143. {
  144. using (WebClient webClient = new WebClient())
  145. {
  146. NameValueCollection parameters = new NameValueCollection();
  147. parameters.Add("opt", "2");
  148. webClient.QueryString = parameters;
  149. using (Stream stream = await webClient.OpenReadTaskAsync($"https://{ServerIpAddress}/get_query_action.php"))
  150. // 使用 StreamReader 讀取 stream 內的字元
  151. using (StreamReader reader = new StreamReader(stream))
  152. {
  153. // 將 StreamReader 所讀到的字元轉為 string
  154. string request = reader.ReadToEnd();
  155. LogWriter.Log($"get status respons:\n{request}\n", isDebugLog: true);
  156. //InfoLog += $"get status respons:\n{request}\n";
  157. //LogPair.Add($"EvseStatus", request);
  158. Regex rx = new Regex("(SystemStatus)\\\": (\\d)");
  159. var matches = rx.Matches(request);
  160. for (int matchIndex = 0; matchIndex < matches.Count; matchIndex++)
  161. {
  162. var match = matches[matchIndex];
  163. if (match.Groups.Count != 3)
  164. {
  165. LogWriter.Log($"Connector {matchIndex} status string mismatched");
  166. return null;
  167. //InfoLog += $"Connector {matchIndex} status string mismatched\n";
  168. //Logger.Print($"Connector {matchIndex} status string mismatched", isError:true);
  169. }
  170. else
  171. {
  172. connectorStatusPair.Add(matchIndex, match.Groups[2].Value);
  173. }
  174. }
  175. }
  176. }
  177. return connectorStatusPair;
  178. }
  179. catch (Exception e)
  180. {
  181. LogWriter.Log("Get connector status command failed");
  182. LogWriter.Log(e.Message, isDebugLog: true);
  183. //InfoLog += "Check all idel command failed\n";
  184. //InfoLog += e.Message;
  185. //InfoLog += "\n";
  186. //Logger.Print("Check all idel command failed", isError:true);
  187. //Logger.Print(e.Message, isError: true);
  188. return null;
  189. }
  190. }
  191. }
  192. }