Beispiel #1
0
void CUldBtmConv::Cycle(void)
{
	if(!m_fsm.IsInProgress(C_CONV_START, C_CONV_END))
		return;

	switch(m_fsm.GetStatus())
	{
	case C_CONV_START:
		if(m_fsm.DelaymS(15000))
		{
			SetOut(oUldOutConvOn, FALSE);
			g_err.Save(ER_ULD_BTM_CONV_JAM);
			m_fsm.SetStatus(MC_STOP);
			break;
		}

		SetOut(oUldOutConvOn, TRUE);

		if(AOn(iUldOutMzArrival))
			break;

		m_fsm.SetStatus(C_CONV_END);
		break;

	case C_CONV_END:
		if(!m_fsm.DelaymS(10000))
			break;

		SetOut(oUldOutConvOn, FALSE);
		m_fsm.SetStatus(MC_STOP);
		break;
	}
}//--------------------------------------------------------------
Beispiel #2
0
	bool Write(int address, const void *data, int length, bool noinc){
		if (State != FSTATE_Running) return false;
		
		bool result = SPI::Open();
		if (result == true){
			unsigned short header[2];
			address &= 0x1FFF;
			if (noinc == false){
				address |= 0x6000;
			}else{
				address |= 0x4000;
			}
			header[0] = address;
			header[1] = length;
			
			SetOut(PIN_FPGA_nCS, OUT_LOW);
			Barrier();
			SPI::SetMode(SPI::MODE_16BIT);
			SPI::SetupTxDMA(header, 2);
			SPI::SetupTxDMA(data, length);
			SPI::StartDMA();
			SPI::WaitTxDMA();
			SPI::StopDMA();
			Barrier();
			SetOut(PIN_FPGA_nCS, OUT_HIGH);
			
			SPI::Close();
		}
		return result;
	}
Beispiel #3
0
		// 書き込み
		bool Write(const void *data, unsigned int len, unsigned int &written){
			// ポインタとサイズの確認
			if (State != FSTATE_Config) return false;
			
			written = len;
			//xprintf("Conf:write(%d)\n", len);
			
			if (GetIn(PIN_FPGA_DONE) == IN_LOW){
				// コンフィギュレーションはまだ終わってない
				
				// 送信
				if (SPI::Open() == false) return false;
				
				SetOut(PIN_FPGA_CONF, OUT_HIGH);
				Barrier();
				if (len & 1){
					// 奇数
					SPI::SetMode(SPI::MODE_8BIT);
					SPI::SetupTxDMA(data, len);
				}else{
					// 偶数
					SPI::SetMode(SPI::MODE_16BIT);
					SPI::SetupTxDMA(data, len / 2);
				}
				SPI::StartDMA();
				SPI::WaitTxDMA();
				SPI::StopDMA();
				Barrier();		
				SetOut(PIN_FPGA_CONF, OUT_LOW);
				
				SPI::Close();
			}
			
			return true;
		}
Beispiel #4
0
	void CLampBuzzer::Seq(void)
	{
		g_nv.NDm(blinkOnOff) = m_tmBlink.Blink(TRUE, 500, 500);

		BOOL bOnOff = g_nv.NDm(blinkOnOff);


		int nCurState = GetState();

		if(m_nOldState != nCurState)
		{
			m_tmBuzzer.Reset();
			m_nOldState = nCurState;
			m_bBuzzerOff = FALSE;
		}

		// Tower Lamp
		if(LAMP_ON == m_pConfig->state[nCurState].nGreen)
			SetOut(oTowerLampG, TRUE);
		else if(LAMP_OFF == m_pConfig->state[nCurState].nGreen)
			SetOut(oTowerLampG, FALSE);
		else
			SetOut(oTowerLampG, bOnOff);

		if(LAMP_ON == m_pConfig->state[nCurState].nRed)
			SetOut(oTowerLampR, TRUE);
		else if(LAMP_OFF == m_pConfig->state[nCurState].nRed)
			SetOut(oTowerLampR, FALSE);
		else
			SetOut(oTowerLampR, bOnOff);

		if(LAMP_ON == m_pConfig->state[nCurState].nYellow)
			SetOut(oTowerLampY, TRUE);
		else if(LAMP_OFF == m_pConfig->state[nCurState].nYellow)
			SetOut(oTowerLampY, FALSE);
		else
			SetOut(oTowerLampY, bOnOff);



		//Buzzer On/Off
		if(m_bBuzzerOff)
		{
			BuzzerOnOff(0);
		}
		else
		{
			int nBuzzerOnTime = (m_pConfig->nAllOffTime * 1000);
			BOOL bTimeOff = !!m_pConfig->nAllOffUse;

			if(bTimeOff && m_tmBuzzer.TimeOver(nBuzzerOnTime))
				BuzzerOnOff(0);
			else
				BuzzerOnOff(m_pConfig->state[nCurState].nBuzzer);
		}
	}//--------------------------------------------------------------
