using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using AR;
namespace Project
{
	public partial class FMain
	{
		bool[] runStepisFirst = new bool[] { false, false };

		#region "Is Can Pick On/Off"

		Boolean isCanPLPickOn()
		{
			//아이템을 가지고 있으면 안된다.
			if (PUB.flag.get(eVarBool.FG_PL_ITEMON)) return false;

			//Y축이 집는 위치가 아니면 빠져나감
			var Pos = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//  MOT.GetPLM_PosName();
			if (Pos) return false;

			return true;
		}

		Boolean isCanPRPickOn()
		{
			//아이템을 가지고 있으면 안된다.
			if (PUB.flag.get(eVarBool.FG_PR_ITEMON)) return false;

			//Y축이 집는 위치가 아니면 빠져나감
			var Pos = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//  MOT.GetPRM_PosName();
			if (Pos) return false;

			return true;
		}

		Boolean isCanPLPickOff()
		{
			//아이템이 없으면 불가
			if (PUB.flag.get(eVarBool.FG_PL_ITEMON) == false) return false;

			//Y축 위치 확인
			var PosH07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH07));
			var PosM07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM07));
			var PosL07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL07));

			var PosH13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH13));
			var PosM13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM13));
			var PosL13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL13));

			if (PosH07 && PosM07 && PosL07 && PosH13 && PosM13 && PosL13) return false;

			//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
			if (PUB.flag.get(eVarBool.FG_RDY_PORT_PL) == false || hmi1.arVar_Port[0].AlignOK != 1) return false;

			return true;
		}


		Boolean isCanPRPickOff()
		{
			//아이템이 없으면 불가
			if (PUB.flag.get(eVarBool.FG_PR_ITEMON) == false) return false;

			//Y축 위치 확인
			var PosH07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH07));
			var PosM07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM07));
			var PosL07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL07));

			var PosH13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH13));
			var PosM13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM13));
			var PosL13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL13));

			if (PosH07 && PosM07 && PosL07 && PosH13 && PosM13 && PosL13) return false;

			//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
			if (PUB.flag.get(eVarBool.FG_RDY_PORT_PR) == false || hmi1.arVar_Port[2].AlignOK != 1) return false;

			return true;
		}

		Boolean isCanPickOffL()
		{
			//아이템이 없으면 불가
			if (PUB.flag.get(eVarBool.FG_PK_ITEMON) == false) return false;

			//Y축 위치 확인
			if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFL)) == false) return false;

			//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
			if (PUB.flag.get(eVarBool.FG_RDY_PORT_PL) == false || hmi1.arVar_Port[0].AlignOK != 1) return false;

			return true;
		}

		Boolean isCanPickOn()
		{
			//아이템을 가지고 있으면 안된다.
			if (PUB.flag.get(eVarBool.FG_PK_ITEMON)) return false;

			//Y축이 집는 위치가 아니면 빠져나감
			if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKON)) == false) return false;

			//포트가 준비되어 있지 않다면 가져갈수 없다
			if (PUB.Result.DryRun == false && (PUB.flag.get(eVarBool.FG_RDY_PORT_PC) == false || hmi1.arVar_Port[1].AlignOK != 1)) return false;

			return true;
		}

		Boolean isCanPickOffR()
		{
			//아이템이 없으면 불가
			if (PUB.flag.get(eVarBool.FG_PK_ITEMON) == false) return false;

			//Y축 위치 확인
			if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFR)) == false) return false;

			//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
			if (PUB.flag.get(eVarBool.FG_RDY_PORT_PR) == false || hmi1.arVar_Port[2].AlignOK != 1) return false;

			return true;
		}

		#endregion

		bool CheckPauseCondition(Boolean lightCheck)
		{
			//비상정지체크
			if (DIO.IsEmergencyOn() == true || PUB.mot.HasEmergencyStop)
			{
				//이것은 SPS에서 추가로 처리된다
				PUB.Result.SetResultMessage(eResult.EMERGENCY, eECode.EMERGENCY, eNextStep.NOTHING);// false);
				return false;
			}

			//홈이 잡혀잇는지 체크한다
			if (PUB.mot.HasHomeSetOff == true)
			{
				PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
				return false;
			}

			if (lightCheck == false)
			{
				//안전센서체크
				if (DIO.isSaftyDoorF() == false)
				{
					PUB.Result.SetResultMessage(eResult.EMERGENCY, eECode.DOORSAFTY, eNextStep.PAUSE);// false);
					PUB.mot.MoveStop("Safety issue", true);

					if (DIO.isSaftyDoorF(0, false) == false) DIO.SetPortMotor(0, eMotDir.CW, false, "Safety error");
					if (DIO.isSaftyDoorF(1, false) == false) DIO.SetPortMotor(1, eMotDir.CW, false, "Safety error");
					if (DIO.isSaftyDoorF(2, false) == false) DIO.SetPortMotor(2, eMotDir.CW, false, "Safety error");
					return false;
				}

				//에어공급출력체크
				if (AR.SETTING.Data.DisableSensor_AIRCheck == false && DIO.GetIOOutput(eDOName.SOL_AIR) == false)
				{
					PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AIRNOOUT, eNextStep.PAUSE);//false);
					return false;
				}

				//오버로드체크
				if (hmi1.arVar_Port[0].OverLoad)
				{
					PUB.Result.SetResultMessage(eResult.SENSOR, eECode.PORTOVERLOAD, eNextStep.PAUSE, new object[] { "FRONT-LEFT" });
					return false;
				}
			}

			return true;
		}

		Boolean isPortLimDN(int idx)
		{
			if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
			if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_LIM_DN);
			else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_LIM_DN);
			else return DIO.GetIOInput(eDIName.PORTR_LIM_DN);

		}
		Boolean isPortLimUP(int idx)
		{
			if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
			if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_LIM_UP);
			else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_LIM_UP);
			else return DIO.GetIOInput(eDIName.PORTR_LIM_UP);
		}
		Boolean isPortDetUp(int idx)
		{
			if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
			if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_DET_UP);
			else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_DET_UP);
			else return DIO.GetIOInput(eDIName.PORTR_DET_UP);
		}


	}//cvass
}
