using AwInitilizer.Assist; using AwInitilizer.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Net; using System.Security.AccessControl; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; namespace AwInitilizer.Procedure { public class ButtonStatusCheckPorcedure : ProcedureBase { private HintDialog hintDialog = new HintDialog(); public ButtonStatusCheckPorcedure() : base() { Name = "Button Press Test"; Content = "Interaction to test button status"; } internal override async Task Run() { Logger.Print("Button Unpress Status check Start"); //stage 0 - wait system ready //wait restart Logger.Print("Waiting response.."); bool response = false; int pollinfCnt = 0; for (pollinfCnt = 0; pollinfCnt < 14; pollinfCnt++) { await Task.Delay(TimeSpan.FromSeconds(30)); response = await CheckAllIdel(); if (response) break; } //timeout if (pollinfCnt >= 14) { Logger.Print("Wait EVSE timeout", isError: true); return false; } //stage 1 - unpress all ShowDialog("Please make sure All button is Unpressed\nPress Ok while complete", "Starting Button test", "OK","", cancelAble: true); ButtonStatus status = await GetButtonStatus(); if (status == null) { InfoLog += "Get Butoon state failed\n"; Logger.Print("Get Butoon state failed"); return false; } InfoLog += "Unpress check result\n"; InfoLog += $"Button1:{status.Button1},Button2:{status.Button2},EmgerncyButton:{status.EmergencyButton}\n"; LogPair.Add("UnpressButtonTest", string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton)); bool isAllMatched = true; if (status != null) { isAllMatched = true; if (status.Button1 != 0) { Logger.Print("Button1 status ERROR, unpress is ecpected", isError: true); isAllMatched = false; } if (status.Button2 != 0) { Logger.Print("Button3 status ERROR, unpress is ecpected", isError: true); isAllMatched = false; } if (status.EmergencyButton != 0) { Logger.Print("EmergencyButton status ERROR, unpress is ecpected", isError: true); isAllMatched = false; } if (isAllMatched) { Logger.Print("Unpress Check passed"); } else { return false; } } else { Logger.Print("Get button press status Failed", isError: true); return false; } //stage 2 - check press sequence Logger.Print("Button Unpress Status check Start"); //MessageBox.Show("Press Button1,Button2,EmergencyButton in order\neach press continuous 2 secondes\nPress Ok to start", "Starting Button test"); bool isError = false; //Button1,Button2,EmergencyButton in order 0,1,2 ButtonStatus pressStatus = null; for (int testType = 0; testType < 3; testType++) { string btn,imgUrl; switch (testType) { case 0: btn = "Green Button"; imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Green.png"; break; case 1: btn = "Blue Button"; imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Blue.png"; break; case 2: btn = "EmergencyButton"; imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Emergency.png"; break; default: btn = ""; imgUrl = null; break; }; //MessageBox.Show($"press {btn}"); ShowDialog($"PRESS {btn.ToUpper()}", "Button press test", "", imgUrl, cancelAble: false); //retry 20 times, 20*0.5 = 10 seconds int testCnt; for (testCnt = 0; testCnt < 20; testCnt++) { await Task.Delay(500); pressStatus = await GetButtonStatus(); if (pressStatus == null) { InfoLog += "Get Butoon state failed\n"; Logger.Print("Get Butoon state failed"); return false; } //if any button is pressed if (pressStatus.Button1 != 0 || pressStatus.Button2 != 0 || pressStatus.EmergencyButton != 0) { bool success = false; if (pressStatus.Button1 == (testType == 0 ? 1 : 0) && pressStatus.Button2 == (testType == 1 ? 1 : 0) && pressStatus.EmergencyButton == (testType == 2 ? 1 : 0)) { //Status correct success = true; } else { //Status error isError = true; success = false; break; } if (success) { //wait release for (var releaseCnt = 0; releaseCnt < 20; releaseCnt++) { await Task.Delay(500); status = await GetButtonStatus(); if (status == null) { InfoLog += "Get Butoon state failed\n"; Logger.Print("Get Butoon state failed"); return false; } if (status.Button1 == 0 && status.Button2 == 0 && status.EmergencyButton == 0) { break; } } break; } } } DismisDialog(); InfoLog += $"Press check stage {btn} result\n"; InfoLog += $"Button1:{pressStatus.Button1},Button2:{pressStatus.Button2},EmgerncyButton:{pressStatus.EmergencyButton}\n"; LogPair.Add($"{btn}PressTest", string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton)); if (testCnt >= 20) { isError = true; Logger.Print($"{btn} press TIMEOUT", isError: true); break; } else if (isError) { Logger.Print($"{btn} press state ERROR", isError: true); Logger.Print($"Button1 {GetBtnStatusString(pressStatus.Button1)}, Button2 {GetBtnStatusString(pressStatus.Button2)}, EmergencyButton {GetBtnStatusString(pressStatus.EmergencyButton)}", isError: true); break; } else { Logger.Print($"{btn} press state passed"); } } if(isError) return false; return true; } internal async Task GetButtonStatus(bool isConnectTest = false) { try { using (WebClientTimeout webClient = new WebClientTimeout()) { using (Stream stream = await webClient.OpenReadTaskAsync($"https://{ServerIpAddress}/get_button_action.php")) // 使用 StreamReader 讀取 stream 內的字元 using (StreamReader reader = new StreamReader(stream)) { // 將 StreamReader 所讀到的字元轉為 string string request = reader.ReadToEnd(); InfoLog += $"Get respone : {request}\n"; var values = JsonConvert.DeserializeObject(request); return values; } } } catch (Exception e) { if (!isConnectTest) { InfoLog += "Get Button Status Failed\n"; InfoLog += e.Message; InfoLog += "\n"; Logger.Print("Get Button Status Failed", isError: true); Logger.Print(e.Message + "", isError: true); } } return null; } private async Task CheckAllIdel() { try { using (Assist.WebClientTimeout webClient = new Assist.WebClientTimeout()) { 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(); InfoLog += $"get status respons:\n{request}\n"; LogPair.Add($"EvseStatus", request); Regex rx = new Regex("(SystemStatus)\\\": (\\d)"); var matches = rx.Matches(request); bool isAllPassed = true; for (int matchIndex = 0; matchIndex < matches.Count; matchIndex++) { var match = matches[matchIndex]; if (match.Groups.Count != 3) { InfoLog += $"Connector {matchIndex} status string mismatched\n"; Logger.Print($"Connector {matchIndex} status string mismatched", isError: true); isAllPassed = false; } else { if (match.Groups[2].Value != "1") { InfoLog += $"Connector {matchIndex} status not Idel\n"; Logger.Print($"Connector {matchIndex} status not Idel", isError: true); isAllPassed = false; } } } return isAllPassed; } } return true; } catch (Exception e) { return false; } } private string GetBtnStatusString(int status) { if (status == 1) return "Pressed"; else if (status == 0) return "Unpressed"; else return status.ToString(); } private void ShowDialog(string msg,string title, string btnText,string imgUrl, bool cancelAble) { hintDialog = new HintDialog(); hintDialog.Owner = Application.Current.MainWindow; hintDialog.Message = msg; hintDialog.Title = title; hintDialog.IsCancelAble = cancelAble; hintDialog.BtnText = btnText; hintDialog.ImgPath = imgUrl; if (cancelAble) { hintDialog.ShowDialog(); } else { hintDialog.Show(); } } private void DismisDialog() { if (hintDialog == null) return; hintDialog.Close(); } } }