using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using AR;

namespace Project
{
    public partial class FMain
    {


        void _DIO_INPUT_VALUE_CHANGED(eDIName pin, Boolean value)
        {
            //카드사이즈 센서 적용
            if (pin == eDIName.PORT0_SIZE_07 || pin == eDIName.PORT0_SIZE_13)
            {
                if (value)
                {
                    //둘중하나가 들어오면 시작시간을 설정한다
                    if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
                    {
                        VAR.TIME.Update(eVarTime.MAGNET0);
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET0, true, "SENSOR");
                    }

                }
                else
                {
                    var b1 = DIO.GetIOInput(eDIName.PORT0_SIZE_07);
                    var b2 = DIO.GetIOInput(eDIName.PORT0_SIZE_13);
                    if (b1 == false && b2 == false)
                    {
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET0, false, "SENSOR");
                        DIO.SetPortMagnet(0, false);
                        //if (Util_DO.GetIOOutput(eDOName.CART_MAG0))
                        //Util_DO.SetOutput(eDOName.CART_MAG0, false);
                    }
                }
            }
            else if (pin == eDIName.PORT1_SIZE_07 || pin == eDIName.PORT1_SIZE_13)
            {
                if (value)
                {
                    //둘중하나가 들어오면 시작시간을 설정한다
                    //if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
                    {
                        VAR.TIME.Update(eVarTime.MAGNET1);
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET1, true, "SENSOR");
                    }
                }
                else
                {
                    var b1 = DIO.GetIOInput(eDIName.PORT1_SIZE_07);
                    var b2 = DIO.GetIOInput(eDIName.PORT1_SIZE_13);
                    if (b1 == false && b2 == false)
                    {
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET1, false, "SENSOR");
                        DIO.SetPortMagnet(1, false);
                        //if (Util_DO.GetIOOutput(eDOName.CART_MAG1))
                        //Util_DO.SetOutput(eDOName.CART_MAG1, false);
                    }
                }
            }
            else if (pin == eDIName.PORT2_SIZE_07 || pin == eDIName.PORT2_SIZE_13)
            {
                if (value)
                {
                    //둘중하나가 들어오면 시작시간을 설정한다
                    if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
                    {
                        VAR.TIME.Update(eVarTime.MAGNET2);
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET2, true, "SENSOR");
                    }
                }
                else
                {
                    var b1 = DIO.GetIOInput(eDIName.PORT2_SIZE_07);
                    var b2 = DIO.GetIOInput(eDIName.PORT2_SIZE_13);
                    if (b1 == false && b2 == false)
                    {
                        PUB.flag.set(eVarBool.FG_WAT_MAGNET2, false, "SENSOR");
                        DIO.SetPortMagnet(2, false);
                        //if (Util_DO.GetIOOutput(eDOName.CART_MAG2))
                        //    Util_DO.SetOutput(eDOName.CART_MAG2, false);
                    }
                }
            }
            else if (pin == eDIName.DOORF1 || pin == eDIName.DOORF2 || pin == eDIName.DOORF3)
            {
                int PortIDX = 0;
                eVarBool FG_RDY_PORT;
                if (pin == eDIName.DOORF1) { PortIDX = 0; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PL; }
                else if (pin == eDIName.DOORF2) { PortIDX = 1; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PC; }
                else { PortIDX = 2; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PR; }

                //전면도어가 열렸다
                if (DIO.GetIOInput(pin) == true)
                {



                    if (PUB.flag.get(FG_RDY_PORT) == true)
                    {
                        PUB.flag.set(FG_RDY_PORT, false, "IOCHANGE");
                        if (PUB.sm.Step > eSMStep.IDLE)
                            PUB.log.AddAT("Releasing PORT_READY(L) due to safety sensor detection");
                    }

                    //도어가 열리면 포트를 멈춘다 210329
                    if (DIO.GetPortMotorRun(0)) DIO.SetPortMotor(0, DIO.GetPortMotorDir(0), false, "DOOR OPEN");
                    if (DIO.GetPortMotorRun(1)) DIO.SetPortMotor(1, DIO.GetPortMotorDir(1), false, "DOOR OPEN");
                    if (DIO.GetPortMotorRun(2)) DIO.SetPortMotor(2, DIO.GetPortMotorDir(2), false, "DOOR OPEN");

                    //210331
                    if (PUB.sm.Step != eSMStep.RUN)
                    {
                        PUB.mot.MoveStop("Dorr oopen");
                    }

                    if (PUB.sm.isRunning == false && AR.SETTING.Data.PickerAutoMoveForDoor)
                    {
                        var motSpeed = 300;
                        var motAcc = 500;
                        if (pin == eDIName.DOORF3)  //좌측도어가 열렸다
                        {
                            var DoorF2 = DIO.GetIOInput(eDIName.DOORF2);
                            var DoorF1 = DIO.GetIOInput(eDIName.DOORF1);
                            if (DoorF2 == false && DoorF1 == false) //중앙도어가 닫혀있다
                            {
                                var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
                                var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
                                var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();

                                if (PosLM && PosRM && PosPZ)
                                {
                                    //x위치가 pickon 보다 작으면 옴겨줘야 한다.
                                    var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));
                                    if (xpos < 1)
                                    {
                                        var mPos = MOT.GetPXPos(ePXLoc.PICKON);
                                        MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
                                    }
                                }
                            }
                        }
                        else if (pin == eDIName.DOORF2) //중앙도어가 열렸다
                        {
                            //좌우측 닫혀있고 프린트M 위치가 Ready 여아한다.
                            var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
                            var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
                            var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();

                            if (PosPZ)
                            {
                                var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));

                                if (Math.Abs(xpos) < 100) //중앙근처 10 mm 안에 있다면
                                {
                                    var DoorF1 = DIO.GetIOInput(eDIName.DOORF1);
                                    var DoorF3 = DIO.GetIOInput(eDIName.DOORF3);

                                    if (DoorF1 == false && DoorF3 == false)
                                    {
                                        if (PosLM)
                                        {
                                            var mPos = MOT.GetPXPos(ePXLoc.READYL);
                                            MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
                                        }
                                        else if (PosRM)
                                        {
                                            var mPos = MOT.GetPXPos(ePXLoc.READYR);
                                            MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
                                        }
                                        //}
                                    }
                                }
                            }


                        }
                        else if (pin == eDIName.DOORF1) //우측도어가 열렸다
                        {
                            var DoorF2 = DIO.GetIOInput(eDIName.DOORF2);
                            var DoorF3 = DIO.GetIOInput(eDIName.DOORF3);
                            if (DoorF2 == false && DoorF3 == false) //중앙도어가 닫혀있다
                            {
                                var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
                                var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
                                var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();

                                if (PosLM && PosRM && PosPZ)
                                {
                                    //x위치가 pickon 보다 작으면 옴겨줘야 한다.
                                    var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));
                                    if (xpos > 1)
                                    {
                                        var mPos = MOT.GetPXPos(ePXLoc.PICKON);
                                        MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
                                    }
                                }
                            }
                        }
                    }

                    //안전센서가 감지되었다면 얼라인을 초기화 해준다
                    hmi1.arVar_Port[PortIDX].AlignOK = 0;
                    hmi1.arVar_Port[PortIDX].errorCount = 0;

                    //동작중일경우 추가 작업
                    if (PUB.sm.Step > eSMStep.IDLE)
                    {
                        //안전센서가 들어와잇다면 이 값을 초기화 해준다
                        if (DIO.isSaftyDoorF(PortIDX, true) == false && PUB.flag.get(eVarBool.FG_JOB_END) == true)
                            VAR.TIME.Update(eVarTime.JOB_END);
                    }

                    //오류 혹은 Wait 상태일때에는 프린터 Z축을 올려준다
                    if (PUB.sm.Step == eSMStep.WAITSTART || PUB.sm.Step == eSMStep.PAUSE)
                    {
                        if (pin == eDIName.DOORF3)
                        {
                            var PosM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
                            var PosZ = MOT.getPositionMatch(MOT.GetLZPos(eLZLoc.PICKON));//.MOT.GetPRM_PosName();
                            if (PosM && PosZ)
                            {
                                PUB.log.Add("Raising printer L Z-axis due to door opening");
                                var Pos = MOT.GetLZPos(eLZLoc.PICKON);
                                MOT.Move(Pos);
                            }
                        }
                        else if (pin == eDIName.DOORF1)
                        {
                            var PosM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//  MOT.GetPRM_PosName();
                            var PosZ = MOT.getPositionMatch(MOT.GetRZPos(eRZLoc.PICKON));// GetPRZ_PosName();
                            if (PosM && PosZ)
                            {
                                PUB.log.Add("Raising printer R Z-axis due to door opening");
                                MOT.Move(eAxis.PR_UPDN, 0, 100, 1000, false, false, false);
                            }
                        }
                    }
                }
                else
                {
                    //도어를 다시 닫았을때처리해준다.

                    //오류 혹은 Wait 상태일때에는 프린터 Z축을 올려준다
                    if (PUB.sm.Step == eSMStep.WAITSTART || PUB.sm.Step == eSMStep.PAUSE)
                    {
                        if (pin == eDIName.DOORF3)
                        {

                            var PosM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
                            var PosZ = MOT.getPositionMatch(MOT.GetLZPos(eLZLoc.READY));//.MOT.GetPRM_PosName();
                            if (PosM && PosZ)
                            {
                                var zpos = MOT.GetLZPos(eLZLoc.PICKON);
                                PUB.log.Add("Lowering printer L Z-axis due to door closing");
                                MOT.Move(eAxis.PL_UPDN, zpos.Position, 100, 1000, false, false, false);
                            }
                        }
                        else if (pin == eDIName.DOORF1)
                        {
                            var PosM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//. MOT.GetPLM_PosName();
                            var PosZ = MOT.getPositionMatch(MOT.GetRZPos(eRZLoc.READY));//.MOT.GetPRM_PosName();
                            if (PosM && PosZ)
                            {
                                var zpos = MOT.GetRZPos(eRZLoc.PICKON);
                                PUB.log.Add("Lowering printer R Z-axis due to door closing");
                                MOT.Move(eAxis.PR_UPDN, zpos.Position, 100, 1000, false, false, false);
                            }
                        }
                    }


                }
            }
            else if (pin == eDIName.BUT_AIRF)                 //여기서부터는 스위치 영역
            {
                //AIR버튼은 IDLE 이상일떄에 동작 한다
                if (value == true && PUB.sm.Step >= eSMStep.IDLE)
                {
                    var curState = DIO.GetIOOutput(eDOName.SOL_AIR);
                    if (curState == false)
                    {
                        DIO.SetAIR(!curState);
                        PUB.log.AddI("Air ON");
                    }
                    else
                    {
                        DIO.SetAIR(!curState);
                        PUB.log.AddAT("Air OFF");
                    }
                }
                //AIR의 LED는 실제 AIR 출력 상태와 동기화 한다 * output event 에서 처리함
            }
            else if (pin == eDIName.BUT_EMGF)
            {
                PUB.log.AddAT(string.Format("Emergency Status : {0} Value= {1}", pin, value));
                if (value == false)
                {
                    //로더컨트롤의 이머전시 상탤르 설정한다 (둘중 하나라도 꺼지면 비상값이다)

                    EmergencyTime = DateTime.Now;   //한놈이라도 이머전시가 들어오면 강제 멈춘다
                    PUB.mot.MoveStop("emg", true);

                    //포트 모터 정지
                    DIO.SetPortMotor(0, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
                    DIO.SetPortMotor(1, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
                    DIO.SetPortMotor(2, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
                }
                else
                {
                    //둘다 ON 되어잇다면 비상을 해제한다
                    if (DIO.IsEmergencyOn() != true) hmi1.arDI_Emergency = false;
                }

                //Emg는 B접점이라서 LED상태를 반전시킨다
                if (pin == eDIName.BUT_EMGF) DIO.SetOutput(eDOName.BUT_EMGF, !value);

            }
            else if (pin == eDIName.BUT_STARTF)    //시작버튼
            {
                if (PUB.flag.get(eVarBool.FG_MOVE_PICKER))
                {
                    if (value)
                    {
                        if (VAR.BOOL[eVarBool.Enable_PickerMoveX] && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
                            PUB.mot.JOG((int)eAxis.PX_PICK, arDev.MOT.MOTION_DIRECTION.Negative, AR.SETTING.Data.JOG_Speed, AR.SETTING.Data.JOG_Acc);
                    }
                    else
                    {
                        PUB.mot.MoveStop("xmove", (int)eAxis.PX_PICK);
                    }

                }
                else
                {
                    if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
                    {
                        if (value && PUB.sm.Step >= eSMStep.IDLE)
                        {
                            PUB.log.AddI("START BUTTON");
                            this._BUTTON_START();
                        }
                    }
                }
            }
            else if (pin == eDIName.BUT_STOPF)  //중단버튼
            {
                if (PUB.flag.get(eVarBool.FG_MOVE_PICKER))
                {
                    if (value)
                    {
                        if (VAR.BOOL[eVarBool.Enable_PickerMoveX] && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
                            PUB.mot.JOG((int)eAxis.PX_PICK, arDev.MOT.MOTION_DIRECTION.Positive, AR.SETTING.Data.JOG_Speed, AR.SETTING.Data.JOG_Acc);
                    }
                    else
                    {
                        PUB.mot.MoveStop("xmove", (int)eAxis.PX_PICK);
                    }
                }
                else
                {
                    if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
                    {
                        if (value && PUB.sm.Step >= eSMStep.IDLE)
                        {
                            PUB.log.AddI("STOP BUTTON");
                            _BUTTON_STOP();
                        }
                    }
                }

            }
            else if (pin == eDIName.BUT_RESETF)    //리셋버튼
            {
                if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
                {
                    if (value && PUB.sm.Step >= eSMStep.IDLE)
                    {

                        if (value) PUB.Result.ResetButtonDownTime = DateTime.Now;
                        else PUB.Result.ResetButtonDownTime = new DateTime(1982, 11, 23);

                        PUB.log.AddI("RESET BUTTON");
                        _BUTTON_RESET();
                    }
                }

                //요약폼이 있었다면 해제 해준다. - 210329
                if (PUB.sm.Step == eSMStep.FINISH)
                    HideSummary();
            }
            else if (pin == eDIName.PORTL_DET_UP || pin == eDIName.PORTC_DET_UP || pin == eDIName.PORTR_DET_UP)
            {
                var pidx = 0;
                eVarBool FG_RDY_PORT = eVarBool.FG_RDY_PORT_PL;
                var value1 = DIO.GetIOInput(pin);

                if (pin == eDIName.PORTC_DET_UP)
                {
                    pidx = 1;
                    FG_RDY_PORT = eVarBool.FG_RDY_PORT_PC;
                    if (value1 == true) //해당 제품이 검출되어 멈춘다면, 키엔스 데이터를 초기화 해준다.
                    {
                        //Pub.Result.ItemData[1].VisionData.Clear("DIO DET1");
                        //PUB.flag.set(eVarBool.END_VISION1, false, "DIO DET1");
                        //데이터 손실건이 나와서 처리하지 않게한다 210318
                    }
                }
                else if (pin == eDIName.PORTR_DET_UP) { pidx = 2; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PR; }

                if (PUB.sm.Step != eSMStep.RUN && value1 == false) //감지가 꺼지면 ready 를 해제한다
                    PUB.flag.set(FG_RDY_PORT, false, "IOCHANGE");
                else if (hmi1.arVar_Port[pidx].AlignOK != 1)
                    PUB.Result.PortAlignTime[0] = DateTime.Now.Ticks; //시작시간을 초기화 해준다

                //동작중에 들어오면 바로 멈추게한다. 이것은 SPS에서 적용되어야하지만 더 빠르게 반응하기 위해서 그렇게 한다 - 200813
                if (value1 && DIO.GetPortMotorDir(pidx) == eMotDir.CW)
                    DIO.SetPortMotor(pidx, eMotDir.CW, false, "_DIO_DETECT");
            }


            if (pin == eDIName.PORTL_LIM_DN)
            {
                //좌측포트의 하단부리밋센서가 검출될경우  마그넷이 on 되어있다면 off한다.
                if (DIO.GetIOInput(eDIName.PORTL_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTL_MAGNET) == true)
                {
                    DIO.SetPortMagnet(0, false);
                    PUB.log.Add("Left port magnet OFF");
                }
            }
            else if (pin == eDIName.PORTC_LIM_DN)
            {
                //좌측포트의 하단부리밋센서가 검출될경우  마그넷이 on 되어있다면 off한다.
                if (DIO.GetIOInput(eDIName.PORTC_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTC_MAGNET) == true)
                {
                    DIO.SetPortMagnet(1, false);
                    PUB.log.Add("Center port magnet OFF");

                    if(PUB.sm.Step == eSMStep.FINISH)
                    {
                        DIO.SetBuzzer(false); //부저종료 231005
                    }
                }
            }
            else if (pin == eDIName.PORTR_LIM_DN)
            {
                //좌측포트의 하단부리밋센서가 검출될경우  마그넷이 on 되어있다면 off한다.
                if (DIO.GetIOInput(eDIName.PORTR_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTR_MAGNET) == true)
                {
                    DIO.SetPortMagnet(2, false);
                    PUB.log.Add("Right port magnet OFF");
                }
            }
            else if (pin == eDIName.R_CONV4 || pin == eDIName.L_CONV1 || pin == eDIName.L_CONV4 || pin == eDIName.R_CONV1)
            {
                VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
            }

        }
    }
}