ButtonStatusCheckPorcedure.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. using AwInitilizer.Assist;
  2. using AwInitilizer.Model;
  3. using InitializerModel;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.Specialized;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Net;
  11. using System.Security.AccessControl;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using System.Threading.Tasks;
  15. using System.Windows;
  16. namespace AwInitilizer.Procedure.ButtonStatusCheck
  17. {
  18. public enum ErrorType
  19. {
  20. None,
  21. ConnectFail,
  22. GetStatusFail,
  23. FirstButtonCheckFail,
  24. SecondButtonCheckFail,
  25. EmergencyButtonCheckFail,
  26. }
  27. public enum LogEvent
  28. {
  29. UnpressButtonTest
  30. }
  31. public class ButtonStatusCheckPorcedure : ProcedureBase
  32. {
  33. public ErrorType Error { get; set; } = ErrorType.None;
  34. private ProcedureLog.LogWriter<ButtonStatusCheckPorcedure, LogEvent> LogWriter;
  35. private readonly static Dictionary<LogEvent, string> ReportDict = new Dictionary<LogEvent, string>()
  36. {
  37. { LogEvent.UnpressButtonTest, "UnpressButtonTest" }
  38. };
  39. private readonly static Dictionary<LogEvent, string> LogDict = new Dictionary<LogEvent, string>()
  40. {
  41. { LogEvent.UnpressButtonTest, "Unpress check result" }
  42. };
  43. private HintDialog hintDialog = new HintDialog();
  44. public ButtonStatusCheckPorcedure() : base()
  45. {
  46. Name = "Button Press Test";
  47. Content = "Interaction to test button status";
  48. LogWriter = new ProcedureLog.LogWriter<ButtonStatusCheckPorcedure, LogEvent>(this)
  49. {
  50. ReportPair = ReportDict,
  51. LogPair = LogDict
  52. };
  53. }
  54. internal override async Task<bool> Run()
  55. {
  56. if (UpdateData.ButtonTestMode == ButtonTestModeType.SkipButtonTest)
  57. {
  58. return true;
  59. }
  60. //await PressBtnCheck(0);
  61. //DismisDialog();
  62. //await PressBtnCheck(1);
  63. //DismisDialog();
  64. //await PressBtnCheck(2);
  65. //DismisDialog();
  66. var response = await GetButtonStatus();
  67. if (response == null)
  68. {
  69. return false;
  70. }
  71. //stage 1 - unpress all
  72. if (!await CheckUnpressAllBtn())
  73. {
  74. return false;
  75. }
  76. //stage 2 - check press sequence
  77. //Logger.Print("Button press Status check Start");
  78. //MessageBox.Show("Press Button1,Button2,EmergencyButton in order\neach press continuous 2 secondes\nPress Ok to start", "Starting Button test");
  79. //Button1,Button2,EmergencyButton in order 0,1,2
  80. for (int testType = 0; testType < 3; testType++)
  81. {
  82. if ((testType == 1 || testType == 0) &&
  83. UpdateData.ButtonTestMode == ButtonTestModeType.SkipNormalButton)
  84. {
  85. continue;
  86. }
  87. if (testType == 2 &&
  88. UpdateData.ButtonTestMode == ButtonTestModeType.SkipEmergencyButton)
  89. {
  90. continue;
  91. }
  92. var checkResult = await PressBtnCheck(testType);
  93. if (!checkResult)
  94. {
  95. if (testType == 0)
  96. Error = ErrorType.FirstButtonCheckFail;
  97. else if (testType == 1)
  98. Error = ErrorType.SecondButtonCheckFail;
  99. else if (testType == 2)
  100. Error = ErrorType.EmergencyButtonCheckFail;
  101. return false;
  102. }
  103. }
  104. return true;
  105. }
  106. private async Task<bool> CheckUnpressAllBtn()
  107. {
  108. ShowDialog(
  109. Resx.AppResources.BtnPressUnpressHint,
  110. Resx.AppResources.BtnPressHintTitle,
  111. Resx.AppResources.Confirm,
  112. "", cancelAble: true);
  113. ButtonStatus status = await GetButtonStatus();
  114. if (status == null)
  115. {
  116. return false;
  117. }
  118. //LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton));
  119. LogWriter.Log(string.Format("Button unpress test result : {0}{1}{2}, Expect:000",
  120. status.Button1, status.Button2, status.EmergencyButton));
  121. LogWriter.Log(
  122. string.Format("Button1:{0},Button2:{1},EmgerncyButton:{2}",
  123. GetBtnStatusString(status.Button1),
  124. GetBtnStatusString(status.Button2),
  125. GetBtnStatusString(status.EmergencyButton)));
  126. bool isAllMatched = true;
  127. if (status != null)
  128. {
  129. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
  130. {
  131. if (status.Button1 != 0)
  132. {
  133. Error = ErrorType.FirstButtonCheckFail;
  134. LogWriter.Log("Button1 status ERROR, unpress is expected", isError: true);
  135. //Logger.Print("Button1 status ERROR, unpress is expected", isError: true);
  136. isAllMatched = false;
  137. }
  138. if (status.Button2 != 0)
  139. {
  140. Error = ErrorType.SecondButtonCheckFail;
  141. LogWriter.Log("Button2 status ERROR, unpress is expected", isError: true);
  142. //Logger.Print("Button2 status ERROR, unpress is expected", isError: true);
  143. isAllMatched = false;
  144. }
  145. }
  146. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
  147. {
  148. if (status.EmergencyButton != 0)
  149. {
  150. Error = ErrorType.EmergencyButtonCheckFail;
  151. LogWriter.Log("EmergencyButton status ERROR, unpress is expected", isError: true);
  152. //Logger.Print("EmergencyButton status ERROR, unpress is expected", isError: true);
  153. isAllMatched = false;
  154. }
  155. }
  156. if (isAllMatched)
  157. {
  158. LogWriter.Log("Unpress Check passed");
  159. LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton));
  160. return true;
  161. }
  162. else
  163. {
  164. LogWriter.Report(LogEvent.UnpressButtonTest, string.Format("{0}{1}{2}", status.Button1, status.Button2, status.EmergencyButton), isError: true);
  165. return false;
  166. }
  167. }
  168. else
  169. {
  170. LogWriter.Log("Unpress Check: Get button press status Failed", isError: true);
  171. LogWriter.Report(LogEvent.UnpressButtonTest, "empty", isError: true);
  172. return false;
  173. }
  174. }
  175. private async Task<bool> PressBtnCheck(int btnInt)
  176. {
  177. string btn, btnLang, imgUrl;
  178. (btn, btnLang, imgUrl) = GetBtnParam(btnInt);
  179. if (btnInt == 2)
  180. {
  181. ShowEmergencyBtnPressRequestDialog(imgUrl);
  182. }
  183. else
  184. {
  185. ShowBtnPressRequestDialog(btnLang, imgUrl);
  186. }
  187. var btnStatus = await WaitAndtGetPressBtn();
  188. if (btnStatus == null)
  189. {
  190. return false;
  191. }
  192. //LogWriter.Report($"{btn}PressTest", string.Format("{0}{1}{2}", btnStatus.Button1, btnStatus.Button2, btnStatus.EmergencyButton));
  193. LogWriter.Log($"Press check stage {btn} result:");
  194. LogWriter.Log(
  195. string.Format("Button1:{0},Button2:{1},EmgerncyButton:{2}",
  196. GetBtnStatusString(btnStatus.Button1),
  197. GetBtnStatusString(btnStatus.Button2),
  198. GetBtnStatusString(btnStatus.EmergencyButton)));
  199. DismisDialog();
  200. var btnStatusIsMatchedRequred = CheckBtnStatus(btnInt, btnStatus);
  201. LogWriter.Report($"{btn}PressTest", string.Format("{0}{1}{2}", btnStatus.Button1, btnStatus.Button2, btnStatus.EmergencyButton), isError: !btnStatusIsMatchedRequred);
  202. return btnStatusIsMatchedRequred;
  203. }
  204. private async Task<ButtonStatus> WaitAndtGetPressBtn()
  205. {
  206. ButtonStatus pressStatus = null;
  207. //retry 60 times, 60*0.5 = 30 seconds
  208. int testCnt;
  209. for (testCnt = 0; testCnt < 60; testCnt++)
  210. {
  211. await Task.Delay(500);
  212. pressStatus = await GetButtonStatus();
  213. if (pressStatus == null)
  214. {
  215. return null;
  216. }
  217. var isAnyButtonIsPressed = false;
  218. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
  219. {
  220. if (pressStatus.Button1 != 0 || pressStatus.Button2 != 0 )
  221. {
  222. isAnyButtonIsPressed = true;
  223. }
  224. }
  225. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
  226. {
  227. if (pressStatus.EmergencyButton != 0)
  228. {
  229. isAnyButtonIsPressed = true;
  230. }
  231. }
  232. //if any button is pressed
  233. //if (pressStatus.Button1 != 0 ||
  234. // pressStatus.Button2 != 0 ||
  235. // pressStatus.EmergencyButton != 0)
  236. if (isAnyButtonIsPressed)
  237. {
  238. await WaitAllBtnRelease();
  239. break;
  240. }
  241. }
  242. return pressStatus;
  243. }
  244. private bool CheckBtnStatus(int btnInt, ButtonStatus buttonStatus)
  245. {
  246. if (buttonStatus.Button1 == (btnInt == 0 ? 1 : 0) &&
  247. buttonStatus.Button2 == (btnInt == 1 ? 1 : 0) &&
  248. buttonStatus.EmergencyButton == (btnInt == 2 ? 1 : 0))
  249. {
  250. //Status correct
  251. return true;
  252. }
  253. else
  254. {
  255. return false;
  256. }
  257. }
  258. private void ShowEmergencyBtnPressRequestDialog(string imgUrl)
  259. {
  260. ShowDialog(
  261. string.Format(Resx.AppResources.EmergencyBtnPressPressHint),
  262. Resx.AppResources.BtnPressHintTitle,
  263. "", imgUrl, cancelAble: false);
  264. }
  265. private void ShowBtnPressRequestDialog(string btnLang, string imgUrl)
  266. {
  267. ShowDialog(
  268. string.Format(Resx.AppResources.BtnPressPressHint, btnLang),
  269. Resx.AppResources.BtnPressHintTitle,
  270. "", imgUrl, cancelAble: false);
  271. }
  272. private (string btn, string btnLang, string imgUrl) GetBtnParam(int btnInt)
  273. {
  274. string btn, btnLang, imgUrl;
  275. switch (btnInt)
  276. {
  277. case 1:
  278. btn = "Green Button";
  279. btnLang = Resx.AppResources.BtnPressGreenBtn;
  280. imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Green.png";
  281. break;
  282. case 0:
  283. btn = "Blue Button";
  284. btnLang = Resx.AppResources.BtnPressBlueBtn;
  285. imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Blue.png";
  286. break;
  287. case 2:
  288. btn = "EmergencyButton";
  289. btnLang = Resx.AppResources.BtnPressEmergencyBtn;
  290. imgUrl = "pack://application:,,,/AwInitilizer;component/Image/Emergency.png";
  291. break;
  292. default:
  293. btn = "";
  294. btnLang = "";
  295. imgUrl = null;
  296. break;
  297. };
  298. return (btn, btnLang, imgUrl);
  299. }
  300. private async Task WaitAllBtnRelease()
  301. {
  302. ButtonStatus status;
  303. //wait release
  304. for (var releaseCnt = 0; releaseCnt < 20; releaseCnt++)
  305. {
  306. await Task.Delay(500);
  307. status = await GetButtonStatus();
  308. if (status == null)
  309. {
  310. //InfoLog += "Get Butoon state failed\n";
  311. //Logger.Print("Get Butoon state failed");
  312. continue;
  313. }
  314. bool isAllBtnReleased = true;
  315. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipNormalButton)
  316. {
  317. if (status.Button1 != 0 || status.Button2 != 0)
  318. {
  319. isAllBtnReleased = false;
  320. }
  321. }
  322. if (UpdateData.ButtonTestMode != ButtonTestModeType.SkipEmergencyButton)
  323. {
  324. if (status.EmergencyButton != 0)
  325. {
  326. isAllBtnReleased = false;
  327. }
  328. }
  329. //if (status.Button1 == 0 &&
  330. // status.Button2 == 0 &&
  331. // status.EmergencyButton == 0)
  332. if (isAllBtnReleased)
  333. {
  334. break;
  335. }
  336. }
  337. }
  338. internal async Task<ButtonStatus> GetButtonStatus(bool isConnectTest = false)
  339. {
  340. try
  341. {
  342. var result = await EvApi.GetButtonStatus();
  343. LogWriter.Log($"Get respone : {result.Response}", isDebugLog: true);
  344. return result.Result;
  345. }
  346. catch (Exception e)
  347. {
  348. if (!isConnectTest)
  349. {
  350. Error = ErrorType.GetStatusFail;
  351. LogWriter.Log("Get Button Status Failed", isError: true);
  352. LogWriter.Log(e.Message, isDebugLog: true);
  353. }
  354. }
  355. return null;
  356. }
  357. private string GetBtnStatusString(int status)
  358. {
  359. if (status == 1)
  360. return "Pressed";
  361. else if (status == 0)
  362. return "Unpressed";
  363. else
  364. return status.ToString();
  365. }
  366. private void ShowDialog(string msg, string title, string btnText, string imgUrl, bool cancelAble)
  367. {
  368. hintDialog = new HintDialog();
  369. hintDialog.Owner = Application.Current.MainWindow;
  370. hintDialog.Message = msg;
  371. hintDialog.Title = title;
  372. hintDialog.IsCancelAble = cancelAble;
  373. hintDialog.BtnText = btnText;
  374. hintDialog.ImgPath = imgUrl;
  375. if (cancelAble)
  376. {
  377. hintDialog.ShowDialog();
  378. }
  379. else
  380. {
  381. hintDialog.Show();
  382. }
  383. }
  384. private void DismisDialog()
  385. {
  386. if (hintDialog == null)
  387. return;
  388. hintDialog.Close();
  389. }
  390. }
  391. }