#ifndef _MICOMMON_DEFINES_H_ // #@1
#define _MICOMMON_DEFINES_H_

// Ethernet 관련
#define UDP_PORT0	35040 // 펌웨어 업데이트 전용 포트.
#define UDP_PORT1	3000
#define TCP_PORT	3000


// Serial 관련
#define SERIAL_CH_TEMP		1;
#define SERIAL_CH_USF		2;



#include ".\\mk_lib\\mk_common.h"

typedef struct{
	t_ui16 reserved;
}TConfData;

// 접점 신호 정의
enum {DI00=0, DI01, DI02, DI03, DI04, DI05, DI06, DI07, DI08, DI09, DI10, DI11, DI12, DI13, DI14, DI15,
	  DI16, DI17, DI18, DI19, DI20, DI21, DI22, DI23, DI24, DI25, DI26, DI27, DI28, DI29, DI30, DI31=31};
enum {DO00=0, DO01, DO02, DO03, DO04, DO05, DO06, DO07, DO08, DO09, DO10, DO11, DO12, DO13, DO14, DO15
};

// 점점 alias
#define DI_FRONT_LOCK_CHECK_SENSOR		DI00	// front lock check Sensor (stk side, B접점)
#define DI_REAR_LOCK_CHECK_SENSOR		DI01	// rear lock check sensor (sky cvy side, B접점)
#define DI_MGZ_EMPTY_CHECK_SENSOR		DI02	// Destination Sensor or magazine empty check sensor
#define DI_FRONT_CLAMP_FWD_SENSOR		DI03	// front clamp forward sensor
#define DI_FRONT_CLAMP_BWD_SENSOR		DI04	// front clamp backward sensor
#define DI_REAR_CLAMP_CLOSE_SENSOR		DI05	// rear clamp forward sensor
#define DI_REAR_CLAMP_OPEN_SENSOR		DI06	// rear clamp backward sensor
#define DI_SPARE01						DI07	// spare
#define DI_WAITTING_FWD_SENSOR			DI08	// waitting forward sensor or destination sensor
#define DI_WAITTING_BWD_SENSOR			DI09	// waitting backward sensor
#define DI_FRONT_LOCK_FWD_SENSOR		DI10	// front lock forward sensor
#define DI_FRONT_LOCK_BWD_SENSOR		DI11	// front lock backward sensor
#define DI_REAR_LOCK_FWD_SENSOR			DI12	// rear lock forward sensor
#define DI_REAR_LOCK_BWD_SENSOR			DI13	// rear lock backward sensor
#define DI_SPARE02						DI14	// spare
#define DI_SPARE03						DI15	// spare
#define DI_ALIGN_BWD_SENSOR				DI16	// align backward sensor
#define DI_ALIGN_FWD_SENSOR				DI17	// align forward sensor
#define DI_SPARE04						DI18	// spare
#define DI_SPARE05						DI19	// spare
#define DI_SPARE06						DI20	// spare
#define DI_SPARE07						DI21	// spare
#define DI_SPARE08						DI22	// spare
#define DI_SPARE09						DI23	// spare
#define DI_SPARE10						DI24	// spare
#define DI_SPARE11						DI25	// spare
#define DI_PIO_INPUT_TRREQ				DI26	// sky cvy측 전송 요청.
#define DI_PIO_INPUT_BUSY				DI27	// sky cvy측 전송중.
#define DI_PIO_OUTPUT_TACK				DI28	// stk측 전송 허가 
#define DI_PIO_OUTPUT_COMPT				DI29	// stk측 전송 완료
#define DI_PIO_RESERVED1				DI30	// reserved
#define DI_PIO_RESERVED2				DI31	// reserved

#define DO_FRONT_LOCK_SOL_RUN			DO00	// locker sol 구동
#define DO_REAR_LOCK_SOL_RUN			DO01	// locker sol 구동
#define DO_WAIT_SOL_RUN					DO02	// waiting sol 구동
#define DO_FRONT_CLAMP_SOL_RUN			DO03	// front clamp sol 구동
#define DO_REAR_CLAMP_SOL_RUN			DO04	// rear clamp sol 구동
#define DO_ALIGN_SOL_RUN				DO05	// align sol 구동

#define DO_PIO_INPUT_TACK				DO08	// sky cvy -> locker 반입 허가
#define DO_PIO_INPUT_COMPT				DO09	// sky cvy -> locker 반입 완료
#define DO_PIO_OUTPUT_TRREQ				DO10	// locker -> stk 반출 요청
#define DO_PIO_OUTPUT_BUSY				DO11	// locker -> stk 반출중
#define DO_FORWARD_MGZ_ARR				DO15	// DI_MGZ_EMPTY_CHECK_SENSOR 신호 상태를 그대로 출력 (외부 장비로 포워딩 용도) 해준다.

enum {CV_CW, CV_CCW}; // Conveyor 방향
enum {S_OFF, S_ON}; // 접점 On/Off 상태.

enum {SEQ_TYPE_WAIT, SEQ_TYPE_TEST}; // Seqnence type

