Form_AnalogDetecter.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  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. // hoon 2020-07-08 : 아날로그 감지기 레벨값 설정 제한 변경 - 최청명 대리 요청사항(1~127 입력가능하게)
  289. else if (this.label_AnalogDetecter_Type_Value.Text == "열감지기" && (fireday < 0 || fireday > 127))
  290. MessageBox.Show("Fire Day 레벨 값은 1 ~ 127 사이 값이어야 한다");
  291. else if (this.label_AnalogDetecter_Type_Value.Text == "열감지기" && (firenight < 0 || firenight > 127))
  292. MessageBox.Show("Fire Night 레벨 값은 1 ~ 127 사이 값이어야 한다");
  293. else if (this.label_AnalogDetecter_Type_Value.Text == "연감지기" && (fireday < 0 || fireday > 127))
  294. MessageBox.Show("Fire Day 레벨 값은 1 ~ 127 사이 값이어야 한다");
  295. else if (this.label_AnalogDetecter_Type_Value.Text == "연감지기" && (firenight < 0 || firenight > 127))
  296. MessageBox.Show("Fire Night 레벨 값은 1 ~ 127 사이 값이어야 한다");
  297. else
  298. {
  299. if (MessageBox.Show("저장하시겠습니까?", "", MessageBoxButtons.OKCancel) == DialogResult.OK)
  300. {
  301. // 편집불가
  302. Level_Edit_Enable(false);
  303. // 레벨값 쓰기 명령
  304. Level_Write();
  305. }
  306. }
  307. }
  308. catch (Exception ex)
  309. {
  310. Util.UErrorMessage(ex, 0, 0);
  311. MessageBox.Show("입력값은 반드시 정수타입이어야 합니다");
  312. }
  313. }
  314. //
  315. // 타이머
  316. //
  317. private void Trend_Read_Timer_Tick(object sender, EventArgs e)
  318. {
  319. Trend_Read();
  320. }
  321. //
  322. // 통신부
  323. //
  324. // 데몬에 현재 트랜드 값을 요청한다
  325. private void Trend_Read()
  326. {
  327. try
  328. {
  329. // cyim 2016.01.07 중계기상태보기 화면에서 에러팝업출력
  330. if (this.label_AnalogDetecter_Loop_Value.Text == null || this.label_AnalogDetecter_Loop_Value.Text.Length == 0
  331. || this.label_AnalogDetecter_CommBoard_Value.Text == null || this.label_AnalogDetecter_CommBoard_Value.Text.Length == 0
  332. || this.label_AnalogDetecter_ID_Value.Text == null || this.label_AnalogDetecter_ID_Value.Text.Length == 0)
  333. return;
  334. // 완료 이벤트
  335. dCommandResponse d = new dCommandResponse(Trend_Read_Complete);
  336. // cyim 2016.12.07 : 수신기 모델별 내부 로직 변경
  337. //if (mdi.ReceiverModel == "IFC3300")
  338. //{
  339. // // 명령어 생성
  340. // CmdInfo cmd = new CmdInfo(
  341. // // 0x24
  342. // prt_cmd_define.read_analogdetecter_trend,
  343. // // 수신기 아이디
  344. // mdi.myReceiverID,
  345. // // Comm ID
  346. // 1,
  347. // // Loop No
  348. // Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  349. // // Board ID
  350. // Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  351. // // Repeater ID
  352. // Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  353. // // Event
  354. // d
  355. // );
  356. // // 데몬에 요청
  357. // this.mdi.ui.runCommand(cmd);
  358. //}
  359. //else
  360. //{
  361. // cyim 2016.10.27 : 대용량 수신기 아날로그 감지기 트랜드 읽기
  362. // 하단 주석은 삭제 금지
  363. // 명령어 생성
  364. CmdInfo cmd = new CmdInfo(
  365. // 0x76
  366. prt_cmd_define.read_command_status,
  367. // 수신기 아이디
  368. mdi.myReceiverID,
  369. // Comm ID
  370. 1,
  371. // Loop No
  372. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  373. // Board ID
  374. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  375. // Repeater ID
  376. Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  377. // Event
  378. d
  379. );
  380. // 감지기트렌드 읽기 명령
  381. cmd.CommandType = "TR";
  382. // 데몬에 요청
  383. this.mdi.ui.runCommand(cmd);
  384. //}
  385. }
  386. catch (Exception ex)
  387. {
  388. Util.UErrorMessage(ex, 0, 0);
  389. }
  390. }
  391. public void Trend_Read_Complete(CmdInfo cmd)
  392. {
  393. try
  394. {
  395. // 오류는 처리안함
  396. if (cmd.ErrResponse == true)
  397. return;
  398. int BoardID = Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text);
  399. int Loop = Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text);
  400. int RepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  401. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && RepeaterID == cmd.repeaterNo && cmd.ResCommand == prt_res_define.read_command_status)
  402. {
  403. RCVData_ReadCommandStatus ResponseData = (RCVData_ReadCommandStatus)cmd.ResponseData;
  404. // 트렌드 값 반영
  405. for (int i = 0; i < 44; i++)
  406. Data[i] = ResponseData.AnalogDetecterTrend[i];
  407. Trend_Update(Data);
  408. Information_Update();
  409. }
  410. }
  411. catch (Exception ex)
  412. {
  413. Util.UErrorMessage(ex, 0, 0);
  414. }
  415. }
  416. // 아날로그 감지기 레벨값 쓰기 명령
  417. private void Level_Write()
  418. {
  419. try
  420. {
  421. // 완료 이벤트
  422. CmdInfo cmd;
  423. if (mdi.ReceiverModel == "IFC3300")
  424. {// 0x22, 3300
  425. // 명령어 생성
  426. RepeaterDataAll RepaterDataAll = new RepeaterDataAll();
  427. cmd = new CmdInfo(
  428. // 0x22
  429. prt_cmd_define.write_analogdetecter_level_all,
  430. // 수신기 아이디
  431. mdi.myReceiverID,
  432. // Comm ID
  433. 1,
  434. // Loop No
  435. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  436. // Board ID
  437. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  438. // Repeater ID
  439. //Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  440. // Event
  441. null
  442. );
  443. //cmd.dEvent = deleg;
  444. // 레벨값
  445. int iRepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  446. RepaterDataAll.Data[iRepeaterID - 1].Set_Level_AnalogDetecter(
  447. Convert.ToByte(this.textbox_Level_Fault.Text.Trim()),
  448. Convert.ToByte(this.textbox_Level_PreFire.Text.Trim()),
  449. Convert.ToByte(this.textbox_Level_FireNight.Text.Trim()),
  450. Convert.ToByte(this.textbox_Level_FireDay.Text.Trim())
  451. );
  452. cmd.CommandData = RepaterDataAll;
  453. }
  454. else // 0x78, 3000
  455. {
  456. // 명령어 생성
  457. cmd = new CmdInfo(
  458. // 0x78
  459. prt_cmd_define.write_analogdetecter_level,
  460. // 수신기 아이디
  461. mdi.myReceiverID,
  462. // Comm ID
  463. 1,
  464. // Loop No
  465. Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text),
  466. // Board ID
  467. Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text),
  468. // Repeater ID
  469. Int32.Parse(this.label_AnalogDetecter_ID_Value.Text),
  470. // Event
  471. null
  472. );
  473. cmd.AnalogDetecterFault = Convert.ToByte(this.textbox_Level_Fault.Text.Trim());
  474. cmd.AnalogDetecterPreFire = Convert.ToByte(this.textbox_Level_PreFire.Text.Trim());
  475. cmd.AnalogDetecterFireNight = Convert.ToByte(this.textbox_Level_FireNight.Text.Trim());
  476. cmd.AnalogDetecterFireDay = Convert.ToByte(this.textbox_Level_FireDay.Text.Trim());
  477. }
  478. Popup.CommonPopupShow(this);
  479. // 데몬에 요청
  480. this.mdi.ui.runCommand(cmd);
  481. }
  482. catch (Exception ex)
  483. {
  484. Util.UErrorMessage(ex, 0, 0);
  485. }
  486. }
  487. // 크로스 스레드 해결
  488. delegate void CallBack_Cross(CmdInfo cmd);
  489. private void Delegate_Cross(CmdInfo cmd)
  490. {
  491. if (this.InvokeRequired)
  492. {
  493. CallBack_Cross d = new CallBack_Cross(Delegate_Cross);
  494. this.Invoke(d, new object[] { cmd });
  495. }
  496. else
  497. {
  498. try
  499. {
  500. // 오류는 처리안함
  501. if (cmd.ErrResponse == true)
  502. return;
  503. int BoardID = Int32.Parse(this.label_AnalogDetecter_CommBoard_Value.Text);
  504. int Loop = Int32.Parse(this.label_AnalogDetecter_Loop_Value.Text);
  505. int RepeaterID = Int32.Parse(this.label_AnalogDetecter_ID_Value.Text);
  506. if (mdi.ReceiverModel == "IFC3300")
  507. {
  508. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && cmd.ResCommand == prt_res_define.write_analogdetecter_level_all)//A2
  509. {//RepeaterID == cmd.repeaterNo
  510. RCVData_WriteAnalogDetecterLevel2 ResponseData = (RCVData_WriteAnalogDetecterLevel2)cmd.ResponseData;
  511. Current_Fault = Convert.ToInt32(ResponseData.Fault).ToString();
  512. Current_PreFire = Convert.ToInt32(ResponseData.PreFire).ToString();
  513. Current_FireNight = Convert.ToInt32(ResponseData.FireNight).ToString();
  514. Current_FireDay = Convert.ToInt32(ResponseData.FireDay).ToString();
  515. // 해쉬테이블을 갱신해야됨
  516. mdi.GetAnalogDetecterLevelDB();
  517. // cyim 2015.7.6 레벨값 갱신 이벤트 추가 : 중계기 상태보기 화면에 레벨값 갱신을 통보해야 한다
  518. mdi.Event.AnalogLevel_Update_SendMessage_Write(mdi); // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  519. // 정보창 갱신 (중계기상태보기 화면보다 갱신이 늦을수 있다
  520. Information_Update();
  521. Popup.CommonPopupClose(this);
  522. // UI 에는 이미 반영되어있음
  523. MessageBox.Show("설정되었습니다");
  524. }
  525. }
  526. else
  527. {
  528. if (BoardID == cmd.boardNo && cmd.loopNo == Loop && RepeaterID == cmd.repeaterNo && cmd.ResCommand == prt_res_define.write_analogdetecter_level)//F8
  529. {
  530. //request_init = false;
  531. Current_Fault = Convert.ToInt32(cmd.AnalogDetecterFault).ToString();
  532. Current_PreFire = Convert.ToInt32(cmd.AnalogDetecterPreFire).ToString();
  533. Current_FireNight = Convert.ToInt32(cmd.AnalogDetecterFireNight).ToString();
  534. Current_FireDay = Convert.ToInt32(cmd.AnalogDetecterFireDay).ToString();
  535. // 해쉬테이블을 갱신해야됨
  536. mdi.GetAnalogDetecterLevelDB();
  537. // cyim 2015.7.6 레벨값 갱신 이벤트 추가 : 중계기 상태보기 화면에 레벨값 갱신을 통보해야 한다
  538. mdi.Event.AnalogLevel_Update_SendMessage_Write(mdi); // cyim 2015.8.4 수신반을 위한 static 클래스 정리
  539. // 정보창 갱신 (중계기상태보기 화면보다 갱신이 늦을수 있다
  540. Information_Update();
  541. Popup.CommonPopupClose(this);
  542. // UI 에는 이미 반영되어있음
  543. MessageBox.Show("설정되었습니다");
  544. }
  545. }
  546. }
  547. catch (Exception ex)
  548. {
  549. Util.UErrorMessage(ex, 0, 0);
  550. }
  551. }
  552. }
  553. public void Level_Write_Complete(CmdInfo cmd)
  554. {
  555. Delegate_Cross(cmd);
  556. }
  557. }
  558. }