Beispiel #5
0
void CPneumatic::Actuate(int nCmdDirection)
{
	if(pmFWD == nCmdDirection)
		SetOut(TRUE, FALSE);
	else if(pmBWD == nCmdDirection)
		SetOut(FALSE, TRUE);
	else if(pmALL_OFF == nCmdDirection)
		SetOut(FALSE, FALSE);

	if(m_nCurDirection != nCmdDirection)
		m_tmDelay.Reset();

	m_nCurDirection = nCmdDirection;
}//------------------------------------------------------------------
Beispiel #6
0
void CUldBtmConv::Auto(void)
{
	g_event.bCanEjectUldMz = FALSE;

	if(m_fsm.IsRun() || g_nv.NDm(safetyBeam))
		return;

	if(mcSTOP == m_nRun)
		return;

	if(g_UldMz.m_fsm.IsInProgress(ULDMZ::C_UNLOADING_START, ULDMZ::C_UNLOADING_END))
		return;

	if(!AOn(iUldOutMzArrival) && !g_opr.bStop)
		SetOut(oUldOutConvOn, FALSE);

	if(!AOn(iUldOutMzArrival) && !IsOutOn(oUldOutConvOn))
	{
		g_event.bCanEjectUldMz = TRUE;
	}
	else if(AOn(iUldOutMzArrival))
	{
		m_fsm.SetStatus(C_CONV_START);
	}
}//--------------------------------------------------------------
Beispiel #7
0
	void InitPneumatic(void)
	{
		//Set I/O
		g_pm[VAC_LD_PICKER].SetIO(iVacLdPicker, pmDUMMY_IO, oVacLdPicker, pmDUMMY_IO);
		g_pm[VAC_ULD_PICKER].SetIO(iVacUldPicker, pmDUMMY_IO, oVacUldPicker, pmDUMMY_IO);
		g_pm[VAC_FRONT_STAGE].SetIO(iVacFrontStage, pmDUMMY_IO, oVacFrontStage, pmDUMMY_IO);
		g_pm[VAC_REAR_STAGE].SetIO(iVacRearStage, pmDUMMY_IO, oVacRearSrage, pmDUMMY_IO);
		//g_pm[CYL_LD_MZ_CLAMP].SetIO(iLdMzClampUp, iLdMzClampDn, oLdMzClampUp, oLdMzClampDn);
		g_pm[CYL_LD_MZ_CLAMP].SetIO(iLdMzClampUp, pmDUMMY_IO, oLdMzClampUp, oLdMzClampDn);   // 95mm 60mm Mz 차이로 인해.. 

		g_pm[CYL_INRAIL_OC].SetIO(iInRailOpen, iInRailClose, oInRailOpen, pmDUMMY_IO);
		g_pm[CYL_INRAIL_OC_02].SetIO(iInRailOpen02, iInRailClose02, oInRailOpen, pmDUMMY_IO);
		g_pm[CYL_INRAIL_GUIDE_UD].SetIO(iInRailGuideUp, iInRailGuideDn, oInRailGuideUp, pmDUMMY_IO);
		
		g_pm[CYL_GRIPPER_OC].SetIO(iGripperDn, iGripperUp, oGripperDn, pmDUMMY_IO);  // 추가
		
		g_pm[CYL_LD_PICKER_UD].SetIO(iLdPickerUp, iLdPickerDn, oLdPickerUp, oLdPickerDn);
		g_pm[CYL_OUTRAIL_OC].SetIO(iOutRailOpen, iOutRailClose, oOutRailOpen, pmDUMMY_IO);
		g_pm[CYL_OUTRAIL_OC_02].SetIO(iOutRailOpen02, iOutRailClose02, oOutRailOpen, pmDUMMY_IO);
		g_pm[CYL_OUTRAIL_GUIDE_UD].SetIO(iOutRailGuideUp, iOutRailGuideDn, oOutRailGuideUp, pmDUMMY_IO);
		g_pm[CYL_OUTRAIL_PUSHER_FB].SetIO(iOutRailPusherFwd, iOutRailPusherBwd, oOutRailPusherFwd, pmDUMMY_IO);
		g_pm[CYL_OUTRAIL_PUSHER_UD].SetIO(iOutRailPusherUp, iOutRailPusherDn, pmDUMMY_IO, oOutRailPusherDn);
		g_pm[CYL_ULD_PICKER_UD].SetIO(iUldPickerUp, iUldPickerDn, oUldPickerUp, oUldPickerDn);
		//g_pm[CYL_ULD_MZ_CLAMP].SetIO(iUldMzClampUp, iUldMzClampDn, oUldMzClampUp, oUldMzClampDn);
		g_pm[CYL_ULD_MZ_CLAMP].SetIO(iUldMzClampUp, pmDUMMY_IO, oUldMzClampUp, oUldMzClampDn);  // 95mm 60mm Mz 차이로 인해..

		//Set Error
		g_pm[VAC_LD_PICKER].SetErr(7000, ER_VAC_LD_PICKER, pmUNCERTAIN);
		g_pm[VAC_ULD_PICKER].SetErr(7000, ER_VAC_ULD_PICKER, pmUNCERTAIN);
		g_pm[VAC_FRONT_STAGE].SetErr(7000, ER_VAC_FRONT_STAGE, pmUNCERTAIN);
		g_pm[VAC_REAR_STAGE].SetErr(7000, ER_VAC_REAR_STAGE, pmUNCERTAIN);
		g_pm[CYL_LD_MZ_CLAMP].SetErr(7000, ER_CYL_LD_MZ_CLAMP, pmUNCERTAIN);
		g_pm[CYL_INRAIL_OC].SetErr(7000, ER_CYL_INRAIL_OC, pmUNCERTAIN);
		g_pm[CYL_INRAIL_OC_02].SetErr(7000, ER_CYL_INRAIL_OC, pmUNCERTAIN);
		g_pm[CYL_INRAIL_GUIDE_UD].SetErr(7000, ER_CYL_INRAIL_GUIDE_UD, pmUNCERTAIN);

		g_pm[CYL_GRIPPER_OC].SetErr(7000, ER_CYL_GRIPPER_OC, pmUNCERTAIN);  // 추가

		g_pm[CYL_LD_PICKER_UD].SetErr(7000, ER_CYL_LD_PICKER_UD, pmUNCERTAIN);
		g_pm[CYL_OUTRAIL_OC].SetErr(7000, ER_CYL_OUTRAIL_OC, pmUNCERTAIN);
		g_pm[CYL_OUTRAIL_OC_02].SetErr(7000, ER_CYL_OUTRAIL_OC, pmUNCERTAIN);
		g_pm[CYL_OUTRAIL_GUIDE_UD].SetErr(7000, ER_CYL_OUTRAIL_GUIDE_UD, pmUNCERTAIN);
		g_pm[CYL_OUTRAIL_PUSHER_FB].SetErr(7000, ER_CYL_OUTRAIL_PUSHER_FB, pmBWD);
		g_pm[CYL_OUTRAIL_PUSHER_UD].SetErr(7000, ER_CYL_OUTRAIL_PUSHER_UD, pmUNCERTAIN);
		g_pm[CYL_ULD_PICKER_UD].SetErr(7000, ER_CYL_ULD_PICKER_UD, pmUNCERTAIN);
		g_pm[CYL_ULD_MZ_CLAMP].SetErr(7000, ER_CYL_ULD_MZ_CLAMP, pmUNCERTAIN);


		//Pm Init Position
		g_pm[CYL_LD_PICKER_UD].Actuate(pmUP);
		g_pm[CYL_ULD_PICKER_UD].Actuate(pmUP);
		g_pm[CYL_OUTRAIL_PUSHER_UD].Actuate(pmUP);
		g_pm[CYL_OUTRAIL_PUSHER_FB].Actuate(pmBWD);
		g_pm[CYL_INRAIL_GUIDE_UD].Actuate(pmDOWN);
		g_pm[CYL_OUTRAIL_GUIDE_UD].Actuate(pmDOWN);

		SetOut(oMainAirSol, TRUE);
	}//------------------------------------------------------------------
