using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

// cyim 2015.7.13 설비연동 주석 정리	
// 설비연동 소스가 너무 주석과 내용이 틀리고 엉망이다. 이전 작업자가 작업한 코드를 모두 정리하고
// 불필요한 코드는 다 제거한다

namespace FPER
{
    public partial class frmControlWrite : Form
    {
        // 설비 연동 창 클래스
        MDIParent mdi = null;
        controlWriteDevType[] devTypes = null;
        delegate void deleFormInit();

        // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
        public bool ProcessEnableStatus = false;

        // cyim 2015.8.18 주경종정지 기능 추가
        public bool InitMainSoundStop = false;

        // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼  
        public int InitEquipmentAllOperationStatus = 0;
        public System.Windows.Forms.Timer timer = new Timer();

        // 생성자
        public frmControlWrite(bool MainSoundStop, int EquipmentAllOperationStatus)
        {
            InitializeComponent();

            // 초기화
            ProcessEnableStatus = false;

            // cyim 2015.8.18 주경종정지 기능 추가 : 만약 수신반에서 주경종 정지 기능을 사용하려고 했다면 화면이 준비되는 순간 마지막에 주경종 정지 명령을 날린다
            InitMainSoundStop = MainSoundStop;

            // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼           
            InitEquipmentAllOperationStatus = EquipmentAllOperationStatus;
            timer.Interval = 3000;
            timer.Tick += new EventHandler(timer_Tick);
        }

