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;

namespace IControls_FireManager
{
    public partial class Form_Receiver_Add : Form
    {
        // 클래스 생성
        _RECEIVER RECEIVER = new _RECEIVER();

        private int _RETRY_COUNT = 2;
        private int _DELTA_VOLT = 10;
        private int _COMM_TIMEOUT = 1000;
        private int _COMM_DELAY = 100;

        // 신규추가용 인지 편집용 구분
        private bool EditMode = false; // true : 편집용 , false = 신규추가용

        // 수신기 추가 혹은 수신기 정보를 편집할때 사용되는 클래스이다 
        // iIndex : 0 이 들어오는 경우 -> 데이타베이스에 수신기 아이디가 존재한다면 새로운 아이디를 생성하고, 폴더 생성및 데이타베이스를 카피한다 
        // iIndex : 수신기 ID 값이 들어오는 경우 -> 수신기 정보를 편집

        private string DEFAULT_MODEL = "IFC3300";

        public Form_Receiver_Add(int iIndex)
        {
            ///
            /// 초기화
            ///  

            InitializeComponent();

            // 리시버 데이터 초기화

            // 사용하지 않는 값들은 기본값으로 입력한다.
            // 사용여부 (미사용)
            RECEIVER.ENABLE = true;

            // 타입 (미사용)
            RECEIVER.TYPE = null;

            // 이중화 플래그 (항상 false 설정함.  입력용 화면도 없음.)
            RECEIVER.REDUNDANT_FLAG = false;
            // =============================================

            //// 통신보드 최대개수 // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
            //if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER]).MODEL == "IFC3300")
            //    RECEIVER.COM_BOARD_MAX_NUM = 68; // cyim 
            //else
            //    RECEIVER.COM_BOARD_MAX_NUM = 15;

            // IO보드 최대개수
            RECEIVER.IO_BOARD_MAX_NUM = 15;

            RECEIVER.ID = iIndex.ToString();

            // 프로젝트 새로 만들기 구조 변경
            //  -> 프로젝트 폴더는 해쉬테이블에 없다면 곧바로 생성
            //  -> 해쉬테이블이 있다면 분명 편집모드로 진입
            //  -> 해쉬테이블에 없다면 새로운 수신기 추가 -> Initialize_Defalut 실행
            //  -> 해쉬테이블에 없지만 기존의 데이타베이스에 있는경우 (데이타베이스 열기 시도하는 경우) -> Initialize_SubPort_FromDB 실행 
            //    -> 참고 : 프로젝트 폴더 생성시 중복된 데이타베이스 파일 예외처리되므로 가능함

            // 기존의  ID 가 있는지 체크.
            if (_Data.HASH_RECEIVER.ContainsKey(RECEIVER.ID) == false)
            {
                //
                // 데이타베이스 접근 경로 지정부
                //

                _Data.DataBaseFilePath_Set(null);//RECEIVER.ID);

                // 수신기 폴더 생성
                _File.Create_ReceiverFolder(_Data.Project_Path, _Data.Project_Name, RECEIVER.ID);

                // 수신기 ID 조회 : 0 이면 수신기 ID 가 없다
                if (Initialize_Receiver_FromDB(RECEIVER.ID) == 0)
                {
                    // 아이디 생성
                    RECEIVER.ID = Convert.ToString(_Data.CREATE_RECEIVER_ID());

                    // Initialize_Defalut 함수안에 Initialize_SubPort 함수를 이미 포함하고 있다
                    Initialize_Defalut();
                }
                else
                {
                    // DB에서 SubPort 값까지 모두 불러온다.
                    Initialize_SubPort_FromDB(RECEIVER.ID);
                }

                // 새로운 수신기를 추가함
                EditMode = false;
            }
            else
            {
                // 수신기 아이디를 토대로 해쉬테이블의 있는 정보를 가져온다
                RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID];

                // 기존의 수신기 수정함
                EditMode = true;
            }

            // RECEIVER 내용을 화면에 표출한다.
            Fill_ReceiverData();

            ///
            /// 이벤트
            /// 

            // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
            this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);