Beispiel #8
0
	// FPGAをリセット
	void Reset(void){
		portENTER_CRITICAL();
		
		// パイプが使用中でなかったらリセット
		//SetDir(PIN_FPGA_AUX0, DIR_IN);		// M0ピンに繋がっているのでHi-Zにする
		//SetDir(PIN_FPGA_AUX1, DIR_IN);		// MOSIピンに繋がっているのでHi-Zにする
		
		SetOut(PIN_FPGA_nPROG, OUT_LOW);	// PROG_BをLow
		SetDir(PIN_FPGA_nINIT, DIR_OUT);	// INIT_BをLow
		
		State = FSTATE_NoConf;
		
		for(int cnt = 20; 0 < cnt; cnt--){	// ウェイト
			NOP();
		}
		
		SetOut(PIN_FPGA_nPROG, OUT_HIGH);	// PROG_BをHigh
		
		portEXIT_CRITICAL();
	}
Beispiel #9
0
	// データを読み込む
	bool Read(int address, void *data, int length, bool noinc){
		if (State != FSTATE_Running) return false;
		
		bool result = SPI::Open();
		if (result == true){
			unsigned short header[2];
			address &= 0x1FFF;
			if (noinc == false){
				address |= 0xA000;
			}else{
				address |= 0x8000;
			}
			header[0] = address;
			header[1] = length;
			
			// DMA受信は不安定なので、データの受信はCPUが直接行う
			SetOut(PIN_FPGA_nCS, OUT_LOW);
			Barrier();
			SPI::SetMode(SPI::MODE_16BIT);
			AVR32_SPI.rdr;
			AVR32_SPI.tdr = header[0];
			while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0);
			AVR32_SPI.rdr;
			AVR32_SPI.tdr = header[1];
			while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0);
			AVR32_SPI.rdr;
			while(0 < length){
				AVR32_SPI.tdr = 0xFFFF;
				while((AVR32_SPI.sr & AVR32_SPI_SR_RDRF_MASK) == 0);
				*(short*)data = AVR32_SPI.rdr;
				data = (short*)data + 1;
				length--;
			}
			SetOut(PIN_FPGA_nCS, OUT_HIGH);

			SPI::Close();
		}
		return result;
	}
