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.Threading.Tasks; using System.Windows; namespace AwInitilizer.Procedure { public class ButtonStatusCheckPorcedure : ProcedureBase { 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 1 - unpress all MessageBox.Show("Please make sure All button is Unpressed\nPress Ok while complete", "Starting Button test"); 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"; bool isAllMatched = true; if (status != null) { isAllMatched = true; if (status.Button1 != 1) { Logger.Print("Button1 status ERROR, unpress is ecpected", isError: true); isAllMatched = false; } if (status.Button2 != 1) { Logger.Print("Button3 status ERROR, unpress is ecpected", isError: true); isAllMatched = false; } if (status.EmergencyButton != 1) { 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++) { //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) { if (pressStatus.Button1 == (testType == 0 ? 1 : 0) && pressStatus.Button2 == (testType == 1 ? 1 : 0) && pressStatus.EmergencyButton == (testType == 2 ? 1 : 0)) { //Status correct } else { //Status error isError = true; break; } //wait release for (testCnt = 0; testCnt < 20; testCnt++) { 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; } } } } string btn; switch (testType) { case 0: btn = "Button1"; break; case 1: btn = "Button2"; break; case 2: btn = "EmergencyButton"; break; default: btn = ""; break; }; InfoLog += $"Press check stage {btn} result\n"; InfoLog += $"Button1:{pressStatus.Button1},Button2:{pressStatus.Button2},EmgerncyButton:{pressStatus.EmergencyButton}\n"; if (testCnt >= 20) { 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() { 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) { 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 string GetBtnStatusString(int status) { if (status == 1) return "Pressed"; else if (status == 0) return "Unpressed"; else return status.ToString(); } } }