using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace AwInitilizer.Procedure.RestarttoIdel { public enum ErrorType { None, SetFail, ConnectorNotIdel, } public enum LogEvent { IdelCheck } public class RestarttoIdelProcedure : ProcedureBase { public ErrorType Error { get; set; } = ErrorType.None; private ProcedureLog.LogWriter LogWriter; private readonly static Dictionary ReportDict = new Dictionary() { { LogEvent.IdelCheck, "IdelCheck" } }; private readonly static Dictionary LogDict = new Dictionary() { { LogEvent.IdelCheck, "Connector status is Idel Check :{0}" } }; public RestarttoIdelProcedure() : base() { Name = "Restart To Idel"; Content = "Restart EVSSE and check status back to Idel"; LogWriter = new ProcedureLog.LogWriter(this) { ReportPair = ReportDict, LogPair = LogDict }; } internal override async Task Run() { var result = await FactorySet(); if (!result) { Error = ErrorType.SetFail; return false; } else { LogWriter.Log("Waiting Factory reset complete..."); //Logger.Print("Waiting Factory reset complete..."); await Task.Delay(TimeSpan.FromMinutes(2)); if (await CheckAllIdel()) { LogWriter.Report(LogEvent.IdelCheck,"success"); //Logger.Print("All Connetor is Idel"); return true; } else { LogWriter.Report(LogEvent.IdelCheck, "fail"); Error = ErrorType.ConnectorNotIdel; return false; } } } private async Task FactorySet() { try { using (WebClient webClient = new WebClient()) { NameValueCollection parameters = new NameValueCollection(); parameters.Add("SystemId", ""); parameters.Add("SystemDateTime", ""); parameters.Add("PhaseLossPolicy", ""); parameters.Add("FactoryConfiguration", "1"); parameters.Add("AuthorisationMode", ""); parameters.Add("isAPP", ""); parameters.Add("isQRCode", ""); parameters.Add("isRFID", ""); parameters.Add("QRCodeMadeMode", ""); parameters.Add("QRCodeContent", ""); parameters.Add("Intensity", ""); parameters.Add("RfidCardNumEndian", ""); parameters.Add("PsuAcInputType", ""); webClient.QueryString = parameters; using (Stream stream = await webClient.OpenReadTaskAsync($"https://{ServerIpAddress}/set_system_action.php")) // 使用 StreamReader 讀取 stream 內的字元 using (StreamReader reader = new StreamReader(stream)) { // 將 StreamReader 所讀到的字元轉為 string string response = reader.ReadToEnd(); //InfoLog += $"factory set respons:\n{request}\n"; LogWriter.Log($"factory set respons: {response}", isDebugLog: true); var values = JsonConvert.DeserializeObject>(response); } } return true; } catch (Exception e) { LogWriter.Log("Factory reset command failed"); LogWriter.Log(e.Message, isDebugLog: true); //InfoLog += "Factory reset command failed\n"; //InfoLog += e.Message; //InfoLog += "\n"; //Logger.Print("Factory reset command failed", isError: true); //Logger.Print(e.Message, isError: true); return false; } } private async Task CheckAllIdel() { var statusPairs = await GetConnectorStatus(); if (statusPairs is null) return false; else { foreach (var statusPair in statusPairs) { if (statusPair.Value != "1") { LogWriter.Log($"Connector {statusPair.Key} status not Idel"); return false; //InfoLog += $"Connector {matchIndex} status not Idel\n"; //Logger.Print($"Connector {matchIndex} status not Idel", isError: true); } } return true; } } private async Task> GetConnectorStatus() { Dictionary connectorStatusPair = new Dictionary(); try { using (WebClient webClient = new WebClient()) { NameValueCollection parameters = new NameValueCollection(); parameters.Add("opt", "2"); webClient.QueryString = parameters; using (Stream stream = await webClient.OpenReadTaskAsync($"https://{ServerIpAddress}/get_query_action.php")) // 使用 StreamReader 讀取 stream 內的字元 using (StreamReader reader = new StreamReader(stream)) { // 將 StreamReader 所讀到的字元轉為 string string request = reader.ReadToEnd(); LogWriter.Log($"get status respons:\n{request}\n", isDebugLog: true); //InfoLog += $"get status respons:\n{request}\n"; //LogPair.Add($"EvseStatus", request); Regex rx = new Regex("(SystemStatus)\\\": (\\d)"); var matches = rx.Matches(request); for (int matchIndex = 0; matchIndex < matches.Count; matchIndex++) { var match = matches[matchIndex]; if (match.Groups.Count != 3) { LogWriter.Log($"Connector {matchIndex} status string mismatched"); return null; //InfoLog += $"Connector {matchIndex} status string mismatched\n"; //Logger.Print($"Connector {matchIndex} status string mismatched", isError:true); } else { connectorStatusPair.Add(matchIndex, match.Groups[2].Value); } } } } return connectorStatusPair; } catch (Exception e) { LogWriter.Log("Get connector status command failed"); LogWriter.Log(e.Message, isDebugLog: true); //InfoLog += "Check all idel command failed\n"; //InfoLog += e.Message; //InfoLog += "\n"; //Logger.Print("Check all idel command failed", isError:true); //Logger.Print(e.Message, isError: true); return null; } } } }