Beispiel #10
0
int main()
{
	const char *name = "OS_HW1"; // Name of shared memory object to be passed to shm_open
	int bufSize; // Bounded buffer size
	int itemCnt; // Number of items to be consumed

	int shm_fd; // Shared Memory File Descriptor

	// Write code here to create a shared memory block and map it to gShmPtr
	// Use the above name
	// **Extremely Important: map the shared memory block for both reading and writing 
	// Use PROT_READ | PROT_WRITE
	shm_fd = shm_open(name, O_RDWR , 0666);
	gShmPtr = mmap(0,SHM_SIZE,PROT_READ | PROT_WRITE,MAP_SHARED,shm_fd,0);

	// Write code here to read the four integers from the header of the shared memory block 
	// These are: bufSize, itemCnt, in, out
	// Just call the functions provided below like this:
	bufSize = GetBufSize();
	itemCnt = GetItemCnt();

	// Write code here to check that the consumer has read the right values: 
	printf("Consumer reading: bufSize = %d\n",bufSize);
	printf("Consumer reading: itemCnt = %d\n",itemCnt);
	printf("Consumer reading: in = %d\n",GetIn());
	printf("Consumer reading: out = %d\n",GetOut());

	// Write code here to consume all the items produced by the producer
	// Use the functions provided below to get/set the values of shared variables in, out, bufSize
	// Use the provided function ReadAtBufIndex() to read from the bounded buffer 	
	// **Extremely Important: Remember to set the value of any shared variable you change locally
	// Use the following print statement to report the consumption of an item:
	// printf("Consuming Item %d with value %d at Index %d\n", i, val, out);
	// where i is the item number, val is the item value, out is its index in the bounded buffer
	int i;
	for(i=0;i < GetItemCnt(); i++){
		while(GetIn() == GetOut())
			;
		printf("Consuming Item %d with value %d at Index %d\n", i+1, ReadAtBufIndex(GetOut()), GetOut()); //i+1 to show human readable count
		SetOut((GetOut()+1) % GetBufSize());
	}


	// remove the shared memory segment 
	if (shm_unlink(name) == -1) {
		printf("Error removing %s\n",name);
		exit(-1);
	}

	return 0;
}
Beispiel #11
0
	void CLampBuzzer::BuzzerOnOff(int nBuzzNo)
	{
		SetOut(oBuzzer1, FALSE);
		SetOut(oBuzzer2, FALSE);
		SetOut(oBuzzer3, FALSE);
		SetOut(oBuzzer4, FALSE);

		if(1 == nBuzzNo)
			SetOut(oBuzzer1, TRUE);
		else if(2 == nBuzzNo)
			SetOut(oBuzzer2, TRUE);
		else if(3 == nBuzzNo)
			SetOut(oBuzzer3, TRUE);
		else if(4 == nBuzzNo)
			SetOut(oBuzzer4, TRUE);
	}//--------------------------------------------------------------