            // 윈도우 스타일 변경 이벤트 핸들러 등록
            _Event.WindowStyleSet_SendMessage_Event += new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);

            ///
            /// 스타일 변경
            /// 

            UI_Style_Initialize();
        }

        // Receiver 데이터를 DB에 저장하자!
        public void _Event_Project_Receiver_Save_Event()
        {
            try
            {
                int iReceiverID = Util.StrToInt(RECEIVER.ID, 0);

                // TB_BOARD에 쓰기 (통신 보드, I/O 보드, KEYPAD)

                // 기존 데이터는 지운다. (이미 모든 데이터는 RECEIVER에 들어있다!)
                _Db.Execute(_Sql.Delete_Table("TB_BOARD", RECEIVER.ID));

                string sSQL_BOARD = null;

                //
                // 통신보드
                //

                // 강제 쿼리 (특별히 펌프로 인하여 추가되는 보드가 존재한다)
                try
                {
                    if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).MODEL == "IFC3300")
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert_BigReceiver(
                            iReceiverID,    // ReceiverID
                            1,              // COMMID  (1 고정)
                            0,              // BOARDID (0 고정) 
                            "통신보드 0",   // BOARD_NAME
                            "Y",            // LOOP0 Use Flag 
                            "N",            // LOOP1 Use Flag 
                            "N",            // LOOP2 Use Flag 
                            "N",            // LOOP3 Use Flag 
                            "Y");           //  Use Flag 
                    }
                    else
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert(
                            iReceiverID,    // ReceiverID
                            1,              // COMMID  (1 고정)
                            15,             // BOARDID (15 고정)
                            "통신보드 15",  // BOARDID
                            "Y",            // LOOP0 Use Flag 
                            "N",            // LOOP1 Use Flag 
                            "Y");           //  Use Flag 
                    }

                    _Db.Execute(sSQL_BOARD);
                }
                catch
                {; }

                // cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                foreach (string COM_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_COM_BOARD_ID)
                {
                    // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
                    if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).MODEL == "IFC3300")
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert_BigReceiver(
                            iReceiverID,    // ReceiverID
                            1,      // COMMID  (1로 고정)
                            ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_ID,  // BOARDID
                            ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME,  // BOARDID
                            (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh1_Use_Flag ? "Y" : "N"),  // LOOP0 Use Flag 
                            (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh2_Use_Flag ? "Y" : "N"),  // LOOP1 Use Flag 
                            (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh3_Use_Flag ? "Y" : "N"),  // LOOP2 Use Flag 
                            (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh4_Use_Flag ? "Y" : "N"),  // LOOP3 Use Flag 
                            (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bUse_Flag ? "Y" : "N")); //  Use Flag 
                    }
                    else
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert(
                           iReceiverID,    // ReceiverID
                           1,      // COMMID  (1로 고정)
                           ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_ID,  // BOARDID
                           ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME,  // BOARDID
                           (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh1_Use_Flag ? "Y" : "N"),  // LOOP0 Use Flag 
                           (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh2_Use_Flag ? "Y" : "N"),  // LOOP1 Use Flag 
                           (((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bUse_Flag ? "Y" : "N")); //  Use Flag 
                    }


                    _Db.Execute(sSQL_BOARD);
                }

                //
                // IO 보드
                //

                // 강제 쿼리 (특별히 IO 보드는 셋팅하지 않아도 기본적으로 사용함으로 셋팅한다. 모델에 상관없이 IO 보드는 15는 무조건 사용하는 보드이다)
                try
                {
                    if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).MODEL == "IFC3300")
                    {
                        // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert_BigReceiver(
                            iReceiverID,    // ReceiverID
                            3,              // COMMID  (3 고정)
                            0,             // BOARDID (0 고정) // cyim 2016.01.10 IO 보드 강제쿼리에 코드 버그	
                            "I/O 보드 0",  // BOARD_NAME
                            "Y",            // LOOP0 Use Flag 
                            "N",            // LOOP1 Use Flag 
                            "N",            // LOOP2 Use Flag 
                            "N",            // LOOP3 Use Flag 
                            "Y");           //  Use Flag 
                    }
                    else
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert(
                            iReceiverID,    // ReceiverID
                            3,              // COMMID  (3 고정)
                            15,             // BOARDID (15 고정)
                            "I/O 보드 15",  // BOARDID
                            "Y",            // LOOP0 Use Flag 
                            "N",            // LOOP1 Use Flag 
                            "Y");           //  Use Flag 
                    }

                    _Db.Execute(sSQL_BOARD);
                }
                catch
                {; }

                // cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                foreach (string IO_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_IO_BOARD_ID)
                {
                    // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
                    if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).MODEL == "IFC3300")
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert_BigReceiver(
                            iReceiverID,    // ReceiverID
                            3,      // IO Board ID  (3로 고정)
                            ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_ID,  // BOARDID
                            ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_NAME,  // BOARDID
                            (((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag ? "Y" : "N"),   // LOOP0 Use Flag (Use Flag와 같은 같으로 넣는다.)                         
                            "N",  // LOOP1 Use Flag 
                            "N",  // LOOP2 Use Flag 
                            "N",  // LOOP3 Use Flag 
                            (((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag ? "Y" : "N")); //  Use Flag 
                    }
                    else
                    {
                        sSQL_BOARD = _Sql.TB_BOARD_table_Insert(
                            iReceiverID,    // ReceiverID
                            3,      // IO Board ID  (3로 고정)
                            ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_ID,  // BOARDID
                            ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_NAME,  // BOARDID
                            (((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag ? "Y" : "N"),   // LOOP0 Use Flag (Use Flag와 같은 같으로 넣는다.) 
                            "N",  // LOOP1 Use Flag 
                            (((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag ? "Y" : "N")); //  Use Flag
                    }
                    _Db.Execute(sSQL_BOARD);
                }

                // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
                if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).MODEL == "IFC3300")
                {
                    // cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                    sSQL_BOARD = _Sql.TB_BOARD_table_Insert_BigReceiver(
                        iReceiverID,    // ReceiverID
                        4,      // KeyPAD ID  (4로 고정)
                        RECEIVER.KEYPAD.BOARD_ID,  // BOARDID
                        RECEIVER.KEYPAD.BOARD_NAME,  // BOARDID
                        "N",  // LOOP0 Use Flag 
                        "N",  // LOOP1 Use Flag 
                        "N",  // LOOP2 Use Flag 
                        "N",  // LOOP3 Use Flag 
                        (RECEIVER.KEYPAD.bUse_Flag ? "Y" : "N")); //  Use Flag 
                }
                else
                {
                    sSQL_BOARD = _Sql.TB_BOARD_table_Insert(
                        iReceiverID,    // ReceiverID
                        4,      // KeyPAD ID  (4로 고정)
                        RECEIVER.KEYPAD.BOARD_ID,  // BOARDID
                        RECEIVER.KEYPAD.BOARD_NAME,  // BOARDID
                        "N",  // LOOP0 Use Flag 
                        "N",  // LOOP1 Use Flag 
                        (RECEIVER.KEYPAD.bUse_Flag ? "Y" : "N")); //  Use Flag 
                }

                _Db.Execute(sSQL_BOARD);


                // TB_COMM 
                // 기존 데이터는 지운다.
                _Db.Execute(_Sql.Delete_Table("TB_COMM", RECEIVER.ID));

                string sSQL_COMM_CommBoard = _Sql.TB_COMM_table_Insert(iReceiverID,  // Receiver ID
                                                                        1,           // COMM ID  (고정)
                                                                        "FRONT LOOP",   // 명칭 (고정)
                                                                        1,          // COMM LOOP (고정)
                                                                        RECEIVER.Port4CommBoard.Get_COM_PORT(),     // COMM_PORT
                                                                        RECEIVER.Port4CommBoard.BaudRate,           // BAUD_RATE
                                                                        RECEIVER.Port4CommBoard.Get_COM_PARITY(),   // Parity
                                                                        RECEIVER.Port4CommBoard.DataBits,           // DATABits
                                                                        RECEIVER.Port4CommBoard.Get_COM_STOPBIT(),  // StopBits
                                                                        RECEIVER.Port4CommBoard.TimeOut,            // TimeOut
                                                                        RECEIVER.Port4CommBoard.Delay,              // Delay
                                                                        RECEIVER.Port4CommBoard.Delta_Volt,         // Delta Volt (전압차 발생시 표시)
                                                                        RECEIVER.Port4CommBoard.Retry_Count,       // 통신 Retry Count
                                                                        (RECEIVER.Port4CommBoard.Use_Flag ? "Y" : "N"));    // 사용여부

                string sSQL_COMM_IOBoard = _Sql.TB_COMM_table_Insert(iReceiverID,  // Receiver ID
                                                                        3,           // COMM ID  (고정)
                                                                        "IO BOARD",   // 명칭 (고정)
                                                                        3,          // COMM LOOP (고정)
                                                                        RECEIVER.Port4IOBoard.Get_COM_PORT(),     // COMM_PORT
                                                                        RECEIVER.Port4IOBoard.BaudRate,           // BAUD_RATE
                                                                        RECEIVER.Port4IOBoard.Get_COM_PARITY(),   // Parity
                                                                        RECEIVER.Port4IOBoard.DataBits,           // DATABits
                                                                        RECEIVER.Port4IOBoard.Get_COM_STOPBIT(),  // StopBits
                                                                        RECEIVER.Port4IOBoard.TimeOut,            // TimeOut
                                                                        RECEIVER.Port4IOBoard.Delay,              // Delay
                                                                        RECEIVER.Port4IOBoard.Delta_Volt,         // Delta Volt (전압차 발생시 표시)
                                                                        RECEIVER.Port4IOBoard.Retry_Count,       // 통신 Retry Count
                                                                        (RECEIVER.Port4IOBoard.Use_Flag ? "Y" : "N"));    // 사용여부

                string sSQL_COMM_KeyPAD = _Sql.TB_COMM_table_Insert(iReceiverID,  // Receiver ID
                                                                         4,           // COMM ID  (고정)
                                                                         "KEYPAD",   // 명칭 (고정)
                                                                         4,          // COMM LOOP (고정)
                                                                         RECEIVER.Port4KeyPAD.Get_COM_PORT(),     // COMM_PORT
                                                                         RECEIVER.Port4KeyPAD.BaudRate,           // BAUD_RATE
                                                                         RECEIVER.Port4KeyPAD.Get_COM_PARITY(),   // Parity
                                                                         RECEIVER.Port4KeyPAD.DataBits,           // DATABits
                                                                         RECEIVER.Port4KeyPAD.Get_COM_STOPBIT(),  // StopBits
                                                                         RECEIVER.Port4KeyPAD.TimeOut,            // TimeOut
                                                                         RECEIVER.Port4KeyPAD.Delay,              // Delay
                                                                         RECEIVER.Port4KeyPAD.Delta_Volt,         // Delta Volt (전압차 발생시 표시)
                                                                         RECEIVER.Port4KeyPAD.Retry_Count,       // 통신 Retry Count
                                                                         (RECEIVER.Port4KeyPAD.Use_Flag ? "Y" : "N"));    // 사용여부

                string sSQL_COMM_EmergencyBroadcast = _Sql.TB_COMM_table_Insert(iReceiverID,  // Receiver ID
                                                                         5,           // COMM ID  (고정)
                                                                         "BroadCast",   // 명칭 (고정)
                                                                         5,          // COMM LOOP (고정)
                                                                         RECEIVER.Port4EmergencyBroadcast.Get_COM_PORT(),     // COMM_PORT
                                                                         RECEIVER.Port4EmergencyBroadcast.BaudRate,           // BAUD_RATE
                                                                         RECEIVER.Port4EmergencyBroadcast.Get_COM_PARITY(),   // Parity
                                                                         RECEIVER.Port4EmergencyBroadcast.DataBits,           // DATABits
                                                                         RECEIVER.Port4EmergencyBroadcast.Get_COM_STOPBIT(),  // StopBits
                                                                         RECEIVER.Port4EmergencyBroadcast.TimeOut,            // TimeOut
                                                                         RECEIVER.Port4EmergencyBroadcast.Delay,              // Delay
                                                                         RECEIVER.Port4EmergencyBroadcast.Delta_Volt,         // Delta Volt (전압차 발생시 표시)
                                                                         RECEIVER.Port4EmergencyBroadcast.Retry_Count,       // 통신 Retry Count
                                                                         (RECEIVER.Port4EmergencyBroadcast.Use_Flag ? "Y" : "N"));    // 사용여부

                _Db.Execute(sSQL_COMM_CommBoard);
                _Db.Execute(sSQL_COMM_IOBoard);
                _Db.Execute(sSQL_COMM_KeyPAD);
                _Db.Execute(sSQL_COMM_EmergencyBroadcast);

                // TB_CONFIG
                _Db.Execute(_Sql.Delete_Table("TB_CONFIG", RECEIVER.ID));

                string sSQL_Config = _Sql.TB_CONFIG_table_Insert(iReceiverID,       // 수신기 ID
                                                                 (RECEIVER.FIRE_ACCUMULATION_MODE ? "Y" : "N"),  // 축적 모드 여부
                                                                 RECEIVER.FIRE_ACCUMULATION_SECOND,   // 축적 시간
                                                                 (RECEIVER.RECOVER_MODE ? "Y" : "N"),  // 자동복구 (N) / 지속(Y)
                                                                 RECEIVER.USERID,    // Master USER ID
                                                                 RECEIVER.USER_PASSWORD,    // Master Password
                                                                 RECEIVER.NAME,    // 빌딩명 (수신기명)
                                                                 (RECEIVER.JUMP_TO_VIEW ? "Y" : "N"),   // 화재시 화면 이동 여부 (Y/N)
                                                                 (RECEIVER.MASTER_FLAG ? "Y" : "N"), // 네트워크 수신기 설정 기능 추가 MASTER_FLAG 여부 (Y/N)
                                                                 "N" // 시운전모드 // cyim 2013.7.3 시운전모드 초기값 변경 // 기본값 변경 cyim 2013.7.29 Y->N
                                                                 );
                _Db.Execute(sSQL_Config);

                // TB_DEVICE_TYPE 중에 타입이 SYMBOL_TYPE 중 O 는 무조건 N 으로 변경한다
                _Db.UPDATE("TB_DEVICE_TYPE", "SYMBOL_TYPE=O", "USE_FLAG=N");

                // TB_RECEIVER
                // 기존 데이터는 지운다.
                _Db.Execute(_Sql.Delete_Table("TB_RECEIVER", RECEIVER.ID));

                string sSQL_Receiver = _Sql.TB_RECEIVER_table_Insert(iReceiverID, RECEIVER.NAME, RECEIVER.IP, RECEIVER.EVENT_PORT, RECEIVER.COMMAND_PORT, RECEIVER.sUseFlag, RECEIVER.MODEL);
                _Db.Execute(sSQL_Receiver);
            }
            catch (Exception ex)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(ex.ToString());
                // 실패하였습니다
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.FailInform, 0);
            }
        }

        // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
        public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 윈도우 스타일 변경 이벤트 핸들러 해제
            _Event.WindowStyleSet_SendMessage_Event -= new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);
        }

        // 윈도우 스타일 변경 이벤트
        public void _Event_WindowStyleSet_SendMessage_Event()
        {
            UI_Style_Initialize();
        }

        // 스타일 초기화 함수
        private void UI_Style_Initialize()
        {

        }

        // 기본 데이터를 RECEIVER에 채운다.
        public void Initialize_Defalut()
        {
            //수신기 기본 아이피는 127.0.0.1 -> 네트워크수신기 설정시에는 반드시 Static 아이피를 사용해야한다
            // 기본값 (현재아이피)
            string[] myip = { "127", "0", "0", "1" };//_Convert.String_to_ArrayString(_Convert.Split_IPAddress, _Tcp.MyIP());
            EditBox_IP1.Text = myip[0];
            EditBox_IP2.Text = myip[1];
            EditBox_IP3.Text = myip[2];
            EditBox_IP4.Text = myip[3];

            // 기본 데이터로 RECEIVER 클래스의 내용을 채운다.         

            // IP
            RECEIVER.IP = EditBox_IP1.Text + _Text.Period + EditBox_IP2.Text + _Text.Period + EditBox_IP3.Text + _Text.Period + EditBox_IP4.Text;

            RECEIVER.EVENT_PORT = 9001;
            RECEIVER.COMMAND_PORT = 9002;

            // 축적 모드 (true:축척, false:비축척)
            //RECEIVER.FIRE_ACCUMULATION_MODE = false;  <= 자동 설정이 됨.
            RECEIVER.FIRE_ACCUMULATION_SECOND = 0;

            // 수신기 모델
            RECEIVER.MODEL = DEFAULT_MODEL;

            // 수신기 모델에 따른 통신보드 개수
            RECEIVER.COM_BOARD_MAX_NUM = 64;

            // 복구 모드 (false: 자동복구, true: 지속)
            RECEIVER.RECOVER_MODE = false;

            RECEIVER.NAME = "";

            // 화재 감지되면 해당 화면으로 점프함. 
            RECEIVER.JUMP_TO_VIEW = false; // 기본값 변경 cyim 2013.7.29 Y->N

            // 네트워크 수신기 설정 기능 추가 (신규로 들어가는 경우 슬레이브)
            RECEIVER.MASTER_FLAG = false;

            // 서브 포트 내용을 초기화한다.
            Initialize_SubPort();

            // 이름
            RECEIVER.KEY_NAME = _Text.UI_TREE_RECEIVER + RECEIVER.ID + " [" + RECEIVER.MODEL + "]";

        }

        // 수신기 표시 내용 채워넣기
        public void Fill_ReceiverData()
        {
            // 빌딩명칭 표시
            editBox_BuildingName.Text = RECEIVER.NAME;

            // 기본값 (현재아이피)
            string[] myip = _Convert.String_to_ArrayString(_Convert.Split_IPAddress, RECEIVER.IP);
            EditBox_IP1.Text = myip[0];
            EditBox_IP2.Text = myip[1];
            EditBox_IP3.Text = myip[2];
            EditBox_IP4.Text = myip[3];

            // 축적 내용 표시
            uiComboBox_FireAccumulation.Items.Clear();

            uiComboBox_FireAccumulation.Items.Add("0 (축적안함)");
            uiComboBox_FireAccumulation.Items.Add("30");
            uiComboBox_FireAccumulation.Items.Add("40");
            uiComboBox_FireAccumulation.Items.Add("50");
            uiComboBox_FireAccumulation.Items.Add("60");

            switch (RECEIVER.FIRE_ACCUMULATION_SECOND)
            {
                case 0:
                    uiComboBox_FireAccumulation.SelectedIndex = 0;
                    break;
                case 30:
                    uiComboBox_FireAccumulation.SelectedIndex = 1;
                    break;
                case 40:
                    uiComboBox_FireAccumulation.SelectedIndex = 2;
                    break;
                case 50:
                    uiComboBox_FireAccumulation.SelectedIndex = 3;
                    break;
                case 60:
                    uiComboBox_FireAccumulation.SelectedIndex = 4;
                    break;
            }

            // 포트번호 표시 (이벤트 포트, 명령 포트)
            editBox_CommandPort.Text = Convert.ToString(RECEIVER.COMMAND_PORT);
            editBox_EventPort.Text = Convert.ToString(RECEIVER.EVENT_PORT);

            // Jump To View 플래그 표시
            uiCheckBox_ViewChange.Checked = RECEIVER.JUMP_TO_VIEW;

            // 네트워크 수신기 설정 기능 추가
            uiCheckBox_MasterFlag.Checked = RECEIVER.MASTER_FLAG;

            // cyim 2016.12.02 : 수신기 모델 설정 기능 추가
            if (RECEIVER.MODEL == "IFC3300") uiRadioButton_IFC3300.Checked = true;
            else if (RECEIVER.MODEL == "IFC3000") uiRadioButton_IFC3000.Checked = true;
            else if (RECEIVER.MODEL == "IFC2000") uiRadioButton_IFC2000.Checked = true;
            else if (RECEIVER.MODEL == "IFC1000") uiRadioButton_IFC1000.Checked = true;
            else uiRadioButton_IFC1000.Checked = true;

            // 화재 모드 표시  (False = 자동복구, True = 지속)
            if (RECEIVER.RECOVER_MODE == false) uiRadioButton_AutoRecover.Checked = true;
            else uiRadioButton_Steady.Checked = true;
        }

        private bool Check_IP_Range(string Data)
        {
            try
            {
                int ip = Int32.Parse(Data);

                if (ip >= 0 && ip <= 255)
                    return true;
                else
                    return false;
            }
            catch
            {
                return false;
            }
        }

        // 추가 버튼
        public void UiButton_SubPortAdd_Click(object sender, EventArgs e)
        {
            // 예외처리 (미구현)
            // ID 가 양수형 숫자인지
            // IP 라면 범위초과인지

            string IP1 = EditBox_IP1.Text;
            string IP2 = EditBox_IP2.Text;
            string IP3 = EditBox_IP3.Text;
            string IP4 = EditBox_IP4.Text;

            // IP
            RECEIVER.IP = IP1 + _Text.Period + IP2 + _Text.Period + IP3 + _Text.Period + IP4;

            //// 기존의 IP 가 있는지 체크해서 있다면 경고 팝업창 처리
            //foreach (string RECEIVER_KEY in _Data.LIST_RECEIVER_ID)
            //{
            //    if (((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_KEY]).IP == RECEIVER.IP)
            //    {
            //        _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.OverLapIP, 0);
            //        return;
            //    }
            //}

            // 공백 허용 안함
            if (IP1.Trim().Length == 0
                || IP2.Trim().Length == 0
                || IP3.Trim().Length == 0
                || IP4.Trim().Length == 0)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NullIP, 0);
                return;
            }

            // 허용 범위 체크
            if (Check_IP_Range(IP1) == false
                || Check_IP_Range(IP2) == false
                || Check_IP_Range(IP3) == false
                || Check_IP_Range(IP4) == false)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotIP, 0);
                return;
            }

            // 편집모드가 아닌 신규추가용인 경우
            if (EditMode == false)
            {
                // 기존의 ID 가 있는지 체크해서 있다면 경고 팝업창 처리
                if (_Data.HASH_RECEIVER.ContainsKey(RECEIVER.ID) == true)
                {
                    _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.OverLapKey, 0);
                    return;
                }
            }

            // 빌딩명칭 체크
            if (editBox_BuildingName.Text == null || editBox_BuildingName.Text.Trim().Length == 0)
            {
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotCorrectBuildName, 0);
                //return; // 프로젝트 열기시에 빌딩명이 없어도 읽을수 있도록 처리 - cyim 2013.6.18
            }
            else if (_Error.Data_Confirm_NotDefineString(this.editBox_BuildingName.Text.Trim()) != null)
            {
                // 상위 비교문에서 팝업처리
                return;
            }

            // 빌딩명칭 표시 (선후행공백처리)
            RECEIVER.NAME = editBox_BuildingName.Text.Trim();

            if (uiComboBox_FireAccumulation.SelectedIndex == 0)
            {
                RECEIVER.FIRE_ACCUMULATION_SECOND = 0;
            }
            else
            {
                RECEIVER.FIRE_ACCUMULATION_SECOND = Convert.ToInt16(uiComboBox_FireAccumulation.SelectedValue);
            }

            // COMMAND Port
            RECEIVER.COMMAND_PORT = Util.StrToInt(editBox_CommandPort.Text, 0);
            // Event Port
            RECEIVER.EVENT_PORT = Util.StrToInt(editBox_EventPort.Text, 0);

            // Jump To View 플래그 표시
            RECEIVER.JUMP_TO_VIEW = uiCheckBox_ViewChange.Checked;

            // 네트워크 수신기 설정 기능 추가
            RECEIVER.MASTER_FLAG = uiCheckBox_MasterFlag.Checked;

            // 복구 모드 (False  = 자동복구, False = 지속)
            if (uiRadioButton_AutoRecover.Checked == true)
            {
                RECEIVER.RECOVER_MODE = false;
            }
            else
            {
                RECEIVER.RECOVER_MODE = true;
            }

            // cyim 2016.12.02 : 수신기 모델 설정 기능 추가
            if (uiRadioButton_IFC3300.Checked == true) RECEIVER.MODEL = "IFC3300";
            else if (uiRadioButton_IFC1000.Checked == true) RECEIVER.MODEL = "IFC1000";
            else if (uiRadioButton_IFC2000.Checked == true) RECEIVER.MODEL = "IFC2000";
            else if (uiRadioButton_IFC3000.Checked == true) RECEIVER.MODEL = "IFC3000";

            // 이름
            RECEIVER.KEY_NAME = _Text.UI_TREE_RECEIVER + RECEIVER.ID + " [" + RECEIVER.MODEL + "]";

            // 편집모드가 아닌 신규추가용인 경우
            if (EditMode == false)
            {
                // 해쉬에 추가 
                if (_Hash.Add(_Data.HASH_RECEIVER, RECEIVER.ID, RECEIVER) == true)
                {
                    // 키리스트에 추가
                    _Data.LIST_RECEIVER_ID.Add(RECEIVER.ID);
                }

                // 트리에 추가
                _Event.TreeView_ReceiverNodeSet_SendMessage_Write(RECEIVER);
            }
            else
            {
                // 완료 이벤트 발생
                _Event.WorkViewPageName_Receiver_SendMessage_Write(RECEIVER.ID);
            }

            // DB 에 저장
            _Event_Project_Receiver_Save_Event();

            // 수신기 편집만 저장한다고 나옴, 즉 추가의 경우는 팝업창이 출력되지 않는다
            if (EditMode == true)
            {
                // 저장하였습니다
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.SaveInform, 0);
            }
            else
            {
                // 신규 수신기 아이디 추가
                if (_Data.LIST_XMLRECEIVER_ID.Contains(RECEIVER.ID) == false)
                    _Data.LIST_XMLRECEIVER_ID.Add(RECEIVER.ID);

                // 수신기 파일 생성
                _File.Write_Receiver_XML(_Data.Project_Path + "\\" + _Data.Project_Name);
            }

            // 프로젝트 수정
            _Data.ProJect_Save_Complete = false;

            // 폼종료
            this.Close();
        }

        COMM_STOPBIT GetStopBits(string sParam)
        {
            COMM_STOPBIT eRet = COMM_STOPBIT.ONESTOPBIT;  // 디폴트값

            if (sParam == "2") eRet = COMM_STOPBIT.TWOSTOPBITS;
            if (sParam == "1.5") eRet = COMM_STOPBIT.ONE5STOPBITS;

            return eRet;
        }

        COMM_PARITY GetParity(string sParam)
        {
            COMM_PARITY eRet = COMM_PARITY.NONE;  // 디폴트값

            if (sParam == "E") eRet = COMM_PARITY.EVEN;
            if (sParam == "O") eRet = COMM_PARITY.ODD;

            return eRet;
        }

        int GetComPort(string sParam)
        {
            int iRet = 0;

            if (sParam == "COM1") iRet = 1;
            if (sParam == "COM2") iRet = 2;
            if (sParam == "COM3") iRet = 3;
            if (sParam == "COM4") iRet = 4;
            if (sParam == "COM5") iRet = 5;
            if (sParam == "COM6") iRet = 6;
            if (sParam == "COM7") iRet = 7;
            if (sParam == "COM8") iRet = 8;

            return iRet;
        }

        // 무작정 Alter 명령어를 사용하면 기존의 데이타가 삭제되어 버린다
        public bool Column_Check(string ColumnName, string TableName)
        {
            string SQL = string.Format("SELECT Count({0}) FROM {1}", ColumnName, TableName);

            // 접속 세션
            FirebirdSql.Data.FirebirdClient.FbConnection session = null;
            // 접속된 상태의 명령어
            FirebirdSql.Data.FirebirdClient.FbCommand command = null;
            // 접속 세션 주소
            string address = null;

            try
            {
                // 접속 세션 주소 셋팅
                address = string.Format("Server={0};User={1};Password={2};Database={3};Charset={4};ServerType={5}",
                                _Data.DB_IP,        // IP ex)192.168.63.22 
                                _Data.DB_ID,   // 사용자 
                                _Data.DB_PassWord,  // 암호 
                                _Data.DB_FullPath,      // 절대위치.. ex) C:\TEST\TEST.FDB 
                                "KSC_5601",         // KSC_5601 같은 문자셋을 지정 
                                "0");

                // 상위 문구를 신뢰하고 보내는 루틴
                session = new FirebirdSql.Data.FirebirdClient.FbConnection(address);
                session.Open();
                command = new FirebirdSql.Data.FirebirdClient.FbCommand(SQL, session);
                command.ExecuteNonQuery();

                if (session != null) session.Close();
                if (command != null) command.Dispose();

                return true;
            }
            catch (Exception e)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(e.ToString() + "SQL:" + SQL);

                if (session != null) session.Close();
                if (command != null) command.Dispose();

                return false;
            }
        }

        public bool Data_Check(string TableName, string DataName, string DataValue)
        {
            string SQL = string.Format("SELECT * FROM {0} WHERE {1}='{2}'", TableName, DataName, DataValue);

            // 접속 세션
            FirebirdSql.Data.FirebirdClient.FbConnection session = null;
            // 접속된 상태의 명령어
            FirebirdSql.Data.FirebirdClient.FbCommand command = null;
            // 접속 세션 주소
            string address = null;
            // 접속 아답터           
            FirebirdSql.Data.FirebirdClient.FbDataAdapter dataAdapter = null;
            DataSet dataSet = null;

            try
            {
                // 접속 세션 주소 셋팅
                address = string.Format("Server={0};User={1};Password={2};Database={3};Charset={4};ServerType={5}",
                                _Data.DB_IP,        // IP ex)192.168.63.22 
                                _Data.DB_ID,   // 사용자 
                                _Data.DB_PassWord,  // 암호 
                                _Data.DB_FullPath,      // 절대위치.. ex) C:\TEST\TEST.FDB 
                                "KSC_5601",         // KSC_5601 같은 문자셋을 지정 
                                "0");

                // 상위 문구를 신뢰하고 보내는 루틴
                session = new FirebirdSql.Data.FirebirdClient.FbConnection(address);
                session.Open();
                command = new FirebirdSql.Data.FirebirdClient.FbCommand(SQL, session);

                dataAdapter = new FirebirdSql.Data.FirebirdClient.FbDataAdapter(SQL, session);
                dataAdapter.SelectCommand = command;
                dataSet = new DataSet();
                dataAdapter.Fill(dataSet, "GetData");

                if (dataAdapter != null) dataAdapter.Dispose();
                if (session != null) session.Close();
                if (command != null) command.Dispose();
                if (dataSet != null) dataSet.Dispose();

                if (dataSet.Tables["GetData"].Rows.Count > 0) return true;
                else return false;
            }
            catch (Exception e)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(e.ToString() + "SQL:" + SQL);

                if (dataAdapter != null) dataAdapter.Dispose();
                if (session != null) session.Close();
                if (command != null) command.Dispose();
                if (dataSet != null) dataSet.Dispose();

                return false;
            }
        }

        // 아래 함수는 프로젝트 읽기하는 경우 무조건 진입하는 함수이다.
        // DB에서 수신기 정보를 읽어 RECEIVER에 값을 넣는다.
        // 또한 강제쿼리를 날려서 데이타베이스 변경이 필요한 경우에 반영하도록 한다
        public int Initialize_Receiver_FromDB(string Receiver_ID)
        {
            //
            // cyim 2016.12.02 : 프로젝트를 열때 강제 쿼리	
            //

            // cyim 2016.09.21 : TB_BOARD_2 테이블 사용하도록 한내용을 다시 TB_BOARD 로 변경한다. 결국은 무조건 프로젝트를 열때 컬럼이 추가된다. 기존에 있다면 예외 처리됨
            if (Column_Check("LOOP2_USE_FLAG", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP2_USE_FLAG VARCHAR(1)");
            if (Column_Check("LOOP3_USE_FLAG", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP3_USE_FLAG VARCHAR(1)");
            if (Column_Check("LOOP2_BAUD_RATE", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP2_BAUD_RATE VARCHAR(1)"); // cyim 2016.11.04 : 잘못된 쿼리 수정
            if (Column_Check("LOOP3_BAUD_RATE", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP3_BAUD_RATE VARCHAR(1)");
            if (Column_Check("LOOP2_CUT_FLAG", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP2_CUT_FLAG VARCHAR(1)");
            if (Column_Check("LOOP3_CUT_FLAG", "TB_BOARD") == false) _Db.Execute("ALTER TABLE TB_BOARD ADD LOOP3_CUT_FLAG VARCHAR(1)");
            if (Column_Check("MODEL", "TB_RECEIVER") == false) _Db.Execute("ALTER TABLE TB_RECEIVER ADD MODEL VARCHAR(20)");

            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "EW") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "EW", "설비출력상태 ON", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "EF") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "EF", "설비출력상태 OFF", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "ED") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "ED", "설비전체연동조작버튼", "FireManager", "current_timestamp"));

            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A1") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A1", "가압펌프1 스위치 기동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A2") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A2", "가압펌프1 스위치 정지", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A3") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A3", "가압펌프2 스위치 기동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A4") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A4", "가압펌프2 스위치 정지", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A5") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A5", "비상발전기 스위치 기동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "A6") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "A6", "비상발전기 스위치 정지", "FireManager", "current_timestamp"));

            // cyim 2017.01.17 신규 이벤트 추가 (펌프 수동기동)           
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "PA") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "PA", "PUMP1 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "PB") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "PB", "PUMP2 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "PC") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "PC", "PUMP3 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "PD") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "PD", "PUMP4 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "SA") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "SA", "PUMP5 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "SB") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "SB", "PUMP6 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "SC") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "SC", "PUMP7 스위치 수동", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "SD") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "SD", "PUMP8 스위치 수동", "FireManager", "current_timestamp"));

            // cyim 2017.02.14 : 강제쿼리     
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "O3") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "O3", "화재축적모드설정(30초)", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "O4") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "O4", "화재축적모드설정(40초)", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "O5") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "O5", "화재축적모드설정(50초)", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "O6") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "O6", "화재축적모드설정(60초)", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "AO") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "AO", "화재축적모드설정", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "AF") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "AF", "화재축적모드비설정", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "HM") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "HM", "화재지속모드설정", "FireManager", "current_timestamp"));
            if (Data_Check("TB_EVENT_TYPE", "EVENT_TYPE", "RM") == false)
                _Db.Execute(string.Format("insert into TB_EVENT_TYPE (EVENT_TYPE,EVENT_TYPE_NAME,UPDATE_USER_ID,UPDATE_TIME) values ('{0}','{1}','{2}',{3})",
                   "RM", "자동복구모드설정", "FireManager", "current_timestamp"));

            // cyim 2016.12.15 : 프로젝트를 열때 강제 쿼리	(수신반용 테이블)
            // 존재할때 삭제하는 코드는 유보하고, 존재하지 않는 경우에는 테이블 신규 생성
            DataRowCollection DB_TABLE_Check = null;
            DB_TABLE_Check = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_USERS"));
            if (DB_TABLE_Check == null || DB_TABLE_Check.Count == 0)
                _Db.Execute(_Sql.Create_TB_USERS());
            DB_TABLE_Check = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_PUSH_DEVICE"));
            if (DB_TABLE_Check == null || DB_TABLE_Check.Count == 0)
                _Db.Execute(_Sql.Create_TB_PUSH_DEVICE());
            DB_TABLE_Check = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_RECEIVER_ERROR_COUNT"));
            if (DB_TABLE_Check == null || DB_TABLE_Check.Count == 0)
                _Db.Execute(_Sql.Create_TB_RECEIVER_ERROR_COUNT());
            DB_TABLE_Check = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_RECEIVER_ERROR_COUNT_DETAILS"));
            if (DB_TABLE_Check == null || DB_TABLE_Check.Count == 0)
                _Db.Execute(_Sql.Create_TB_RECEIVER_ERROR_COUNT_DETAILS());

            int iRetCode = 0;

            try
            {
                // DB에서 수신기 정보를 읽어온다.
                DataRowCollection DB_TABLE_TB_RECEIVER = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_RECEIVER", Receiver_ID));

                if (DB_TABLE_TB_RECEIVER != null && DB_TABLE_TB_RECEIVER.Count != 0)  // 데이터가 DB에 있다.
                {

                    // DB내의 리시버 데이터를 읽는다.
                    DataRow dr = DB_TABLE_TB_RECEIVER[0];

                    // DB 데이터를 기준으로 RECEIVER 클래스에 내용을 채운다.
                    RECEIVER.ID = dr["RECEIVER_ID"].ToString();

                    // cyim 2016.12.02 : 수신기 모델 설정 기능 추가
                    RECEIVER.MODEL = Util.NullToStr(dr["MODEL"]);
                    if (RECEIVER.MODEL == "")
                    {
                        // cyim 2016.12.05 : 만약 프로젝트를 열다가 중간에 예외 처리 및 강제 저장 옵션이 발동되었다면 경고 폼 출력
                        _Data.Receiver_Model_TempSetting = true;
                        RECEIVER.MODEL = DEFAULT_MODEL;
                        _Db.Execute(string.Format("update TB_RECEIVER set MODEL='{0}' where RECEIVER_ID={1}", RECEIVER.MODEL, Receiver_ID));
                    }

                    // 이름
                    RECEIVER.KEY_NAME = _Text.UI_TREE_RECEIVER + RECEIVER.ID + " [" + RECEIVER.MODEL + "]";

                    RECEIVER.IP = dr["IP_ADDRESS"].ToString();
                    RECEIVER.EVENT_PORT = Util.StrToInt(dr["EVENT_PORT_NO"], 0);
                    RECEIVER.COMMAND_PORT = Util.StrToInt(dr["COMMAND_PORT_NO"], 0);

                    // TB_CONFIG 테이블을 읽는다.
                    DataRowCollection DB_TABLE_TB_CONFIG = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_ConfigTable(Util.StrToInt(RECEIVER.ID, 0)));

                    if (DB_TABLE_TB_CONFIG != null)
                    {
                        dr = DB_TABLE_TB_CONFIG[0];

                        RECEIVER.FIRE_ACCUMULATION_SECOND = Util.StrToInt(dr["FIRE_ACCUMULATION_TIME"], 0);
                        RECEIVER.NAME = dr["BUILDING_NAME"].ToString();

                        if (dr["JUMP_FIELD"].ToString() == "Y")
                        {
                            RECEIVER.JUMP_TO_VIEW = true;
                        }
                        else
                        {
                            RECEIVER.JUMP_TO_VIEW = false;
                        }
                        if (dr["FIRE_PROCESS_MODE"].ToString() == "N")
                        {
                            RECEIVER.RECOVER_MODE = false;
                        }
                        else
                        {
                            RECEIVER.RECOVER_MODE = true;
                        }
                        if (dr["MASTER_FLAG"].ToString() == "Y")
                        {
                            RECEIVER.MASTER_FLAG = true;
                        }
                        else
                        {
                            RECEIVER.MASTER_FLAG = false;
                        }
                    }
                    // 리턴 코드에 RECEIVER.ID를 넣는다.
                    iRetCode = Util.StrToInt(RECEIVER.ID, 0);
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
            return iRetCode;
        }

        // DB에서 읽은 값으로 RECEIVER의 서브 포트를 채운다.
        public void Initialize_SubPort_FromDB(string Receiver_ID)
        {
            try
            {
                // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경                
                DataRowCollection DB_TABLE_TB_RECEIVER = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_RECEIVER", Receiver_ID));
                if (DB_TABLE_TB_RECEIVER != null && DB_TABLE_TB_RECEIVER.Count != 0)
                {
                    DataRow dr = DB_TABLE_TB_RECEIVER[0];

                    // 통신보드 최대개수     
                    if (Util.NullToStr(dr["MODEL"]) == "IFC3300")
                        RECEIVER.COM_BOARD_MAX_NUM = 64;
                    else
                        RECEIVER.COM_BOARD_MAX_NUM = 15;
                }

                // 통신 보드 설정 읽기  (TB_COMM)
                DataRowCollection DB_TABLE_TB_COMM = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_COMM", Receiver_ID));

                if (DB_TABLE_TB_COMM != null)
                {
                    foreach (DataRow dr in DB_TABLE_TB_COMM)
                    {
                        COMM_STOPBIT eStopBit = GetStopBits(dr["STOP_BITS"].ToString());
                        COMM_PARITY eParity = GetParity(dr["PARITY"].ToString());
                        int iComPort = GetComPort(dr["COMM_PORT"].ToString());
                        int iBaudRate = Convert.ToInt32(dr["BAUD_RATE"]);
                        int iDataBits = Convert.ToInt32(dr["DATA_BITS"]);
                        int iID = Convert.ToInt16(dr["COMM_ID"]);
                        int iTimeOut = Convert.ToInt16(dr["COMM_TIMEOUT"]);
                        int iCommDelay = Convert.ToInt16(dr["COMM_DELAY"]);
                        int iDelta_Volt = Convert.ToInt16(dr["DELTA_VOLT"]);
                        int iRetryCount = Convert.ToInt16(dr["RETRY_COUNT"]);
                        bool bUseFlag = false;

                        if (dr["USE_FLAG"].ToString() == "Y")
                        {
                            bUseFlag = true;
                        }

                        switch (iID)
                        {
                            case 1:    // Front Loop
                                {//case 2:    // Back Loop (현재 사용하지 않음.)

                                    RECEIVER.Port4CommBoard.COMM_ID = iID;
                                    // 포트 넘버 (COM1, COM2..)
                                    RECEIVER.Port4CommBoard.PortNo = iComPort;
                                    // 포트BPS (1200,9600,14400, 38400 ...)
                                    RECEIVER.Port4CommBoard.BaudRate = iBaudRate;
                                    // 포트 데이터 비트 설정 (5,6,7,8)
                                    RECEIVER.Port4CommBoard.DataBits = iDataBits;
                                    // 포트 스톱비트 설정 (1, 1.5, 2)
                                    RECEIVER.Port4CommBoard.StopBits = eStopBit;
                                    // 포트 패리티 설정 (None, Even, Odd)
                                    RECEIVER.Port4CommBoard.Parity = eParity;
                                    // 타임아웃 설정
                                    RECEIVER.Port4CommBoard.TimeOut = iTimeOut;
                                    // 통신 지연 설정
                                    RECEIVER.Port4CommBoard.Delay = iCommDelay;
                                    // 표시용 전압변화값
                                    RECEIVER.Port4CommBoard.Delta_Volt = iDelta_Volt;
                                    // 재시도 횟수
                                    RECEIVER.Port4CommBoard.Retry_Count = iRetryCount;
                                    // 사용 여부
                                    RECEIVER.Port4CommBoard.Use_Flag = bUseFlag;


                                    int temp = 1;
                                    if (RECEIVER.MODEL == "IFC3300")
                                        temp = 0;

                                    // 통신 보드 세팅
                                    for (int i = temp; i <= RECEIVER.COM_BOARD_MAX_NUM; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                                    {
                                        // 클래스 생성
                                        _COM_BOARD COM_BOARD = new _COM_BOARD();

                                        // ID 
                                        COM_BOARD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_COM_BOARD_KEY, i));
                                        // 이름
                                        COM_BOARD.Set_KEY_NAME(_Text.UI_TREE_COM_BOARD + i.ToString());

                                        //데이터 읽기
                                        DataRowCollection DB_TABLE_TB_BOARD = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Board_Table(Util.StrToInt(RECEIVER.ID, 0), iID, i));
                                        if (DB_TABLE_TB_BOARD != null && DB_TABLE_TB_BOARD.Count != 0)
                                        {
                                            DataRow dtr = DB_TABLE_TB_BOARD[0];

                                            string sUseFlag = dtr["USE_FLAG"].ToString();
                                            COM_BOARD.Set_Use_Flag(sUseFlag);

                                            if (sUseFlag == "Y")
                                            {
                                                COM_BOARD.Set_CH1_Use(dtr["LOOP0_USE_FLAG"].ToString());
                                                COM_BOARD.Set_CH2_Use(dtr["LOOP1_USE_FLAG"].ToString());
                                                COM_BOARD.Set_CH3_Use(dtr["LOOP2_USE_FLAG"].ToString());// cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                                                COM_BOARD.Set_CH4_Use(dtr["LOOP3_USE_FLAG"].ToString());
                                            }
                                            else
                                            {
                                                COM_BOARD.Set_CH1_Use("N");
                                                COM_BOARD.Set_CH2_Use("N");
                                                COM_BOARD.Set_CH3_Use("N");// cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                                                COM_BOARD.Set_CH4_Use("N");
                                            }

                                            COM_BOARD.BOARD_ID = Util.StrToInt(dtr["BOARD_ID"].ToString(), 0);
                                            COM_BOARD.BOARD_NAME = dtr["BOARD_NAME"].ToString();
                                        }
                                        else
                                        {
                                            COM_BOARD.Set_CH1_Use("N");
                                            COM_BOARD.Set_CH2_Use("N");
                                            COM_BOARD.Set_CH3_Use("N");// cyim 2016.09.21 : TB_BOARD 에 루프 0~3 저장 하도록 한다
                                            COM_BOARD.Set_CH4_Use("N");
                                            COM_BOARD.Set_Use_Flag("N");

                                            COM_BOARD.BOARD_ID = i;
                                            COM_BOARD.BOARD_NAME = String.Format("통신보드 {0}", i);
                                        }

                                        // 해쉬 추가
                                        if (_Hash.Add(RECEIVER.Hash_COM_BOARD, COM_BOARD.ID, COM_BOARD) == true)
                                        {
                                            RECEIVER.List_COM_BOARD_ID.Add(COM_BOARD.ID);
                                        }
                                    }
                                }
                                break;
                            case 3:     // IO Board
                                {
                                    // IO 보드
                                    RECEIVER.Port4IOBoard.COMM_ID = iID;
                                    // 포트 넘버 (COM1, COM2..)
                                    RECEIVER.Port4IOBoard.PortNo = iComPort;
                                    // 포트BPS (1200,9600,14400, 38400 ...)
                                    RECEIVER.Port4IOBoard.BaudRate = iBaudRate;
                                    // 포트 데이터 비트 설정 (5,6,7,8)
                                    RECEIVER.Port4IOBoard.DataBits = iDataBits;
                                    // 포트 스톱비트 설정 (1, 1.5, 2)
                                    RECEIVER.Port4IOBoard.StopBits = eStopBit;
                                    // 포트 패리티 설정 (None, Even, Odd)
                                    RECEIVER.Port4IOBoard.Parity = eParity;
                                    // 타임아웃 설정
                                    RECEIVER.Port4IOBoard.TimeOut = iTimeOut;
                                    // 통신 지연 설정
                                    RECEIVER.Port4IOBoard.Delay = iCommDelay;
                                    // 표시용 전압변화값
                                    RECEIVER.Port4IOBoard.Delta_Volt = iDelta_Volt;
                                    // 재시도 횟수
                                    RECEIVER.Port4IOBoard.Retry_Count = iRetryCount;
                                    // 사용 여부
                                    RECEIVER.Port4IOBoard.Use_Flag = bUseFlag;

                                    int temp = 1;
                                    if (RECEIVER.MODEL == "IFC3300")
                                        temp = 0;
                                    // IO 보드 세팅
                                    for (int i = temp; i <= RECEIVER.IO_BOARD_MAX_NUM; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                                    {
                                        // 클래스 생성
                                        _IO_BOARD IO_BOARD = new _IO_BOARD();
                                        // ID 
                                        IO_BOARD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_IO_BOARD_KEY, i));
                                        // 이름
                                        IO_BOARD.Set_KEY_NAME(_Text.UI_TREE_IO_BOARD + i.ToString());// 클래스 생성

                                        //데이터 읽기
                                        DataRowCollection DB_TABLE_TB_BOARD = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Board_Table(Util.StrToInt(RECEIVER.ID, 0), iID, i));
                                        if (DB_TABLE_TB_BOARD != null && DB_TABLE_TB_BOARD.Count != 0)
                                        {
                                            DataRow dtr = DB_TABLE_TB_BOARD[0];

                                            IO_BOARD.Set_Use_Flag(dtr["USE_FLAG"].ToString());

                                            IO_BOARD.BOARD_ID = Util.StrToInt(dtr["BOARD_ID"].ToString(), 0);
                                            IO_BOARD.BOARD_NAME = dtr["BOARD_NAME"].ToString();
                                        }
                                        else
                                        {
                                            IO_BOARD.Set_Use_Flag("N");
                                            IO_BOARD.BOARD_ID = i;
                                            IO_BOARD.BOARD_NAME = String.Format("I/O 보드 {0}", i);
                                        }

                                        // 해쉬 추가
                                        if (_Hash.Add(RECEIVER.Hash_IO_BOARD, IO_BOARD.ID, IO_BOARD) == true)
                                        {
                                            RECEIVER.List_IO_BOARD_ID.Add(IO_BOARD.ID);
                                        }
                                    }
                                }
                                break;
                            case 4:     // KeyPAD
                                RECEIVER.Port4KeyPAD.COMM_ID = iID;
                                // 포트 넘버 (COM1, COM2..)
                                RECEIVER.Port4KeyPAD.PortNo = iComPort;
                                // 포트BPS (1200,9600,14400, 38400 ...)
                                RECEIVER.Port4KeyPAD.BaudRate = iBaudRate;
                                // 포트 데이터 비트 설정 (5,6,7,8)
                                RECEIVER.Port4KeyPAD.DataBits = iDataBits;
                                // 포트 스톱비트 설정 (1, 1.5, 2)
                                RECEIVER.Port4KeyPAD.StopBits = eStopBit;
                                // 포트 패리티 설정 (None, Even, Odd)
                                RECEIVER.Port4KeyPAD.Parity = eParity;
                                // 타임아웃 설정
                                RECEIVER.Port4KeyPAD.TimeOut = iTimeOut;
                                // 통신 지연 설정
                                RECEIVER.Port4KeyPAD.Delay = iCommDelay;
                                // 표시용 전압변화값
                                RECEIVER.Port4KeyPAD.Delta_Volt = iDelta_Volt;
                                // 재시도 횟수
                                RECEIVER.Port4KeyPAD.Retry_Count = iRetryCount;
                                // 사용 여부
                                RECEIVER.Port4KeyPAD.Use_Flag = bUseFlag;

                                _KEYPAD KEYPAD = new _KEYPAD();
                                // ID 
                                KEYPAD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_KEYPAD_KEY, 1));
                                // 이름
                                KEYPAD.Set_KEY_NAME(_Text.UI_TREE_KEYPAD); // 오직 하나뿐

                                //데이터 읽기
                                DataRowCollection DB_TABLE_TB_BOARD_KEYPAD = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Board_Table(Util.StrToInt(RECEIVER.ID, 0), iID, 0));
                                if (DB_TABLE_TB_BOARD_KEYPAD != null && DB_TABLE_TB_BOARD_KEYPAD.Count != 0)   // DB가 데이터에 있는 경우..
                                {                                       // 데이터로 KEYPAD 클래스의 프로퍼티를 채운다.
                                    DataRow dtr = DB_TABLE_TB_BOARD_KEYPAD[0];

                                    KEYPAD.Set_Use_Flag(dtr["USE_FLAG"].ToString());

                                    KEYPAD.BOARD_ID = Util.StrToInt(dtr["BOARD_ID"].ToString(), 0);
                                    KEYPAD.BOARD_NAME = dtr["BOARD_NAME"].ToString();
                                }
                                else  // DB에 데이터가 없는 경우..
                                {       // 디폴트값으로 KEYPAD 클래스의 프로퍼티를 채우자.
                                    KEYPAD.Set_Use_Flag("N");   // 사용 안함으로 세팅한다.
                                    KEYPAD.BOARD_ID = 0;
                                    KEYPAD.BOARD_NAME = "키패드";
                                }

                                RECEIVER.KEYPAD = KEYPAD;

                                break;
                            case 5:     // BroadCast (비상방송)
                                RECEIVER.Port4EmergencyBroadcast.COMM_ID = iID;
                                // 포트 넘버 (COM1, COM2..)
                                RECEIVER.Port4EmergencyBroadcast.PortNo = iComPort;
                                // 포트BPS (1200,9600,14400, 38400 ...)
                                RECEIVER.Port4EmergencyBroadcast.BaudRate = iBaudRate;
                                // 포트 데이터 비트 설정 (5,6,7,8)
                                RECEIVER.Port4EmergencyBroadcast.DataBits = iDataBits;
                                // 포트 스톱비트 설정 (1, 1.5, 2)
                                RECEIVER.Port4EmergencyBroadcast.StopBits = eStopBit;
                                // 포트 패리티 설정 (None, Even, Odd)
                                RECEIVER.Port4EmergencyBroadcast.Parity = eParity;
                                // 타임아웃 설정
                                RECEIVER.Port4EmergencyBroadcast.TimeOut = iTimeOut;
                                // 통신 지연 설정
                                RECEIVER.Port4EmergencyBroadcast.Delay = iCommDelay;
                                // 표시용 전압변화값
                                RECEIVER.Port4EmergencyBroadcast.Delta_Volt = iDelta_Volt;
                                // 재시도 횟수
                                RECEIVER.Port4EmergencyBroadcast.Retry_Count = iRetryCount;
                                // 사용 여부
                                RECEIVER.Port4EmergencyBroadcast.Use_Flag = bUseFlag;

                                _EMERGENCY_BROADCAST EMERGENCY_BROADCAST = new _EMERGENCY_BROADCAST();
                                // ID 
                                EMERGENCY_BROADCAST.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_EMERGENCY_BROADCAST_KEY, 1));
                                // 이름
                                EMERGENCY_BROADCAST.Set_KEY_NAME(_Text.UI_TREE_EMERGENCY_BROADCAST); // 오직 하나뿐                          


                                RECEIVER.EMERGENCY_BROADCAST = EMERGENCY_BROADCAST;
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // RECEIVER의 서브 포트를 디폴트값으로 채운다.
        public void Initialize_SubPort()
        {
            // 통신 보드와 메인보드가 통신하기 위한 통신보드용 Serial 포트 설정. (메인보드)

            RECEIVER.Port4CommBoard.COMM_ID = 1;
            // 포트 넘버 (COM1, COM2..)
            RECEIVER.Port4CommBoard.PortNo = 1;
            // 포트BPS (1200,9600,14400, 38400 ...)
            RECEIVER.Port4CommBoard.BaudRate = 115200;
            // 포트 데이터 비트 설정 (5,6,7,8)
            RECEIVER.Port4CommBoard.DataBits = 8;
            // 포트 스톱비트 설정 (1, 1.5, 2)
            RECEIVER.Port4CommBoard.StopBits = COMM_STOPBIT.ONESTOPBIT;
            // 포트 패리티 설정 (None, Even, Odd)
            RECEIVER.Port4CommBoard.Parity = COMM_PARITY.NONE;
            // 타임아웃 설정
            RECEIVER.Port4CommBoard.TimeOut = _COMM_TIMEOUT;
            // 통신 지연 설정
            RECEIVER.Port4CommBoard.Delay = _COMM_DELAY;
            // 표시용 전압변화값
            RECEIVER.Port4CommBoard.Delta_Volt = _DELTA_VOLT;
            // 재시도 횟수
            RECEIVER.Port4CommBoard.Retry_Count = _RETRY_COUNT;
            // 사용 여부
            RECEIVER.Port4CommBoard.Use_Flag = true;

            int temp = 1;
            if (RECEIVER.MODEL == "IFC3300")
                temp = 0;
            for (int i = temp; i <= RECEIVER.COM_BOARD_MAX_NUM; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
            {
                // 클래스 생성
                _COM_BOARD COM_BOARD = new _COM_BOARD();
                // ID 
                COM_BOARD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_COM_BOARD_KEY, i));
                // 이름
                COM_BOARD.Set_KEY_NAME(_Text.UI_TREE_COM_BOARD + i.ToString());

                // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
                DataRowCollection DB_TABLE_TB_RECEIVER = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_RECEIVER", RECEIVER.ID));
                if (DB_TABLE_TB_RECEIVER != null && DB_TABLE_TB_RECEIVER.Count != 0)
                {
                    DataRow dr = DB_TABLE_TB_RECEIVER[0];

                    if (Util.NullToStr(dr["MODEL"]) == "IFC3300")
                    {
                        if (i == 0)
                        {
                            COM_BOARD.Set_Use_Flag("Y");
                            COM_BOARD.Set_CH1_Use("Y");
                            COM_BOARD.Set_CH2_Use("N");
                            COM_BOARD.Set_CH3_Use("N");
                            COM_BOARD.Set_CH4_Use("N");
                        }
                        else
                        {
                            COM_BOARD.Set_Use_Flag("N");
                            COM_BOARD.Set_CH1_Use("N");
                            COM_BOARD.Set_CH2_Use("N");
                            COM_BOARD.Set_CH3_Use("N");
                            COM_BOARD.Set_CH4_Use("N");
                        }
                    }
                    else
                    {
                        if (i == 15)
                        {
                            COM_BOARD.Set_CH1_Use("Y");
                            COM_BOARD.Set_CH2_Use("N");
                            COM_BOARD.Set_Use_Flag("Y");
                        }
                        else
                        {
                            COM_BOARD.Set_CH1_Use("N");
                            COM_BOARD.Set_CH2_Use("N");
                            COM_BOARD.Set_Use_Flag("N");
                        }
                    }
                }

                COM_BOARD.BOARD_ID = i;
                COM_BOARD.BOARD_NAME = String.Format("통신보드 {0}", i);
                // 해쉬 추가
                if (_Hash.Add(RECEIVER.Hash_COM_BOARD, COM_BOARD.ID, COM_BOARD) == true)
                {
                    RECEIVER.List_COM_BOARD_ID.Add(COM_BOARD.ID);
                }
            }

            // IO 보드
            RECEIVER.Port4IOBoard.COMM_ID = 3;
            // 포트 넘버 (COM1, COM2..)
            RECEIVER.Port4IOBoard.PortNo = 3;
            // 포트BPS (1200,9600,14400, 38400 ...)
            RECEIVER.Port4IOBoard.BaudRate = 115200;
            // 포트 데이터 비트 설정 (5,6,7,8)
            RECEIVER.Port4IOBoard.DataBits = 8;
            // 포트 스톱비트 설정 (1, 1.5, 2)
            RECEIVER.Port4IOBoard.StopBits = COMM_STOPBIT.ONESTOPBIT;
            // 포트 패리티 설정 (None, Even, Odd)
            RECEIVER.Port4IOBoard.Parity = COMM_PARITY.NONE;
            // 타임아웃 설정
            RECEIVER.Port4IOBoard.TimeOut = _COMM_TIMEOUT;
            // 통신 지연 설정
            RECEIVER.Port4IOBoard.Delay = _COMM_DELAY;
            // 표시용 전압변화값
            RECEIVER.Port4IOBoard.Delta_Volt = _DELTA_VOLT;
            // 재시도 횟수
            RECEIVER.Port4IOBoard.Retry_Count = _RETRY_COUNT;
            // 사용 여부
            RECEIVER.Port4IOBoard.Use_Flag = true;

            int tmp = 1;
            if (RECEIVER.MODEL == "IFC3300")
                tmp = 0;
            for (int i = tmp; i <= RECEIVER.IO_BOARD_MAX_NUM; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
            {
                // 클래스 생성
                _IO_BOARD IO_BOARD = new _IO_BOARD();
                // ID 
                IO_BOARD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_IO_BOARD_KEY, i));
                // 이름
                IO_BOARD.Set_KEY_NAME(_Text.UI_TREE_IO_BOARD + i.ToString());

                if (i == 15)
                {
                    IO_BOARD.Set_Use_Flag("Y");
                }
                else
                {
                    IO_BOARD.Set_Use_Flag("N");
                }
                IO_BOARD.BOARD_ID = i;
                IO_BOARD.BOARD_NAME = String.Format("I/O 보드 {0}", i);

                // 해쉬 추가
                if (_Hash.Add(RECEIVER.Hash_IO_BOARD, IO_BOARD.ID, IO_BOARD) == true)
                {
                    RECEIVER.List_IO_BOARD_ID.Add(IO_BOARD.ID);
                }
            }

            // 키패드
            RECEIVER.Port4KeyPAD.COMM_ID = 4;
            // 포트 넘버 (COM1, COM2..)
            RECEIVER.Port4KeyPAD.PortNo = 5;    // cyim 기본값 변경 비상방송은 4->5
            // 포트BPS (1200,9600,14400, 38400 ...)
            RECEIVER.Port4KeyPAD.BaudRate = 115200;
            // 포트 데이터 비트 설정 (5,6,7,8)
            RECEIVER.Port4KeyPAD.DataBits = 8;
            // 포트 스톱비트 설정 (1, 1.5, 2)
            RECEIVER.Port4KeyPAD.StopBits = COMM_STOPBIT.ONESTOPBIT;
            // 포트 패리티 설정 (None, Even, Odd)
            RECEIVER.Port4KeyPAD.Parity = COMM_PARITY.NONE;
            // 타임아웃 설정
            RECEIVER.Port4KeyPAD.TimeOut = _COMM_TIMEOUT;
            // 통신 지연 설정
            RECEIVER.Port4KeyPAD.Delay = _COMM_DELAY;
            // 표시용 전압변화값
            RECEIVER.Port4KeyPAD.Delta_Volt = _DELTA_VOLT;
            // 재시도 횟수
            RECEIVER.Port4KeyPAD.Retry_Count = _RETRY_COUNT;
            // 사용 여부
            RECEIVER.Port4KeyPAD.Use_Flag = true;

            _KEYPAD KEYPAD = new _KEYPAD();
            // ID 
            KEYPAD.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_KEYPAD_KEY, 1));
            // 이름
            KEYPAD.Set_KEY_NAME(_Text.UI_TREE_KEYPAD); // 오직 하나뿐

            KEYPAD.Set_Use_Flag("Y");   // 사용 안함으로 세팅한다. // 재수정 2012.8.29
            KEYPAD.BOARD_ID = 0;
            KEYPAD.BOARD_NAME = "키패드";

            RECEIVER.KEYPAD = KEYPAD;

            // 비상방송
            RECEIVER.Port4EmergencyBroadcast.COMM_ID = 5;
            // 포트 넘버 (COM1, COM2..)
            RECEIVER.Port4EmergencyBroadcast.PortNo = 4;    // cyim 기본값 변경 비상방송은 5->4, 
            // 포트BPS (1200,9600,14400, 38400 ...)
            RECEIVER.Port4EmergencyBroadcast.BaudRate = 9600;
            // 포트 데이터 비트 설정 (5,6,7,8)
            RECEIVER.Port4EmergencyBroadcast.DataBits = 8;
            // 포트 스톱비트 설정 (1, 1.5, 2)
            RECEIVER.Port4EmergencyBroadcast.StopBits = COMM_STOPBIT.ONESTOPBIT;
            // 포트 패리티 설정 (None, Even, Odd)
            RECEIVER.Port4EmergencyBroadcast.Parity = COMM_PARITY.NONE;
            // 타임아웃 설정
            RECEIVER.Port4EmergencyBroadcast.TimeOut = _COMM_TIMEOUT;
            // 통신 지연 설정
            RECEIVER.Port4EmergencyBroadcast.Delay = _COMM_DELAY;
            // 표시용 전압변화값
            RECEIVER.Port4EmergencyBroadcast.Delta_Volt = _DELTA_VOLT;
            // 재시도 횟수
            RECEIVER.Port4EmergencyBroadcast.Retry_Count = _RETRY_COUNT;
            // 사용 여부
            RECEIVER.Port4EmergencyBroadcast.Use_Flag = true;

            _EMERGENCY_BROADCAST EMERGENCY_BROADCAST = new _EMERGENCY_BROADCAST();
            // ID 
            EMERGENCY_BROADCAST.ID = RECEIVER.Set_SubKey(RECEIVER, string.Format(_Text.UI_TREE_EMERGENCY_BROADCAST_KEY, 1));
            // 이름
            EMERGENCY_BROADCAST.Set_KEY_NAME(_Text.UI_TREE_EMERGENCY_BROADCAST); // 오직 하나뿐
            // 포트 넘버 (COM1, COM2..)
            RECEIVER.EMERGENCY_BROADCAST = EMERGENCY_BROADCAST;
        }

        private void uiButton_cancel_Click(object sender, EventArgs e)
        {
            // 신규 추가 시에만 
            if (EditMode == false)
            {
                // 데이타베이스 경로 초기화
                _Data.DB_FullPath = null;

                // 프로세스 삭제
                System.Diagnostics.Process[] mProcess = System.Diagnostics.Process.GetProcessesByName("fbserver");
                foreach (System.Diagnostics.Process p in mProcess)
                    p.Kill();
                System.Threading.Thread.Sleep(1000);

                // 수신기 폴더 삭제
                string ReiceiverFolderName = _Text.DEFAULT_FOLDER_RECEIVER_PREFIX + RECEIVER.ID;
                _File.Delete_Folder(_Data.Project_Path, _Data.Project_Name + "\\" + ReiceiverFolderName);
            }
            Close();
        }
    }
}