        // 창 데이터 초기화 함수
        public void Form_Init()
        {
            try
            {
                if (this.InvokeRequired)
                {
                    deleFormInit d = new deleFormInit(Form_Init);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    getData();
                    this.mdi.SetLikageBtnStatus();
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 버튼 이미지 로딩 함수
        private Image ImgLoad(string path)
        {
            Image ret = null;
            try
            {
                ret = Image.FromFile(path);
            }
            catch (Exception e)
            {
                Util.UErrorMessage(e, 0, 0);
            }
            return ret;
        }

        private Image ImageLoadingPanelRed()
        {
            // cyim : 디자인개선
            //return (Image)Properties.Resources.panel_430_52_R;
            return (Image)Properties.Resources.버튼_개별정지_420_77;
        }

        private Image ImageLoadingPanelBlue()
        {
            // cyim : 디자인 개선
            //return (Image)Properties.Resources.panel_430_52_B;
            return (Image)Properties.Resources.버튼_개별연동_420_77;
        }

        private controlWriteDevType findControlDevType(string dev_type)
        {
            controlWriteDevType devType = null;
            try
            {
                foreach (controlWriteDevType devtp in devTypes)
                {
                    if (devtp.Dev_type.Equals(dev_type))
                    {
                        devType = devtp;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
            return devType;
        }

        private void frmControlWrite_Load(object sender, EventArgs e)
        {
            // cyim 2013.8.1 : 더블버퍼링 적용
            SetStyle(ControlStyles.UserPaint, true);
            //this.UpdateStyles();
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            //this.UpdateStyles();
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.UpdateStyles();

            try
            {
                mdi = (MDIParent)this.MdiParent;
                txtThisReceiverID.Text = string.Format("{0:00}", mdi.myReceiverID);

                this.Cursor = Cursors.WaitCursor;

                init();
                this.Cursor = Cursors.Default;

                // cyim 2015.8.18 주경종정지 기능 추가
                if (InitMainSoundStop == true)
                    MainSoundStop();

                // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
                if (InitEquipmentAllOperationStatus != 0)
                    timer.Start();
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
        public void timer_Tick(object sender, EventArgs e)
        {
            // 2초후에 루틴 
            if (InitEquipmentAllOperationStatus != 0) // 0  Default, 1 : 전체정지, 2 : 전체연동
            {
                getData();
            }
            timer.Stop();
        }

        private void frmControlWrite_Activated(object sender, EventArgs e)
        {
            try
            {
                this.mdi.SelectMenuIndex = 1;
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        private void frmControlWrite_Disposed(object sender, EventArgs e)
        {
            try
            {
                // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
                timer.Tick -= new EventHandler(timer_Tick);

                this.mdi.SelectMenuIndex = 0;
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 데이터 초기화 함수
        private void init()
        {
            this.SetLDeviceTypeConfig();
        }

        // 설정 데이터 갱신 함수
        private void getData()
        {
            try
            {
                if (this.InvokeRequired)
                {
                    deleFormInit d = new deleFormInit(getData);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    this.UpdateLDeviceTypeConfig();
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 버튼 상태 변경 함수
        private void DoChangeBTNSet(Button btnYes, Button btnNo, bool set)
        {
            try
            {
                if (set) // 사용
                {
                    btnYes.Enabled = false;
                    btnNo.Enabled = true;

                    btnYes.BackColor = Color.Blue;
                    btnNo.BackColor = Color.Red;
                    btnYes.ForeColor = Color.White;
                    btnNo.ForeColor = Color.White;
                }
                else // 차단
                {
                    btnYes.Enabled = true;
                    btnNo.Enabled = false;

                    btnYes.BackColor = Color.Blue;
                    btnNo.BackColor = Color.Red;
                    btnYes.ForeColor = Color.White;
                    btnNo.ForeColor = Color.White;
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 종료하기
        private void btnWinClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        //명령 쓰기 완료--종료. 
        bool lock_cmd = false;

        // 설비 연동 상태 갱신 함수 
        private void DoChangeDeviceLinkage2(object sender, EventArgs e)
        {
            try
            {
                // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                if (ProcessEnableStatus == true || mdi.CommDaemon_ComStatus == false) return;

                if (sender is Control)
                {
                    Control Ctl = (Control)sender;
                    if (Ctl.Tag is CDeviceTypeConfig)
                    {
                        if (!lock_cmd)
                        {
                            lock_cmd = true;
                            this.Cursor = Cursors.WaitCursor;
                            timer_check.Enabled = true;
                            progress_dot = -2;
                            progress_end = false;
                            timer_progress.Enabled = true;
                            CDeviceTypeConfig dtc = (CDeviceTypeConfig)Ctl.Tag;
                            string devTypeString = dtc.deviceType;
                            int Use_flag = (dtc.use ? 1 : 0);

                            CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                            cmd.CommandType = "DC";
                            cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                            cmd.Status = (Use_flag == 0 ? 1 : 0);  //사용여부 0-비사용,1-사용
                            cmd.SubType = devTypeString.Substring(1);

                            cmd.CommId = 1;
                            cmd.loopNo = 0;
                            //명령 생성

                            dCommandResponse d = new dCommandResponse(command_complete);
                            cmd.dEvent = d;

                            // cyim 2015.2.10 설비연동 실행
                            mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [{0},{1}]", dtc.deviceName, (cmd.Status == 0 ? "Disable" : "Enable")));
                            this.mdi.ui.runCommand(cmd);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                progress_end = true;
                lock_cmd = false;
                this.Cursor = Cursors.Default;
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // cyim 2015.8.18 주경종정지 기능 추가
        public void MainSoundStop()
        {
            try
            {
                // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                if (ProcessEnableStatus == true || mdi.CommDaemon_ComStatus == false) return;

                //if (sender is Control)
                {
                    //Control Ctl = (Control)sender;
                    //if (Ctl.Tag is CDeviceTypeConfig)
                    {
                        if (!lock_cmd)
                        {
                            lock_cmd = true;
                            this.Cursor = Cursors.WaitCursor;
                            timer_check.Enabled = true;
                            progress_dot = -2;
                            progress_end = false;
                            timer_progress.Enabled = true;
                            //CDeviceTypeConfig dtc = (CDeviceTypeConfig)Ctl.Tag;
                            //string devTypeString = dtc.deviceType;
                            string devTypeString = "OA";
                            //int Use_flag = (dtc.use ? 1 : 0);
                            int Use_flag = 1; // 무조건 정지
                            CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                            cmd.CommandType = "DC";
                            cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                            cmd.Status = (Use_flag == 0 ? 1 : 0);  //사용여부 0-비사용,1-사용
                            cmd.SubType = devTypeString.Substring(1);

                            cmd.CommId = 1;
                            cmd.loopNo = 0;
                            //명령 생성

                            dCommandResponse d = new dCommandResponse(command_complete);
                            cmd.dEvent = d;
                          
                            // cyim 2015.2.10 설비연동 실행
                            mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [{0},{1}]", "주경종"/*dtc.deviceName*/, (cmd.Status == 0 ? "Disable" : "Enable")));
                            this.mdi.ui.runCommand(cmd);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                progress_end = true;
                lock_cmd = false;
                this.Cursor = Cursors.Default;
                Util.UErrorMessage(ex, 0, 0);
            }
        }       

        // cmd 리턴 받으면 실행 함수
        public void command_complete(CmdInfo resInfo)
        {
            try
            {
                this.Cursor = Cursors.Default;
                timer_check.Enabled = false;
                progress_end = true;

                getData();

                //this.mdi.SetLikageBtnStatus(); // cyim 2015.7.7 속도개선작업 : 설비연동화면 종료할때만 최종 결과를 반영하자 (MDIParent 가 실행될때 이미 시작은 미리 되었음) 통신에서 이렇게 데이타베이스를 가져오지 않아도된다

                if (resInfo != null)
                {
                    if (resInfo.ErrResponse)
                    {
                    }
                    else
                    {
                    }
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 체크 타이머 함수
        private void timer_check_Tick(object sender, EventArgs e)
        {
            this.command_complete(null);
        }

        int progress_dot = -2;
        bool progress_end = false;

        // 진행 창 설정 타이머 
        private void timer_progress_Tick(object sender, EventArgs e)
        {
            try
            {
                if (progress_dot == -100)
                {
                    panel_LabelMessage.Visible = false; // cyim 2013.7.31 진행중 팝업창 디자인변경 
                    lbl_message.Visible = false;
                    timer_progress.Enabled = false;
                    lock_cmd = false;
                }
                progress_dot++;
                if (progress_dot > 4)
                {
                    progress_dot = 0;
                }

                if (progress_dot >= 0)
                {
                    panel_LabelMessage.Visible = true; // cyim 2013.7.31 진행중 팝업창 디자인변경 
                    lbl_message.Text = "진 행 중";
                    lbl_message.Visible = true;

                    // cyim 2013.7.31 진행중 팝업창 디자인변경 
                    //lbl_message.Width = 450;
                    //lbl_message.Height = 250;

                    lbl_message.Text = "진 행 중\n";
                    // cyim 2013.7.31 진행중 팝업창 디자인변경  : 텍스트 삭제
                    //if (progress_dot == 0) {
                    //  lbl_message.Text = lbl_message.Text + "             ";
                    //}
                    //else if (progress_dot == 1) {
                    //  lbl_message.Text = lbl_message.Text + ".            ";
                    //}
                    //else if (progress_dot == 2) {
                    //  lbl_message.Text = lbl_message.Text + ".   .        ";
                    //}
                    //else if (progress_dot == 3) {
                    //  lbl_message.Text = lbl_message.Text + ".   .   .    ";
                    //}
                    //else if (progress_dot == 4) {
                    //  lbl_message.Text = lbl_message.Text + ".   .   .   .";
                    //}
                }
                if (progress_end)
                {
                    progress_dot = -100;
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        private void frmControlWrite_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 창 닫는 함수 
            this.mdi.SetLikageBtnStatus();
        }

        List<CDeviceTypeConfig> LDeviceTypeConfig = new List<CDeviceTypeConfig>();
        List<Panel> LDeviceTypePanel = new List<Panel>();

        // 설비 연동 버튼 설정 함수 
        void SetDeviceTypePanel()
        {
            this.LDeviceTypePanel.Clear();
            int iPanelGab = 650 / ((LDeviceTypeConfig.Count + 1) / 2);

            foreach (CDeviceTypeConfig dtc in this.LDeviceTypeConfig)
            {
                Panel panel = new Panel();
                panel.Parent = this.groupBox1;
                panel.Size = new Size(420, 60); // cyim : 디자인개선  (430, 52) -> (420, 60)
                int positionX = 0;
                int positionY = 0;
                if ((this.LDeviceTypePanel.Count + 1) % 2 == 1)
                {// 버튼 줄 설정, 왼쪽
                    positionX = 80; // cyim : 디자인개선  40 -> 80
                    positionY = 50 + iPanelGab * ((this.LDeviceTypePanel.Count + 1) / 2);
                }
                else
                {// 오른쪽
                    positionX = 570; // cyim : 디자인개선 530 -> 500
                    positionY = 50 + iPanelGab * ((this.LDeviceTypePanel.Count) / 2);
                }
                panel.Location = new Point(positionX, positionY);
                panel.BackgroundImage = this.ImageLoadingPanelRed();
                Label labelName = new Label();
                labelName.Parent = panel;
                labelName.AutoSize = true;
                labelName.Location = new Point(37, 17); // cyim : 디자인개선 (37, 13) -> (37, 17)
                labelName.Font = new Font("굴림", 20F, System.Drawing.FontStyle.Bold);
                labelName.BackColor = Color.Transparent;
                labelName.ForeColor = Color.White; // cyim : 디자인개선

                Label labelStatus = new Label();
                labelStatus.Parent = panel;
                labelStatus.AutoSize = true;
                labelStatus.Location = new Point(304, 17); // cyim : 디자인개선 (311, 13) -> (304, 17)
                labelStatus.Font = new Font("굴림", 20F, System.Drawing.FontStyle.Bold);
                labelStatus.BackColor = Color.Transparent;
                labelStatus.ForeColor = Color.White; // cyim : 디자인개선

                panel.MouseClick += new MouseEventHandler(DoChangeDeviceLinkage2);
                labelName.MouseClick += new MouseEventHandler(DoChangeDeviceLinkage2);
                labelStatus.MouseClick += new MouseEventHandler(DoChangeDeviceLinkage2);

                labelName.Text = dtc.deviceName;
                panel.BackgroundImage = (dtc.use ? this.ImageLoadingPanelBlue() : this.ImageLoadingPanelRed());
                labelStatus.Text = (dtc.use ? "연    동" : "정    지");
                panel.Tag = dtc;
                labelName.Tag = dtc;
                labelStatus.Tag = dtc;

                this.LDeviceTypePanel.Add(panel);
            }
            this.UpdateDeviceTypePanel();
        }

        // 버튼 갱신 함수
        void UpdateDeviceTypePanel()
        {
            foreach (Panel panel in this.LDeviceTypePanel)
            {
                CDeviceTypeConfig dtc = (CDeviceTypeConfig)panel.Tag;
                Label labelName = (Label)panel.Controls[0];
                Label labelStatus = (Label)panel.Controls[1];

                if ((labelStatus.Text == "연    동") != dtc.use)
                {
                    panel.BackgroundImage = (dtc.use ? this.ImageLoadingPanelBlue() : this.ImageLoadingPanelRed());
                    labelStatus.Text = (dtc.use ? "연    동" : "정    지");
                }
            }
            // cyim 2013.10.1 : 화면 갱신
            this.Update();
        }

        // 설비연동 데이터 재설정 함수
        int SetLDeviceTypeConfig()
        {
            this.LDeviceTypeConfig.Clear();

            DacDeviceConfig dacDeviceConfig = new DacDeviceConfig(mdi.myReceiverID); // cyim 2015.7.30 데이타베이스 접속 루틴 변경
            DataTable dt = dacDeviceConfig.Device_type_Select(code_InOutType.Output, null);
            foreach (DataRow dr in dt.Rows)
            {
                // cyim 2014.11.25 주경종 허용
                //if (dr["DEVICE_TYPE"].ToString() != "OA" && dr["SEQ_NO"].ToString() != "0")
                if (dr["SEQ_NO"].ToString() != "0")
                {
                    this.LDeviceTypeConfig.Add(new CDeviceTypeConfig(dr["SYMBOL_TYPE"].ToString(), dr["DEVICE_TYPE"].ToString(),
                                                  dr["DEVICE_TYPE_NAME"].ToString(), dr["USE_FLAG"].ToString()));
                }
            }
            this.SetDeviceTypePanel();
            return this.LDeviceTypeConfig.Count;
        }

        // 설비 연동 데이터 갱신 함수
        int UpdateLDeviceTypeConfig()
        {
            DacDeviceConfig dacDeviceConfig = new DacDeviceConfig(mdi.myReceiverID);// cyim 2015.7.30 데이타베이스 접속 루틴 변경
            DataTable dt = dacDeviceConfig.Device_type_Select(code_InOutType.Output, null);
            foreach (DataRow dr in dt.Rows)
            {
                // cyim 2014.11.25 주경종 허용
                //if (dr["DEVICE_TYPE"].ToString() != "OA" && dr["SEQ_NO"].ToString() != "0")
                if (dr["SEQ_NO"].ToString() != "0")
                {
                    bool add = true;
                    foreach (CDeviceTypeConfig cd in this.LDeviceTypeConfig)
                    {
                        if (cd.deviceType == dr["DEVICE_TYPE"].ToString())
                        {
                            cd.UpdateData(dr["USE_FLAG"].ToString());
                            add = false;
                            break;
                        }
                    }
                    if (add)
                    {
                        this.LDeviceTypeConfig.Add(new CDeviceTypeConfig(dr["SYMBOL_TYPE"].ToString(), dr["DEVICE_TYPE"].ToString(),
                                                      dr["DEVICE_TYPE_NAME"].ToString(), dr["USE_FLAG"].ToString()));
                    }
                }
            }
            this.UpdateDeviceTypePanel();
            return this.LDeviceTypeConfig.Count;
        }

        // 설비연동 데이터 클래스
        class CDeviceTypeConfig
        {
            public string symbolType = "";
            public string deviceType = "";
            public string deviceName = "";
            public bool use = false;

            public CDeviceTypeConfig(string symbolType, string deviceType, string deviceName, string useFlag)
            {
                this.symbolType = symbolType;
                this.deviceType = deviceType;
                this.deviceName = deviceName;
                this.use = (useFlag == "Y" ? true : false);
            }

            public void UpdateData(string useFlag)
            {
                this.use = (useFlag == "Y" ? true : false);
            }
        }

        private int indexDisableDeviceAll = 0;
        private int indexEnableDeviceAll = 0;

        // 모두 정지 버튼
        private void btnDisableAll_Click(object sender, EventArgs e)
        {
            // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
            if (ProcessEnableStatus == true || mdi.CommDaemon_ComStatus == false) return;
            ProcessEnableStatus = true;
            this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58_black;
            this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58_black;

            try
            {
                if (this.lock_cmd == false)
                {
                    this.lock_cmd = true;
                    this.Cursor = Cursors.WaitCursor;
                    timer_check.Enabled = true;
                    progress_dot = -2;
                    progress_end = false;
                    timer_progress.Enabled = true;
                    // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
                    if (mdi.ReceiverModel == "IFC3300")
                    {
                        CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                        cmd.CommandType = "ED";
                        cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                        cmd.Status = 0;  //사용여부 0-비사용,1-사용
                        cmd.SubType = "B";// strDevice;

                        cmd.CommId = 1;
                        cmd.loopNo = 0;

                        // cyim 2015.2.10 설비연동 모두정지 실행
                        mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [모두정지]"));
                        dCommandResponse d = new dCommandResponse(DisableDeviceAll);//명령 생성
                        cmd.dEvent = d;

                        this.mdi.ui.runCommand(cmd);
                    }
                    else
                    {
                        this.DisableDeviceAll(null);
                    }
                }
                else
                {
                    // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                    ProcessEnableStatus = false;
                    this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                    this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
                }
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                Util.UErrorMessage(ex, 0, 0);

                // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                this.progress_end = true;
                this.lock_cmd = false;
                ProcessEnableStatus = false;
                this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
            }
        }

        // 모드 정지 함수
        public void DisableDeviceAll(CmdInfo resInfo)
        {
            try
            {
                this.getData();

                // 갱신 마지막 
                if (this.indexDisableDeviceAll >= this.LDeviceTypeConfig.Count)
                {
                    this.Cursor = Cursors.Default;
                    this.timer_check.Enabled = false;
                    this.progress_end = true;
                    lock_cmd = false;

                    //this.mdi.SetLikageBtnStatus(); // cyim 2015.7.7 속도개선작업 : 설비연동화면 종료할때만 최종 결과를 반영하자 (MDIParent 가 실행될때 이미 시작은 미리 되었음)
                    this.indexDisableDeviceAll = 0;
                  
                    // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                    ProcessEnableStatus = false;
                    this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                    this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
                }
                else
                {
                    //start
                    if (resInfo == null)
                    {
                        this.indexDisableDeviceAll = 0;
                    }

                    // 갱신 중간
                    if (this.LDeviceTypeConfig.Count > this.indexDisableDeviceAll)
                    {
                        CDeviceTypeConfig devTypeConfig = this.LDeviceTypeConfig[this.indexDisableDeviceAll];
                        string strDevice = devTypeConfig.deviceType.Substring(1, 1);
                        this.indexDisableDeviceAll++;
                        this.DisableDevice(strDevice);
                    }
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        //  설비 연동 정지 함수 
        private void DisableDevice(string strDevice)
        {
            try
            {
                CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                cmd.CommandType = "DC";
                cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                cmd.Status = 0;  //사용여부 0-비사용,1-사용
                cmd.SubType = strDevice;

                cmd.CommId = 1;
                cmd.loopNo = 0;

                dCommandResponse d = new dCommandResponse(DisableDeviceAll);//명령 생성
                cmd.dEvent = d;

                this.mdi.ui.runCommand(cmd);
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 모두 연동 버튼
        private void btnEnableAll_Click(object sender, EventArgs e)
        {
            // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
            if (ProcessEnableStatus == true || mdi.CommDaemon_ComStatus == false) return;
            ProcessEnableStatus = true;
            this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58_black;
            this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58_black;

            try
            {
                if (this.lock_cmd == false)
                {
                    this.lock_cmd = true;
                    this.Cursor = Cursors.WaitCursor;
                    timer_check.Enabled = true;
                    progress_dot = -2;
                    progress_end = false;
                    timer_progress.Enabled = true;

                    // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
                    if (mdi.ReceiverModel == "IFC3300")
                    {
                        CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                        cmd.CommandType = "ED";
                        cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                        cmd.Status = 1;  //사용여부 0-비사용,1-사용
                        cmd.SubType = "B";//strDevice;

                        cmd.CommId = 1;
                        cmd.loopNo = 0;

                        // cyim 2015.2.10 설비연동 모두연동 실행
                        mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [모두연동]"));
                        dCommandResponse d = new dCommandResponse(EnableDeviceAll);//명령 생성 EnableDeviceAll_BigReceiver
                        cmd.dEvent = d;

                        this.mdi.ui.runCommand(cmd);
                    }
                    else
                    {
                        this.EnableDeviceAll(null);
                    }
                }
                else
                {
                    // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                    ProcessEnableStatus = false;
                    this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                    this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
                }
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                Util.UErrorMessage(ex, 0, 0);

                // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                this.progress_end = true;
                this.lock_cmd = false;
                ProcessEnableStatus = false;
                this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
            }
            //Util.UDebugMessage("-btnEnableAll_Click", 0, 0);
        }

        // 모두 설비 연동 함수 
        public void EnableDeviceAll(CmdInfo resInfo)
        {
            try
            {
                this.getData();

                // 갱신 마지막
                if (this.indexEnableDeviceAll >= this.LDeviceTypeConfig.Count)
                {
                    this.Cursor = Cursors.Default;
                    this.timer_check.Enabled = false;
                    this.progress_end = true;
                    this.lock_cmd = false;

                    //this.mdi.SetLikageBtnStatus(); // cyim 2015.7.7 속도개선작업 : 설비연동화면 종료할때만 최종 결과를 반영하자 (MDIParent 가 실행될때 이미 시작은 미리 되었음)
                    this.indexEnableDeviceAll = 0;
                   
                    // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                    ProcessEnableStatus = false;
                    this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                    this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
                }
                else
                {
                    //start
                    if (resInfo == null)
                    {
                        this.indexEnableDeviceAll = 0;
                    }

                    // 갱신 중간
                    if (this.LDeviceTypeConfig.Count > this.indexEnableDeviceAll)
                    {
                        CDeviceTypeConfig devTypeConfig = this.LDeviceTypeConfig[this.indexEnableDeviceAll];
                        string strDevice = devTypeConfig.deviceType.Substring(1, 1);
                        this.indexEnableDeviceAll++;
                        this.EnableDevice(strDevice);
                    }
                }
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // 설비 연동 설정 함수 
        private void EnableDevice(string strDevice)
        {
            try
            {
                CmdInfo cmd = new CmdInfo(prt_cmd_define.read_command_status, mdi.myReceiverID, 1, 0, 0, null);
                cmd.CommandType = "DC";
                cmd.ApplyRange = "A";   //차단레벨(회로타입차단용) A-All,C-Comm,B-Board,L-Loop,R-중계기,D-회로,I-입력회로,O-출력회로
                cmd.Status = 1;  //사용여부 0-비사용,1-사용
                cmd.SubType = strDevice;

                cmd.CommId = 1;
                cmd.loopNo = 0;

                dCommandResponse d = new dCommandResponse(EnableDeviceAll);//명령 생성
                cmd.dEvent = d;

                this.mdi.ui.runCommand(cmd);
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
        public void DisableDeviceAll_BigReceiver(CmdInfo resInfo)
        {
            this.getData();

            // 갱신 마지막 
            if (this.indexDisableDeviceAll >= this.LDeviceTypeConfig.Count)
            {
                this.Cursor = Cursors.Default;
                this.timer_check.Enabled = false;
                this.progress_end = true;
                lock_cmd = false;

                //this.mdi.SetLikageBtnStatus(); // cyim 2015.7.7 속도개선작업 : 설비연동화면 종료할때만 최종 결과를 반영하자 (MDIParent 가 실행될때 이미 시작은 미리 되었음)
                this.indexDisableDeviceAll = 0;

                // cyim 2015.2.10 설비연동 모두정지 실행
                mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [모두정지]"));

                // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
                ProcessEnableStatus = false;
                this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
                this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
            }
        }

        // cyim 2016.12.09 : IFC3300에서는 예비전원버튼 -> 설비전체연동조작버튼
        public void EnableDeviceAll_BigReceiver(CmdInfo resInfo)
        {
            this.getData();

            this.Cursor = Cursors.Default;
            this.timer_check.Enabled = false;
            this.progress_end = true;
            this.lock_cmd = false;

            //this.mdi.SetLikageBtnStatus(); // cyim 2015.7.7 속도개선작업 : 설비연동화면 종료할때만 최종 결과를 반영하자 (MDIParent 가 실행될때 이미 시작은 미리 되었음)
            this.indexEnableDeviceAll = 0;

            // cyim 2015.2.10 설비연동 모두연동 실행
            mdi.CommandLog(MappingStatus.Log, string.Format("설비연동 실행 [모두연동]"));

            // cyim 2015.2.10 설비연동의 경우 실행이 완료되어야 다른 버튼이 눌려진다
            ProcessEnableStatus = false;
            this.btnEnableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체연동_139_58;
            this.btnDisableAll.BackgroundImage = (Image)Properties.Resources.버튼_전체정지_139_58;
        }
    }

    public class controlWriteDevType
    {
        private string dev_type;    //연동타입
        private bool use_flag;      //사용여부
        private bool change_flag;   //변경여부

        public controlWriteDevType(string dev_type)
        {
            try
            {
                this.dev_type = dev_type;
                this.use_flag = false;
                this.change_flag = false;
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        public string Dev_type { get { return this.dev_type; } }
        public bool Use_flag { get { return this.use_flag; } set { this.use_flag = value; } }
        public void ChangeFlagReset()
        {
            try
            {
                this.change_flag = false;
            }
            catch (Exception ex)
            {
                Util.UErrorMessage(ex, 0, 0);
            }
        }

        public Boolean ChangeFlag
        {
            get { return this.change_flag; }
            set
            {
                bool use_flag = value;
                //차단설정데이터 변경여부를 저장한다.
                if (this.use_flag != use_flag) this.change_flag = true;
                this.use_flag = value;
            }
        }
    }
}