// Seq Index //
enum {
	RDYTRANS_STEP_IDLE = 0,
	RDYTRANS_STEP_LOCKCYL_BWD,
	RDYTRANS_STEP_ALIGN_BWD,
	RDYTRANS_STEP_DELAY1,
	RDYTRANS_STEP_CLAMP_BWD,
	RDYTRANS_STEP_WAITCYL_OPEN,
	RDYTRANS_STEP_CHECK_WAITCYL_OPEN
};


// Alarm codes //
enum _TEnumAlarmCodes{
	ACODE_ERR_NONE = 0,
	//-------- CONTROLLER ALARM ---------------------------------------------------//
	ACODE_SYSINT_TIMER0_DEAD=500,
	ACODE_SYSINT_TIMER1_DEAD,		// Timer1 interrupt loop is dead
	ACODE_SYSINT_MAIN_LOOP_DEAD,	// Main() process loop is dead
	ACODE_SYSINT_MOT_DEV_FAIL,		// Motion device 인식 불량 
	ACODE_SYSINT_SER_DEV_FAIL,		// Serial device 인식 불량 
	ACODE_SYSINT_ETHERNET_DEV_FAIL,	// Ethernet device 인식 불?
	ACODE_SYSINT_RFID_COM_FAULT,	// RFID 통신에러 발생
	ACODE_SYSINT_GOT_COM_FAULT,		// GOT 통신》?발생
	ACODE_SYSINT_SERVO_COM_FAULT,	// SERVO 통신에러 발생
	//-------- OPERATION ALARM ---------------------------------------------------//
	ACODE_EMG_SWITCH=520,
	ACODE_OPERATOR_STOP,			// Operator 강제 정지
	ACODE_ALIGN_SENSOR_DOUBLE,
	ACODE_WAIT_SENSOR_DOUBLE,		// wait sensor 가 FWD, BWD 둘다 감지된 경우.
	ACODE_LOCK_SENSOR_DOUBLE,		// lock sensor fwd/bwd 중복 감지.
	ACODE_CLAMP_SENSOR_DOUBLE,		// clamp lock 및 unlock 센서가 두개 모두 on 상태이다.
	ACODE_WAIT_SOL_POS_FAULT,		// Wait 실린더의 위치가 올바르지 않은 경우.
	ACODE_FRONT_CLAMP_SOL_POS_FAULT,// Front-clamp 실린더의 위치가 올바르지 않은 경우.
	ACODE_REAR_CLAMP_SOL_POS_FAULT,	// Rear-clamp 실린더의 위치가 올바르지 않은 경우. 
	ACODE_FRONT_LOCK_CHECK_SOL_POS_FAULT, // Front-lock 체크 실린더의 위치가 올바르지 않은 경우.

	ACODE_REAR_LOCK_CHECK_SOL_POS_FAULT, // Rear-lock 체크 실린더의 위치가 올바르지 않은 경우.
	ACODE_ALIGN_SOL_POS_FAULT,		// Aligner 실린더의 위치가 올바르지 않은 경우.
	ACODE_MGZ_ARRIVE_TIMEOUT,		// magazine 도착 타임아웃.
	ACODE_WAIT_CYL_TIMEOUT,			// Wait 실린더 구동 타임아웃
	ACODE_CLAMP_TIMEOUT,			// Clamp 타임아웃
	ACODE_LOCK_SOL_TIMEOUT,			// Lock 실린더 동작 타임아웃 
	ACODE_PIO_BUSY_TIMEOUT, 		// PIO Busy 신호 체크중 타임 아웃.
	ACODE_PIO_TREQ_ABNORMAL_OFF,	// PIO-TREQ 신호가 비정상적으로 OFF됨.
	ACODE_PIO_LP1_SENSOR_TIMEOUT, 	// LP side 첫번째 센서 감지 중 타임아웃.
	ACODE_PIO_COMP_ACK_TIMEOUT,		// PIO-COMPT 신호를 ON했으나 상대측에서 지정된 시간 안에 PIO-TREQ를 OFF하지 않음.

	ACODE_PIO_TACK_TIMEOUT,			// pio tr req 에 대한 ack 타임아웃.
	ACODE_PIO_COMPT_TIMEOUT,		// pio tr complete 에 대한 타임아웃.
	ACODE_LOCK_FAULT_ACK_TIMEOUT,	// LOCK_FAULT_ACK 통신데이터가 지정된 시간안에 수신되지 않음.
	ACODE_ABNORMAL_MGZ_DETECTED,	// MGZ인 없어야 하는 상황에서 감지되는 경우.

	ACODE_HOST_DISCONNECTED=599
};


//****************************** Serial 통신 ************************************************************//
// Ethernet
#define TCP_BUF_MAX		512


// USF Protocal //
#define GC_USF_HEAD		0x40   		// '@'
#define GC_USF_SEP1		0x3D		// '='
#define GC_USF_SEP2		0x3B		// ';'
#define GC_USF_TERM		0x0D		// Termination

// Serial Comm. Unit 분류 
enum { SDC_TEMP = 1, USF_FLOW, HORIBA_DENSITY };


#endif // #@1
