using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; //using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using Microsoft.Win32; namespace IControls_FireManager { public partial class EmergencyRepeater : Form { // 시리얼포트 3종 public _Serial Receiver1_Serial = new _Serial(); public _Serial Receiver2_Serial = new _Serial(); public _Serial Emergency_Serial = new _Serial(); // 큐처리 기간 ms public int TIME_QUEUE = 60; // 프로그램 자동실행 public RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); public bool init = false; public EmergencyRepeater() { InitializeComponent(); // 공통 콤보박스 셋팅 UI_Combobox_Initialize(); // 파일을 읽고 콤보박스에 값이 있다면 셋팅하고 없다면, 무시한다. INI_Read(); // 레지스트리 값 읽기 Reg_Read(); // 이벤트 핸들러 등록 _Event.DebugView_SendMessage_Event += new _Event.DebugView_SendMessage_Handler(_Event_DebugView_SendMessage_Event); // 하지만 포트정보가 있다면 포트를 생성해본다, 성공이라면 시나리오대로 동작 // 하지만 포트정보가 있다면 포트를 생성해본다, 성공이라면 시나리오대로 동작 if (Port_Test() == true) { Start(); this.button_Start.Text = "종료"; } // 폼닫기 이벤트 핸들러 등록 (이벤트 핸들러 해제용) this.FormClosed += new FormClosedEventHandler(CreateForm_FormClosed); } public void CreateForm_FormClosed(object sender, FormClosedEventArgs e) { // 스레드 종료 Application.ExitThread(); // 프로세스 종료 Application.Exit(); // 프로세스가 남아있다면 최종 종료 (2개의 프로젝트가 공존하고 Application.ProductName 값이 2개다 // 즉 IControls_Security 프로세스가 2개 공존 하므로 적용불가 System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName(Application.ProductName); foreach (System.Diagnostics.Process p in mProcess) p.Kill(); // 최종 정리 (보완코드 : 크로스 스레드 문제 발생 여지가 있으므로 사용주의) Environment.Exit(0); } // 로그 public delegate void DebugEditBox_SetTextCallback(TextBox textbox, string Data); public void Delegate_Set_Log(TextBox textbox, string Data) { if (textbox.InvokeRequired) { DebugEditBox_SetTextCallback d = new DebugEditBox_SetTextCallback(Delegate_Set_Log); textbox.Invoke(d, new object[] { textbox, Data }); } else { textbox.AppendText(DateTime.Now.ToString("HH:mm:ss") + " " + Data + "\r\n"); } } public void _Event_DebugView_SendMessage_Event(PortInfo PortName, string Data) { switch (PortName) { case PortInfo.Receiver1: if (this.textBox_Receiver1.Text.Length > 50000) this.textBox_Receiver1.Clear(); Delegate_Set_Log(this.textBox_Receiver1, Data); break; case PortInfo.Receiver2: if (this.textBox_Receiver2.Text.Length > 50000) this.textBox_Receiver2.Clear(); Delegate_Set_Log(this.textBox_Receiver2, Data); break; case PortInfo.Emergency: if (this.textBox_Emergency.Text.Length > 50000) this.textBox_Emergency.Clear(); Delegate_Set_Log(this.textBox_Emergency, Data); break; } } // // UI 초기화 // public void UI_Combobox_Initialize() { this.comboBox_Baudrate.Items.Add("2400"); this.comboBox_Baudrate.Items.Add("4800"); this.comboBox_Baudrate.Items.Add("9600"); this.comboBox_Baudrate.Items.Add("19200"); this.comboBox_Baudrate.Items.Add("38400"); this.comboBox_Parity.Items.Add(Parity.None); this.comboBox_Parity.Items.Add(Parity.Even); this.comboBox_Parity.Items.Add(Parity.Odd); this.comboBox_Parity.Items.Add(Parity.Space); this.comboBox_Databit.Items.Add(8); this.comboBox_Databit.Items.Add(7); this.comboBox_Stopbit.Items.Add(StopBits.One); this.comboBox_Stopbit.Items.Add(StopBits.None); } // // 레지스트리값 읽기 // public void Reg_Read() { init = true; if (rkApp.GetValue("IControls_EmergencyRepeater") == null) this.checkBox_Registry.Checked = false; else this.checkBox_Registry.Checked = true; init = false; } // // Ini 파일 가져오기 // public void INI_Read() { // Common string BaudRate = _Ini.Read_Ini("COMMON", "BaudRate", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); string Parity = _Ini.Read_Ini("COMMON", "Parity", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); string DataBit = _Ini.Read_Ini("COMMON", "DataBit", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); string StopBit = _Ini.Read_Ini("COMMON", "StopBit", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); if (BaudRate != null && BaudRate.Length != 0) this.comboBox_Baudrate.Text = BaudRate; if (Parity != null && Parity.Length != 0) this.comboBox_Parity.Text = Parity; if (DataBit != null && DataBit.Length != 0) this.comboBox_Databit.Text = DataBit; if (StopBit != null && StopBit.Length != 0) this.comboBox_Stopbit.Text = StopBit; // Port string Receiver1 = _Ini.Read_Ini("Receiver1", "Port", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); string Receiver2 = _Ini.Read_Ini("Receiver2", "Port", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); string Emergency = _Ini.Read_Ini("Emergency", "Port", 512, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); if (Receiver1 != null && Receiver1.Length != 0) this.comboBox_Port_Receiver1.Text = Receiver1; if (Receiver2 != null && Receiver2.Length != 0) this.comboBox_Port_Receiver2.Text = Receiver2; if (Emergency != null && Emergency.Length != 0) this.comboBox_Port_Emergency.Text = Emergency; } // // Ini 파일 저장하기 // private void button_Save_Click(object sender, EventArgs e) { try { // Common _Ini.Write_Ini("COMMON", "BaudRate", this.comboBox_Baudrate.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); _Ini.Write_Ini("COMMON", "Parity", this.comboBox_Parity.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); _Ini.Write_Ini("COMMON", "DataBit", this.comboBox_Databit.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); _Ini.Write_Ini("COMMON", "StopBit", this.comboBox_Stopbit.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); // Port _Ini.Write_Ini("Receiver1", "Port", this.comboBox_Port_Receiver1.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); _Ini.Write_Ini("Receiver2", "Port", this.comboBox_Port_Receiver2.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); _Ini.Write_Ini("Emergency", "Port", this.comboBox_Port_Emergency.Text, Environment.CurrentDirectory.ToString() + "\\" + "EmergencyRepeater.ini"); MessageBox.Show("저장 성공"); } catch { MessageBox.Show("저장 실패"); } } // // 현재 포트 정보 가져오기 // private void comboBox_Port_Receiver1_DropDown(object sender, EventArgs e) { comboBox_Port_Receiver1.Items.Clear(); string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) comboBox_Port_Receiver1.Items.Add(port); } private void comboBox_Port_Receiver2_DropDown(object sender, EventArgs e) { comboBox_Port_Receiver2.Items.Clear(); string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) comboBox_Port_Receiver2.Items.Add(port); } private void comboBox_Port_Emergency_DropDown(object sender, EventArgs e) { comboBox_Port_Emergency.Items.Clear(); string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) comboBox_Port_Emergency.Items.Add(port); } // // 현재값 셋팅 // private void button_Receiver1_Click(object sender, EventArgs e) { if(Port_Test_Receiver1()==true) _Event.DebugView_SendMessage_Write(PortInfo.Receiver1, "접속 성공"); else _Event.DebugView_SendMessage_Write(PortInfo.Receiver1, "접속 실패"); } private void button_Receiver2_Click(object sender, EventArgs e) { if (Port_Test_Receiver2() == true) _Event.DebugView_SendMessage_Write(PortInfo.Receiver2, "접속 성공"); else _Event.DebugView_SendMessage_Write(PortInfo.Receiver2, "접속 실패"); } private void button_Emergency_Click(object sender, EventArgs e) { if (Port_Test_Emergency() == true) _Event.DebugView_SendMessage_Write(PortInfo.Emergency, "접속 성공"); else _Event.DebugView_SendMessage_Write(PortInfo.Emergency, "접속 실패"); } // // 포트 접속가능한지 테스트 // private bool Port_Test() { string result = null; //return true; // temp if (Port_Test_Receiver1() == false) result = result + "Receiver1 "; if (Port_Test_Receiver2() == false) result = result + "Receiver2 "; if (Port_Test_Emergency() == false) result = result + "Emergency "; if (result != null) { MessageBox.Show(result + " 포트 접속이 안됩니다"); return false; } else { return true; } } private bool Port_Test_Receiver1() { if (this.comboBox_Port_Receiver1.Text == null || this.comboBox_Port_Receiver1.Text.Length == 0) return false; else { if (Serial_Test(Receiver1_Serial, this.comboBox_Port_Receiver1.Text, Int32.Parse(this.comboBox_Baudrate.Text), Get_Enum_Parity(this.comboBox_Parity.Text), Int32.Parse(this.comboBox_Databit.Text), Get_Enum_StopBits(this.comboBox_Stopbit.Text), PortInfo.Receiver1) == true) return true; else return false; } } private bool Port_Test_Receiver2() { if (this.comboBox_Port_Receiver2.Text == null || this.comboBox_Port_Receiver2.Text.Length == 0) return false; else { if (Serial_Test(Receiver2_Serial, this.comboBox_Port_Receiver2.Text, Int32.Parse(this.comboBox_Baudrate.Text), Get_Enum_Parity(this.comboBox_Parity.Text), Int32.Parse(this.comboBox_Databit.Text), Get_Enum_StopBits(this.comboBox_Stopbit.Text), PortInfo.Receiver2) == true) return true; else return false; } } private bool Port_Test_Emergency() { if (this.comboBox_Port_Emergency.Text == null || this.comboBox_Port_Emergency.Text.Length == 0) return false; else { if (Serial_Test(Emergency_Serial, this.comboBox_Port_Emergency.Text, Int32.Parse(this.comboBox_Baudrate.Text), Get_Enum_Parity(this.comboBox_Parity.Text), Int32.Parse(this.comboBox_Databit.Text), Get_Enum_StopBits(this.comboBox_Stopbit.Text), PortInfo.Emergency) == true) return true; else return false; } } private Parity Get_Enum_Parity(string Data) { if (Data == Parity.None.ToString()) return Parity.None; else if (Data == Parity.Even.ToString()) return Parity.Even; else if (Data == Parity.Odd.ToString()) return Parity.Odd; else if (Data == Parity.Space.ToString()) return Parity.Space; else return Parity.None; } private StopBits Get_Enum_StopBits(string Data) { if (Data == StopBits.One.ToString()) return StopBits.One; else if (Data == StopBits.None.ToString()) return StopBits.None; else return StopBits.One; } private bool Serial_Test(_Serial serial, string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, PortInfo info) { try { if (serial.Serial_Create(portName, baudRate, parity, dataBits, stopBits, info) == true) return true; else return false; } catch { //System.Windows.Forms.MessageBox.Show(portName + e.ToString()); return false; } } // 시작버튼 private void button_Start_Click(object sender, EventArgs e) { if (this.button_Start.Text == "시작") { // 하지만 포트정보가 있다면 포트를 생성해본다, 성공이라면 시나리오대로 동작 if (Port_Test() == true) { Start(); this.button_Start.Text = "종료"; } } else { Receiver1_Serial.Serial_Dispose(); Receiver2_Serial.Serial_Dispose(); Emergency_Serial.Serial_Dispose(); this.button_Start.Text = "시작"; } } // 포트간 중계 시작 private void Start() { DeleteTimer(); _Timer_WindowBase.Create("Emergency_Rx_Queue_Security", TIME_QUEUE, Emergency_Rx_Queue_Security_Tick, true); // 수신큐 60 msec 마다 큐에 있는 값을 꺼냄 _Timer_WindowBase.Create("Receiver_Tx_Queue_Security", TIME_QUEUE, Receiver_Tx_Queue_Security_Tick, true); // 발신큐 60 msec 마다 큐에 있는 값을 꺼냄 _Timer_WindowBase.Create("Receiver_Rx_Queue_Security", TIME_QUEUE, Receiver_Rx_Queue_Security_Tick, true); // 수신큐 60 msec 마다 큐에 있는 값을 꺼냄 _Timer_WindowBase.Create("Emergency_Tx_Queue_Security", 300, Emergency_Tx_Queue_Security_Tick, true); // 발신큐 60 msec 마다 큐에 있는 값을 꺼냄 } private void DeleteTimer() { _Timer_WindowBase.Delete("Emergency_Rx_Queue_Security"); _Timer_WindowBase.Delete("Receiver_Tx_Queue_Security"); _Timer_WindowBase.Delete("Receiver_Rx_Queue_Security"); _Timer_WindowBase.Delete("Emergency_Tx_Queue_Security"); } // 비상방송 -> REPEATER private void Emergency_Rx_Queue_Security_Tick(object sender, EventArgs e) { try { // 큐가 비워져 있다면 실행안함 if (Emergency_Serial.RxQueue.Count != 0) { lock (Emergency_Serial.CS_RxQueue) { // 큐에서 가져온다 byte[] GetData =(byte[])Emergency_Serial.RxQueue.Peek(); Receiver1_Serial.TxQueue_ADD(GetData); Receiver2_Serial.TxQueue_ADD(GetData); // 큐에서 제거 if (Emergency_Serial.RxQueue.Count != 0) Emergency_Serial.RxQueue.Dequeue(); } } } catch { Emergency_Serial.RxQueue.Clear(); } } // REPEATER -> 수신기 private void Receiver_Tx_Queue_Security_Tick(object sender, EventArgs e) { try { // 큐가 비워져 있다면 실행안함 if (Receiver1_Serial.TxQueue.Count != 0) { lock (Receiver1_Serial.CS_TxQueue) { // 큐에서 가져온다 byte[] GetData = (byte[])Receiver1_Serial.TxQueue.Peek(); Receiver1_Serial.Serial_Transmit(GetData); // 큐에서 제거 if (Receiver1_Serial.TxQueue.Count != 0) Receiver1_Serial.TxQueue.Dequeue(); } } // 큐가 비워져 있다면 실행안함 if (Receiver2_Serial.TxQueue.Count != 0) { lock (Receiver2_Serial.CS_TxQueue) { // 큐에서 가져온다 byte[] GetData = (byte[])Receiver2_Serial.TxQueue.Peek(); Receiver2_Serial.Serial_Transmit(GetData); // 큐에서 제거 if (Receiver2_Serial.TxQueue.Count != 0) Receiver2_Serial.TxQueue.Dequeue(); } } } catch { Receiver1_Serial.TxQueue.Clear(); Receiver2_Serial.TxQueue.Clear(); } } // 수신기 -> REPEATER private void Receiver_Rx_Queue_Security_Tick(object sender, EventArgs e) { // 큐가 비워져 있다면 실행안함 if (Receiver1_Serial.RxQueue.Count != 0) { lock (Receiver1_Serial.CS_RxQueue) { // 큐에서 가져온다 byte[] GetData = (byte[])Receiver1_Serial.RxQueue.Peek(); Emergency_Serial.TxQueue_ADD(GetData); // 큐에서 제거 if (Receiver1_Serial.RxQueue.Count != 0) Receiver1_Serial.RxQueue.Dequeue(); } } // 큐가 비워져 있다면 실행안함 if (Receiver2_Serial.RxQueue.Count != 0) { lock (Receiver2_Serial.CS_RxQueue) { // 큐에서 가져온다 byte[] GetData = (byte[])Receiver2_Serial.RxQueue.Peek(); Emergency_Serial.TxQueue_ADD(GetData); // 큐에서 제거 if (Receiver2_Serial.RxQueue.Count != 0) Receiver2_Serial.RxQueue.Dequeue(); } } } // REPEATER -> 비상방송 private void Emergency_Tx_Queue_Security_Tick(object sender, EventArgs e) { try { // 큐가 비워져 있다면 실행안함 if (Emergency_Serial.TxQueue.Count != 0) { lock (Emergency_Serial.CS_TxQueue) { // 큐에서 가져온다 byte[] GetData = (byte[])Emergency_Serial.TxQueue.Peek(); Emergency_Serial.Serial_Transmit(GetData); // 큐에서 제거 if (Emergency_Serial.TxQueue.Count != 0) Emergency_Serial.TxQueue.Dequeue(); } } } catch { Emergency_Serial.TxQueue.Clear(); } } // 레지스트리값 private void checkBox_Registry_CheckedChanged(object sender, EventArgs e) { if (init == true) return; try { if (this.checkBox_Registry.Checked == true) { rkApp.DeleteValue("IControls_EmergencyRepeater", false); rkApp.SetValue("IControls_EmergencyRepeater", Environment.CurrentDirectory.ToString() + "\\" + "IControls_EmergencyRepeater.lnk"); MessageBox.Show("등록하였습니다!", "확인", MessageBoxButtons.OK); } else { rkApp.DeleteValue("IControls_EmergencyRepeater", false); MessageBox.Show("제거하였습니다!", "확인", MessageBoxButtons.OK); } } catch { } } private void button_Receiver1_Clear_Click(object sender, EventArgs e) { this.textBox_Receiver1.Clear(); } private void button_Receiver2_Clear_Click(object sender, EventArgs e) { this.textBox_Receiver2.Clear(); } private void button_Emergency_Clear_Click(object sender, EventArgs e) { this.textBox_Emergency.Clear(); } } public enum PortInfo { Receiver1, Receiver2, Emergency } }