Beispiel #12
0
	// データを書き込む
	bool Write(int address, short data){
		if (State != FSTATE_Running) return false;
		
		bool result = SPI::Open();
		if (result == true){
			unsigned short packet[3];
			packet[0] = 0x4000 | (address & 0x1FFF);
			packet[1] = 1;
			packet[2] = data;
			
			SetOut(PIN_FPGA_nCS,OUT_LOW);
			Barrier();
			SPI::SetMode(SPI::MODE_16BIT);
			SPI::SetupTxDMA(packet, 3);
			SPI::StartDMA();
			SPI::WaitTxDMA();
			SPI::StopDMA();
			Barrier();
			SetOut(PIN_FPGA_nCS, OUT_HIGH);
			
			SPI::Close();
		}
		return result;
	}
Beispiel #13
0
	BOOL Init(void)
	{
		// PGM 중복 실행 체크
		HANDLE hEvent = ::OpenEventA(EVENT_ALL_ACCESS, FALSE, "KOSES_SEQUENCE");
		if (NULL != hEvent)
		{
			::MessageBoxA(NULL, "Another sequence is running!!", "Error" , MB_OK);
			return (FALSE);
		}	
		else
		{
			CreateEventA(NULL, FALSE, FALSE, "KOSES_SEQUENCE");
		}

		// Init Shared memory(kamelas)
		if(FALSE == g_mmi.Init())
		{
			::MessageBox(NULL, _T("Failed to Init Communication"), _T("Error") , MB_OK);
			return (FALSE);
		}

		// NV DATA Init..
		if(FALSE == g_nv.Init())
		{
			::MessageBoxA(NULL, "Failed to init nv file.", "Error", MB_OK);
			return (FALSE);
		}
		
		CAjinLib AjinLib;
		if(FALSE == AjinLib.Init())
		{
			::MessageBoxA(NULL, "Failed to init AjinLib.", "Error", MB_OK);
			return (FALSE);
		}

		g_input.m_nModuleCnt  = g_input.m_ioConfig.CreateInfo(AXT_SIO_RDI32);
		if(g_input.m_nModuleCnt != IN_MODULE_CNT)
		{
			::MessageBoxA(NULL, "D/I Module Count Error!!!", "Error", MB_OK);
			return (FALSE);
		}

		g_output.m_nModuleCnt = g_output.m_ioConfig.CreateInfo(AXT_SIO_RDO32);
		if(g_output.m_nModuleCnt != OUT_MODULE_CNT)
		{
			::MessageBoxA(NULL, "D/O Module Count Error!!!", "Error", MB_OK);
			return (FALSE);
		}

		pIOInst->m_pInAddr  = &g_input.m_ch[0];
		pIOInst->m_pOutAddr = &g_output.m_ch[0];

		g_output.Read();
		g_update.Input();

		InitAxis();
		InitPneumatic();

		g_LdMz.Init();
		g_InRail.Init();
		g_LdPicker.Init();
		STAGE::Init();
		g_UldPicker.Init();
		g_OutRail.Init();
		g_UldMz.Init();

		g_lampBuzzer.Init();
		g_tenkeyOpr.Init();

		g_opr.bStop			 = TRUE;
		g_opr.bEmg			 = FALSE;
		g_opr.bPaused		 = FALSE;
		g_opr.bCardInit		 = FALSE;
		g_opr.bCycleProgress = FALSE;

		// Lamp 초기화
		g_opr.bManual		= FALSE;
		g_opr.bAir			= IsOutOn(oMainAirSol);

		SetOut(oManualMkLamp, g_opr.bManual);
		SetOut(oAirSwLamp, IsOutOn(oMainAirSol)); 


		//timer 해상도 결정
		timeBeginPeriod(1);

		return (TRUE);
	}//------------------------------------------------------------------
