892a6f90adf3db1a03b42272d6480a09106da482.svn-base 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Windows.Forms.DataVisualization.Charting;
  9. namespace FPER
  10. {
  11. public partial class Form_AnalogDetecter : Form
  12. {
  13. // 메인
  14. MDIParent mdi = null;
  15. _Popup Popup = new _Popup(null); // mdi 는 널로 대체함
  16. // 초기화 버튼을 누를때 되돌리는 값
  17. string Current_Fault = "";
  18. string Current_PreFire = "";
  19. string Current_FireDay = "";
  20. string Current_FireNight = "";
  21. // 갱신되는 데이터
  22. int[] Data = new int[44];
  23. string tempReceiverID, tempCommBoard, tempLoop, tempRepeaterID;
  24. //string ReceiverID = null; // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  25. // cyim 2016.04.06 : mdi 신규창에서 windows base timer 리소스 접근 문제
  26. public Timer t = new Timer();
  27. public Form_AnalogDetecter(string ReceiverID, string CommBoard, string Loop, string RepeaterID, string RepeaterType, MDIParent mdiparent)
  28. {
  29. InitializeComponent();
  30. // 라이팅에 대한 응답
  31. _Event.AnalogDetecter_SendMessage_Event += new _Event.AnalogDetecter_SendMessage_Handler(_Event_AnalogDetecter_SendMessage);
  32. // 이벤트 핸들러 등록
  33. this.FormClosing += new FormClosingEventHandler(Form_AnalogDetecter_FormClosing);
  34. // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  35. mdi = mdiparent;
  36. ReceiverID = mdi.MyReceiverID.ToString();
  37. tempReceiverID = ReceiverID;
  38. tempCommBoard = CommBoard;
  39. tempLoop = Loop;
  40. tempRepeaterID = RepeaterID;
  41. // UI
  42. this.TopMost = true;
  43. this.label_AnalogDetecter_Receiver_Value.Text = ReceiverID;
  44. this.label_AnalogDetecter_CommBoard_Value.Text = CommBoard;
  45. this.label_AnalogDetecter_Loop_Value.Text = Loop;
  46. this.label_AnalogDetecter_ID_Value.Text = RepeaterID;
  47. // cyim 2016.11.23 : 아날로그 감지기 레벨값 설정 제한
  48. if (RepeaterType == "C")
  49. {
  50. this.label_AnalogDetecter_Type_Value.Text = "연감지기";
  51. this.label_FireDay_MinMax.Text = "(34~64)";
  52. this.label_FireNight_MinMax.Text = "(34~64)";
  53. }
  54. else if (RepeaterType == "D")
  55. {
  56. this.label_AnalogDetecter_Type_Value.Text = "열감지기";
  57. this.label_FireDay_MinMax.Text = "(80~95)";
  58. this.label_FireNight_MinMax.Text = "(80~95)";
  59. }
  60. else this.label_AnalogDetecter_Type_Value.Text = "감지기";
  61. this.label_Information_Current_Color.Text = "None";
  62. this.label_Information_Current_Color.BackColor = Color.Transparent;
  63. string Day = (mdi.AnalogDetect.FireDayTime == true) ? "낮" : "밤";
  64. this.label_Information_Current.Text = string.Format("▶ 현재상태 : {0} ({1})", "None", Day);
  65. this.label_Information_Average.Text = string.Format("▶ 평균값 : {0}", "None");
  66. this.label_Information_Max.Text = string.Format("▶ 최대값 : {0}", "None");
  67. this.label_Information_Min.Text = string.Format("▶ 최소값 : {0}", "None");
  68. // 레벨값은 편집 불가 상태 (편집버튼 누른 이후에만 텍스트 박스 및 저장버튼 사용가능함)
  69. Level_Edit_Enable(false);
  70. // 그래프 속성
  71. Chart_Setup();
  72. //
  73. // 현재 데이타 베이스 조회하여 설정값을 가져온다
  74. //
  75. // 해당 아날로그 디바이스의 레벨값
  76. DacUIProcess dacUIProcess_TB_ANALOG_DEVICE = new DacUIProcess(Int32.Parse(ReceiverID));// cyim 2015.7.30 데이타베이스 접속 루틴 변경
  77. String SQL = "";
  78. SQL += " SELECT FAULT_VALUE,PREFIRE_VALUE,FIRED_VALUE,FIREN_VALUE";
  79. SQL += " FROM TB_ANALOG_DEVICE_2 ";
  80. SQL += string.Format(" WHERE RECEIVER_ID='{0}' AND COMM_ID='{1}' AND BOARD_ID='{2}' AND LOOP_NO='{3}' AND REPEATER_ID='{4}'", ReceiverID, "1", CommBoard, Loop, RepeaterID);
  81. // cyim 2016.06.15 : 아날로그 감지기 출력 포인트 고려 : 레벨값은 입력포인트만 고려한다
  82. // 출력포인트가 있을경우에는 레벨값 조회시 중계기 아이디가 중복되어 버린다
  83. SQL += " AND INOUT_TYPE ='I' ";
  84. DataSet dao_TB_ANALOG_DEVICE = dacUIProcess_TB_ANALOG_DEVICE.Select(SQL);
  85. DataTable dt_TB_ANALOG_DEVICE = dao_TB_ANALOG_DEVICE.Tables[0];
  86. if (dt_TB_ANALOG_DEVICE.Rows.Count != 0)
  87. {
  88. foreach (DataRow dr in dt_TB_ANALOG_DEVICE.Rows)
  89. {
  90. Current_Fault = this.textbox_Level_Fault.Text = dr["FAULT_VALUE"].ToString();
  91. Current_PreFire = this.textbox_Level_PreFire.Text = dr["PREFIRE_VALUE"].ToString();
  92. Current_FireDay = this.textbox_Level_FireDay.Text = dr["FIRED_VALUE"].ToString();
  93. Current_FireNight = this.textbox_Level_FireNight.Text = dr["FIREN_VALUE"].ToString();
  94. }
  95. }
  96. // 그래프 초기화
  97. int[] Init_Data = new int[44];
  98. System.Array.Clear(Init_Data, 0, 44);
  99. Trend_Update(Init_Data);
  100. // 트렌드 값 요청
  101. Trend_Read();
  102. // 기타 // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  103. mdi.AnalogDetect.Form_Active_AnalogDetecter = true;
  104. //
  105. // 타이머
  106. //
  107. // 트렌드 값 갱신
  108. //mdi.Timer_WindowBase.Create(ReceiverID + ":" + "Trend_Read_Timer", 15000, Trend_Read_Timer_Tick, true); // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  109. // cyim 2016.04.06 : mdi 신규창에서 windows base timer 리소스 접근 문제
  110. // 아날로그 감지기 창 정보와 같이 mdi 기반에서 새롭게 생성된 창의 정보에서는
  111. // 전역 타이머로 접근하려면 리소스 접근에 문제가 있다 (라벨 정보를 알수가 없다)
  112. // 아래와 같이 내부적으로 직접 타이머를 직접 생성하고 관리해야만 리소스에 접근이 가능하다
  113. // 위와 같이 처리하게 되면 처음만 가동된다.
  114. t.Interval = 15000;
  115. t.Tick += new EventHandler(Trend_Read_Timer_Tick);
  116. t.Enabled = true;
  117. }
  118. // 폼이 종료
  119. private void Form_AnalogDetecter_FormClosing(object sender, FormClosingEventArgs e)
  120. {
  121. // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  122. mdi.AnalogDetect.Form_Active_AnalogDetecter = false;
  123. // cyim 2016.04.06 : mdi 신규창에서 windows base timer 리소스 접근 문제
  124. //mdi.Timer_WindowBase.Delete(ReceiverID + ":" + "Trend_Read_Timer");
  125. // 라이팅에 대한 응답
  126. _Event.AnalogDetecter_SendMessage_Event -= new _Event.AnalogDetecter_SendMessage_Handler(_Event_AnalogDetecter_SendMessage);
  127. }
  128. public void _Event_AnalogDetecter_SendMessage(CmdInfo cmd)
  129. {
  130. Level_Write_Complete(cmd);
  131. }
  132. //
  133. // UI
  134. //
  135. // 레벨값은 편집 가능 상태
  136. private void Level_Edit_Enable(bool Enable)
  137. {
  138. this.button_Level_Save.Enabled = Enable;
  139. this.textbox_Level_Fault.Enabled = Enable;
  140. this.textbox_Level_PreFire.Enabled = Enable;
  141. this.textbox_Level_FireDay.Enabled = Enable;
  142. this.textbox_Level_FireNight.Enabled = Enable;
  143. }
  144. // 그래프 속성 셋팅
  145. private void Chart_Setup()
  146. {
  147. // 축 최대값
  148. this.chart_trend.ChartAreas[0].AxisY.Maximum = 140;
  149. this.chart_trend.ChartAreas[0].AxisX.Maximum = 44;
  150. //
  151. this.chart_trend.Series[0].ChartType = SeriesChartType.Column;
  152. this.chart_trend.Series[0].BorderWidth = 3;
  153. this.chart_trend.Series[0].XValueType = ChartValueType.Int32;
  154. this.chart_trend.Series[0].IsXValueIndexed = false;
  155. }
  156. // 챠트에 트렌드 데이타를 적용한다
  157. private void Trend_Update(int[] Data)
  158. {
  159. this.chart_trend.Series[0].Points.Clear();
  160. // 데이타는 총 44개이다
  161. // 시간별 : 24
  162. // 10분별 : 6
  163. // 1분별 : 10
  164. // 15초별 : 4
  165. for (int i = 0; i < 44; i++)
  166. {
  167. DataPoint Point = new DataPoint(i, Data[43 - i]);
  168. this.chart_trend.Series[0].Points.Add(Point);
  169. }
  170. }
  171. // 정보창을 업데이트 한다
  172. private void Information_Update()
  173. {
  174. string Day = (mdi.AnalogDetect.FireDayTime == true) ? "낮" : "밤"; // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  175. this.label_Information_Current.Text = string.Format("▶ 현재상태 : {0} ({1})", Data[0], Day);
  176. this.label_Information_Average.Text = string.Format("▶ 평균값 : {0}", Get_AverageValue(Data));
  177. this.label_Information_Max.Text = string.Format("▶ 최대값 : {0}", Get_MaxValue(Data));
  178. this.label_Information_Min.Text = string.Format("▶ 최소값 : {0}", Get_MinValue(Data));
  179. AnalogLevel Level = new AnalogLevel(
  180. Int32.Parse(Current_Fault), Int32.Parse(Current_PreFire), Int32.Parse(Current_FireDay), Int32.Parse(Current_FireNight));
  181. // 레벨에 따라 변경 (Normal : 0, Fault :1, PreFire : 2, Fire : 3)
  182. switch (mdi.AnalogDetect.Get_LevelStatus(Data[0], Level)) // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  183. {
  184. case 0:
  185. this.label_Information_Current_Color.Text = "Normal";
  186. this.label_Information_Current_Color.BackColor = Color.Lime;
  187. break;
  188. case 1:
  189. this.label_Information_Current_Color.Text = "Fault";
  190. this.label_Information_Current_Color.BackColor = Color.Silver;
  191. break;
  192. case 2:
  193. this.label_Information_Current_Color.Text = "PreFire";
  194. this.label_Information_Current_Color.BackColor = Color.HotPink;
  195. break;
  196. case 3:
  197. this.label_Information_Current_Color.Text = "Fire";
  198. this.label_Information_Current_Color.BackColor = Color.Red;
  199. break;
  200. }
  201. }
  202. // 최대값 구하기
  203. private int Get_MaxValue(int[] Data)
  204. {
  205. int result = 0;
  206. for (int i = 0; i < 44; i++)
  207. if (result < Data[i])
  208. result = Data[i];
  209. return result;
  210. }
  211. // 최소값 구하기
  212. private int Get_MinValue(int[] Data)
  213. {
  214. int result = 127;
  215. for (int i = 0; i < 44; i++)
  216. if (result > Data[i])
  217. result = Data[i];
  218. return result;
  219. }
  220. // 평균값 구하기
  221. private int Get_AverageValue(int[] Data)
  222. {
  223. // 24시간 데이터만 수집
  224. //
  225. // 그래프 : 참고로 24시간 데이터 인덱스는 20~43 까지이다
  226. //int[] Data = new int[44]{
  227. // // 시간별 : 24
  228. // 10,10,10,10,10,10,10,10,10,10,10,10,
  229. // 10,10,10,10,10,10,10,10,10,10,10,10,
  230. // // 10분별 : 6
  231. // 10,10,10,10,10,10,
  232. // // 1분별 : 10
  233. // 10,10,10,10,10,10,10,10,10,10,
  234. // // 15초별 : 4
  235. // 10,10,10,10
  236. // };
  237. int result = 0;
  238. for (int i = 20; i < 44; i++)
  239. result = result + Data[i];
  240. return result / 24;
  241. }
  242. //
  243. // 이벤트
  244. //
  245. // 레벨 편집
  246. private void button_Level_Edit_Click(object sender, EventArgs e)
  247. {
  248. // 저장버튼은 사용
  249. Level_Edit_Enable(true);
  250. }
  251. // 레벨 초기화 (처음 설정된 값으로)
  252. private void button_Level_Init_Click(object sender, EventArgs e)
  253. {
  254. // UI
  255. this.textbox_Level_Fault.Text = Current_Fault;
  256. this.textbox_Level_PreFire.Text = Current_PreFire;
  257. this.textbox_Level_FireDay.Text = Current_FireDay;
  258. this.textbox_Level_FireNight.Text = Current_FireNight;
  259. // 편집불가
  260. Level_Edit_Enable(false);
  261. }
  262. // 레벨 저장
  263. private void button_Level_Save_Click(object sender, EventArgs e)
  264. {
  265. try
  266. {
  267. // 잘못된 값을 내리면 안된다.
  268. int falut = Int32.Parse(this.textbox_Level_Fault.Text.Trim());
  269. int prefire = Int32.Parse(this.textbox_Level_PreFire.Text.Trim());
  270. int fireday = Int32.Parse(this.textbox_Level_FireDay.Text.Trim());
  271. int firenight = Int32.Parse(this.textbox_Level_FireNight.Text.Trim());
  272. // Falut 값은 반드시 양수여야 한다
  273. if (falut < 0)
  274. MessageBox.Show("Falut 값은 반드시 양수여야 한다");
  275. else if (prefire <= falut)
  276. MessageBox.Show("PreFire 값은 반드시 Falut값보다 커야 한다");
  277. else if (fireday <= prefire || firenight <= prefire)
  278. MessageBox.Show("Fire Day 및 Fire Night 값은 PreFire 값보다 커야 한다");
  279. // cyim 2016.11.23 : 아날로그 감지기 레벨값 설정 제한
  280. else if (this.label_AnalogDetecter_Type_Value.Text == "열감지기" && (fireday < 80 || fireday > 95))
  281. MessageBox.Show("Fire Day 레벨 값은 80 ~ 95 사이 값이어야 한다");
  282. else if (this.label_AnalogDetecter_Type_Value.Text == "열감지기" && (firenight < 80 || firenight > 95))
  283. MessageBox.Show("Fire Night 레벨 값은 80 ~ 95 사이 값이어야 한다");
  284. else if (this.label_AnalogDetecter_Type_Value.Text == "연감지기" && (fireday < 34 || fireday > 64))
  285. MessageBox.Show("Fire Day 레벨 값은 34 ~ 64 사이 값이어야 한다");
  286. else if (this.label_AnalogDetecter_Type_Value.Text == "연감지기" && (firenight < 34 || firenight > 64))
  287. MessageBox.Show("Fire Night 레벨 값은 34 ~ 64 사이 값이어야 한다");
  288. else
  289. {
  290. if (MessageBox.Show("저장하시겠습니까?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)
  291. {
  292. // 편집불가
  293. Level_Edit_Enable(false);
  294. // 레벨값 쓰기 명령
  295. Level_Write();
  296. }
  297. }
  298. }
  299. catch (Exception ex)
  300. {
  301. Util.UErrorMessage(ex, 0, 0);
  302. MessageBox.Show("입력값은 반드시 정수타입이어야 합니다");
  303. }
  304. }
  305. //
  306. // 타이머
  307. //
  308. private void Trend_Read_Timer_Tick(object sender, EventArgs e)
  309. {
  310. Trend_Read();
  311. }
  312. //
  313. // 통신부
  314. //
  315. // 데몬에 현재 트랜드 값을 요청한다
  316. private void Trend_Read()
  317. {
  318. try
  319. {
  320. // cyim 2016.01.07 중계기상태보기 화면에서 에러팝업출력
  321. if (this.label_AnalogDetecter_Loop_Value.Text == null || this.label_AnalogDetecter_Loop_Value.Text.Length == 0
  322. || this.label_AnalogDetecter_CommBoard_Value.Text == null || this.label_AnalogDetecter_CommBoard_Value.Text.Length == 0
  323. || this.label_AnalogDetecter_ID_Value.Text == null || this.label_AnalogDetecter_ID_Value.Text.Length == 0)
  324. return;
  325. // 완료 이벤트
  326. dCommandResponse d = new dCommandResponse(Trend_Read_Complete);
  327. // cyim 2016.12.07 : 수신기 모델별 내부 로직 변경
  328. //if (mdi.ReceiverModel == "IFC3300")
  329. //{
  330. // // 명령어 생성
  331. // CmdInfo cmd = new CmdInfo(
  332. // // 0x24
  333. // prt_cmd_define.read_analogdetecter_trend,
  334. // // 수신기 아이디
  335. // mdi.myReceiverID,
  336. // // Comm ID
  337. // 1,
  338. // // Loop No
  339. // Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  340. // // Board ID
  341. // Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  342. // // Repeater ID
  343. // Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  344. // // Event
  345. // d
  346. // );
  347. // // 데몬에 요청
  348. // this.mdi.ui.runCommand(cmd);
  349. //}
  350. //else
  351. //{
  352. // cyim 2016.10.27 : 대용량 수신기 아날로그 감지기 트랜드 읽기
  353. // 하단 주석은 삭제 금지
  354. // 명령어 생성
  355. CmdInfo cmd = new CmdInfo(
  356. // 0x76
  357. prt_cmd_define.read_command_status,
  358. // 수신기 아이디
  359. mdi.myReceiverID,
  360. // Comm ID
  361. 1,
  362. // Loop No
  363. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  364. // Board ID
  365. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  366. // Repeater ID
  367. Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  368. // Event
  369. d
  370. );
  371. // 감지기트렌드 읽기 명령
  372. cmd.CommandType = "TR";
  373. // 데몬에 요청
  374. this.mdi.ui.runCommand(cmd);
  375. //}
  376. }
  377. catch (Exception ex)
  378. {
  379. Util.UErrorMessage(ex, 0, 0);
  380. }
  381. }
  382. public void Trend_Read_Complete(CmdInfo cmd)
  383. {
  384. try
  385. {
  386. // 오류는 처리안함
  387. if (cmd.ErrResponse == true)
  388. return;
  389. int BoardID = Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text);
  390. int Loop = Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text);
  391. int RepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  392. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && RepeaterID == cmd.repeaterNo && cmd.ResCommand == prt_res_define.read_command_status)
  393. {
  394. RCVData_ReadCommandStatus ResponseData = (RCVData_ReadCommandStatus)cmd.ResponseData;
  395. // 트렌드 값 반영
  396. for (int i = 0; i < 44; i++)
  397. Data[i] = ResponseData.AnalogDetecterTrend[i];
  398. Trend_Update(Data);
  399. Information_Update();
  400. }
  401. }
  402. catch (Exception ex)
  403. {
  404. Util.UErrorMessage(ex, 0, 0);
  405. }
  406. }
  407. // 아날로그 감지기 레벨값 쓰기 명령
  408. private void Level_Write()
  409. {
  410. try
  411. {
  412. // 완료 이벤트
  413. CmdInfo cmd;
  414. if (mdi.ReceiverModel == "IFC3300")
  415. {// 0x22, 3300
  416. // 명령어 생성
  417. RepeaterDataAll RepaterDataAll = new RepeaterDataAll();
  418. cmd = new CmdInfo(
  419. // 0x22
  420. prt_cmd_define.write_analogdetecter_level_all,
  421. // 수신기 아이디
  422. mdi.myReceiverID,
  423. // Comm ID
  424. 1,
  425. // Loop No
  426. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  427. // Board ID
  428. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  429. // Repeater ID
  430. //Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  431. // Event
  432. null
  433. );
  434. //cmd.dEvent = deleg;
  435. // 레벨값
  436. int iRepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  437. RepaterDataAll.Data[iRepeaterID - 1].Set_Level_AnalogDetecter(
  438. Convert.ToByte(this.textbox_Level_Fault.Text.Trim()),
  439. Convert.ToByte(this.textbox_Level_PreFire.Text.Trim()),
  440. Convert.ToByte(this.textbox_Level_FireNight.Text.Trim()),
  441. Convert.ToByte(this.textbox_Level_FireDay.Text.Trim())
  442. );
  443. cmd.CommandData = RepaterDataAll;
  444. }
  445. else // 0x78, 3000
  446. {
  447. // 명령어 생성
  448. cmd = new CmdInfo(
  449. // 0x78
  450. prt_cmd_define.write_analogdetecter_level,
  451. // 수신기 아이디
  452. mdi.myReceiverID,
  453. // Comm ID
  454. 1,
  455. // Loop No
  456. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  457. // Board ID
  458. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  459. // Repeater ID
  460. Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  461. // Event
  462. null
  463. );
  464. cmd.AnalogDetecterFault = Convert.ToByte(this.textbox_Level_Fault.Text.Trim());
  465. cmd.AnalogDetecterPreFire = Convert.ToByte(this.textbox_Level_PreFire.Text.Trim());
  466. cmd.AnalogDetecterFireNight = Convert.ToByte(this.textbox_Level_FireNight.Text.Trim());
  467. cmd.AnalogDetecterFireDay = Convert.ToByte(this.textbox_Level_FireDay.Text.Trim());
  468. }
  469. Popup.CommonPopupShow(this);
  470. // 데몬에 요청
  471. this.mdi.ui.runCommand(cmd);
  472. }
  473. catch (Exception ex)
  474. {
  475. Util.UErrorMessage(ex, 0, 0);
  476. }
  477. }
  478. // 크로스 스레드 해결
  479. delegate void CallBack_Cross(CmdInfo cmd);
  480. private void Delegate_Cross(CmdInfo cmd)
  481. {
  482. if (this.InvokeRequired)
  483. {
  484. CallBack_Cross d = new CallBack_Cross(Delegate_Cross);
  485. this.Invoke(d, new object[] { cmd });
  486. }
  487. else
  488. {
  489. try
  490. {
  491. // 오류는 처리안함
  492. if (cmd.ErrResponse == true)
  493. return;
  494. int BoardID = Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text);
  495. int Loop = Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text);
  496. int RepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  497. if (mdi.ReceiverModel == "IFC3300")
  498. {
  499. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && cmd.ResCommand == prt_res_define.write_analogdetecter_level_all)//A2
  500. {//RepeaterID == cmd.repeaterNo
  501. RCVData_WriteAnalogDetecterLevel2 ResponseData = (RCVData_WriteAnalogDetecterLevel2)cmd.ResponseData;
  502. Current_Fault = Convert.ToInt32(ResponseData.Fault).ToString();
  503. Current_PreFire = Convert.ToInt32(ResponseData.PreFire).ToString();
  504. Current_FireNight = Convert.ToInt32(ResponseData.FireNight).ToString();
  505. Current_FireDay = Convert.ToInt32(ResponseData.FireDay).ToString();
  506. // 해쉬테이블을 갱신해야됨
  507. mdi.GetAnalogDetecterLevelDB();
  508. // cyim 2015.7.6 레벨값 갱신 이벤트 추가 : 중계기 상태보기 화면에 레벨값 갱신을 통보해야 한다
  509. mdi.Event.AnalogLevel_Update_SendMessage_Write(mdi); // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  510. // 정보창 갱신 (중계기상태보기 화면보다 갱신이 늦을수 있다
  511. Information_Update();
  512. Popup.CommonPopupClose(this);
  513. // UI 에는 이미 반영되어있음
  514. MessageBox.Show("설정되었습니다");
  515. }
  516. }
  517. else
  518. {
  519. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && RepeaterID == cmd.repeaterNo && cmd.ResCommand == prt_res_define.write_analogdetecter_level)//F8
  520. {
  521. //request_init = false;
  522. Current_Fault = Convert.ToInt32(cmd.AnalogDetecterFault).ToString();
  523. Current_PreFire = Convert.ToInt32(cmd.AnalogDetecterPreFire).ToString();
  524. Current_FireNight = Convert.ToInt32(cmd.AnalogDetecterFireNight).ToString();
  525. Current_FireDay = Convert.ToInt32(cmd.AnalogDetecterFireDay).ToString();
  526. // 해쉬테이블을 갱신해야됨
  527. mdi.GetAnalogDetecterLevelDB();
  528. // cyim 2015.7.6 레벨값 갱신 이벤트 추가 : 중계기 상태보기 화면에 레벨값 갱신을 통보해야 한다
  529. mdi.Event.AnalogLevel_Update_SendMessage_Write(mdi); // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  530. // 정보창 갱신 (중계기상태보기 화면보다 갱신이 늦을수 있다
  531. Information_Update();
  532. Popup.CommonPopupClose(this);
  533. // UI 에는 이미 반영되어있음
  534. MessageBox.Show("설정되었습니다");
  535. }
  536. }
  537. }
  538. catch (Exception ex)
  539. {
  540. Util.UErrorMessage(ex, 0, 0);
  541. }
  542. }
  543. }
  544. public void Level_Write_Complete(CmdInfo cmd)
  545. {
  546. Delegate_Cross(cmd);
  547. }
  548. }
  549. }