123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544 |
- 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
- }
- }
|