Beispiel #14
0
	void COffRail::Auto(void)
	{
		g_event.bCanPushToOffRail = FALSE;
		g_event.bCanOffRailToUldPicker = FALSE;
		
		int nExistErr = IsExistErr();

		if(mcSTOP == m_nRun)
			return;

		if(m_fsm.IsRun() || g_nv.NDm(safetyBeamLd))
			return;

		if(!m_pMtY->IsRdy())
			return;

		if(g_UldPicker.m_fsm.IsInProgress(ULDPICKER::C_PICKUP_START, ULDPICKER::C_PICKUP_END))
			return;

		if(g_OutRail.m_fsm.IsInProgress(OUTRAIL::C_PUSH_START, OUTRAIL::C_PUSH_END))
			return;

		if(g_OutRail.m_fsm.IsInProgress(OUTRAIL::C_QC_VI_START, OUTRAIL::C_QC_VI_END))
			return;

		if(EXIST_UNCERTAIN == nExistErr)
			return;

		if(EXIST_ERR == nExistErr)
		{
			m_pInfo->nExist = 2;
			g_err.Save(ER_OFFRAIL_EXIST);
			return;
		}

		if(0 == (int)g_nv.PkgData(outStripType))
		{
			SetOut(oOffRail_60mm, TRUE);
			SetOut(oOffRail_775mm, FALSE);
		}
		else
		{
			SetOut(oOffRail_60mm, FALSE);
			SetOut(oOffRail_775mm, TRUE);
		}

		int nState = GetState();
	
		switch(nState)
		{
		case S_IDLE:
			if(!m_pMtY->IsRdy(P_OFFRAIL_READY))
			{
				if(AOn(i4thRailStripChk3))
				{
					
					m_pInfo->nExist = 2;
					g_err.Save(ER_OUT_RAIL_JAM);
					break;
				}
				if(CanMove(P_OFFRAIL_READY))
				{
					m_pMtY->Move(P_OFFRAIL_READY);
				}
			}
			break;

		case S_RCV_FROM_OFFRAIL:
			if(m_pMtY->IsRdy(P_OFFRAIL_WORK))
			{
				g_event.bCanPushToOffRail = TRUE;
			}
			else
			{
				if(AOn(i4thRailStripChk3))
				{
					m_pInfo->nExist = 2;
					g_err.Save(ER_OUT_RAIL_JAM);
					break;
				}
					
				if(CanMove(P_OFFRAIL_WORK))
				{
					m_pMtY->Move(P_OFFRAIL_WORK);
				}
			}
			break;

		case S_REQ_PICKER:
			if(m_pMtY->IsRdy(P_OFFRAIL_READY))
			{
				g_event.bCanOffRailToUldPicker = TRUE;
			}
			else
			{
				if(AOn(i4thRailStripChk3))
				{
					m_pInfo->nExist = 2;
					g_err.Save(ER_OUT_RAIL_JAM);
					break;
				}
				if(CanMove(P_OFFRAIL_READY))
				{
					m_pMtY->Move(P_OFFRAIL_READY);
				}
			}
			break;
		}
	}//--------------------------------------------------------------
Beispiel #15
0
	// 制御用の変数を初期化
	void Init(void){
		SetOut(PIN_FPGA_nPROG, OUT_HIGH);	// PROG_BをHigh
	}
bool charshell::Handle()
{
	if(!SetWrite())
	{
		return false;
	}

	*ostr<<"Begin time: ";
	WriteTime();

	if(!SetMode())
	{
		return false;
	}

	if(!SetKey())
	{
		return false;
	}

	if(!SetIn())
	{
		return false;
	}

	if(!SetOut())
	{
		return false;
	}
	if(!Setlog())
	{
		return false;
	}

	if(mode == "3" && !SetReout())
	{
		return false;
	}

	if(mode == "1")
	{
		filedes m_filedes(in, out, key, true);
		m_filedes.Inicialize();
		m_filedes.Process();

	}
	else if(mode == "2")
	{
		filedes m_filedes(in, out, key, false);
		m_filedes.Inicialize();
		m_filedes.Process();
	}
	else if(mode == "3")
	{
		filedes m_filedes(in, out, key, true);
		m_filedes.Inicialize();
		m_filedes.Process();
		
		out->close();
		delete out;
		out = 0;

		ifstream iftmp(outPath.c_str(), ios::binary);

		filedes m_filedes2(&iftmp, reout, key, false);
		m_filedes2.Inicialize();
		m_filedes2.Process();
			
	}
	*ostr<<"End time: ";
	WriteTime();

	string tmp = ostr->str();
	cout<<tmp;
	*log<<tmp;

	return false;
}