//================================================================================================================
// [mk_extdef.h] : 이 헤더 파일은 mk 라이브러리와 caller 프로그램이 공통으로 사용해야하는 각종 정의들을 모아
// 놓은 것이다. mk_common.h에서 선언된 것들은 모든 시스템이 공통으로 사용하는 것인데 반하여, 여기에서 선언된 
// 정의들은 시스템에 따라서 적절히 조정이 필요한 것 들이다.
// - Version: 1.02
// - Update Data: 2007/05/08
// - Created by OYS
// -. Revision history:
//   <Ver 1.02>: [2008/12/13] 
//    1) SOCK_BUF_SIZE의 값을 EIP2에서는 1024로 늘렸다("#define SOCK_BUF_SIZE 1024")
//================================================================================================================

#ifndef _MICOMMON_EXTERNAL_DEFINES_H_ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #0
#define _MICOMMON_EXTERNAL_DEFINES_H_

//#define START_SECT_IDX	2 // 부트로더인 경우는 standalone 으로 동작시 2번섹터(User 섹터) 부터 사용하도록 합니다.
#define START_SECT_IDX	0 // 부트로더가 아닌 경우는 다운로더의 역할을 합니다. 즉 부트로더 코드를 다운로드 시켜주기 위해서는 부트로더 전용 섹터 (0번 ~ 1번) 섹터를 사용합니다.

#include "mk_common.h"

//#define _OPT_CEIP_SUPPORT  // CEIP 통신 함수 지원할 때는 이 주석 해제 

#define AM_SWITCH	0xA0A00000	// IP Addr Lotary switch
#define AM_FLASH	0x90000000
#define AM_RS232	0xA0000000
#define AM_ETHER	0xA0080000
#define AM_EBUS		0xB0000000
#define AM_SLOT_ADDR_OFS	0x200	// 장치 스캔할 때 각 슬롯마다의 주소값 오프셋
#define AM_MOTION   0x100
#define AM_DI       0x0
#define AM_DO       0x40
#define AM_AI       0x80
#define AM_AO       0x100
#define AM_RTD      0x180
#define NUM_MAX_COMMMODULE		10 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_MOTIONMODULE	1 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_AXES_PERMOD		2	// 모션 모듈 하나당 최대 축수 2개.
#define NUM_MAX_DIOMODULE		9 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_CNDIOMODULE		10 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_AIOMODULE		12 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_CNTMODULE		10 // Up 카운터 모듈,  // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_SERMODULE		10 // 확장 Serial 모듈,  0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define MAX_N_AXES	32 // defines for motion control
#define MAX_N_DIO_CHAN	256 // maximum number of DIO channels

//#define FW_VERSION		0x01100318 // 상위 네자리(Major Version(1~99+연도): 0108, 하위 네자리(Minor;월일) : 0530
#define FW_VERSION		0x01131224 // 20130912 KTW,KHH ListMotion, SyncMode 추가
#define FLS_SYSTEM_CFG	0 // [FIXME-EIP2]
#define FW_UPDATE_CHECKSIGN	"FLASDONE" // 8 bytes 고정.
#define FW_PORT 		35040 	// 전용 포트 번호
#define FW_CHANNEL		0		// 전용 소켓 채널 번호.
#define FLS_USER_SECT_IDX	2 		// 사용자 Flash 섹터는 2 번 부터..
#define FLS_SYS_SECT_IDX	33		// 시스템 사용 Flash 섹터는 33번 하나.

#define FLS_AIO_SECT_IDX    34      // 시스템 사용 Flash 섹터는 33번 하나.

#define NUM_SERIAL_PORTS	1   // number of serial ports
#if	(_PLATFORM==PLF_EtherIP_2)
 #define SOCK_BUF_SIZE		1024
#else
 #define SOCK_BUF_SIZE		512
#endif

#define MAX_USERCOMMENT_BYTES 32	// 최대 사용자 코멘트 바이트수=32바이트

typedef enum _TLEDStatus{
	ALED_OFF=0, ALED_SS, ALED_LSS, ALED_LL, ALED_ON, ELED_OFF=8, ELED_SS, ELED_LSS, ELED_LL, ELED_ON
}TLEDStatus;

// LED 상태의 우선순위에 따른 인덱스 List
typedef enum _TLEDStatusIdx{
	LEDSIDX_NM_DISABLE=1, LEDSIDX_NM_DUPID, LEDSIDX_NM_WRONGID, LEDSIDX_NM_FWUP,
	LEDSIDX_MO_DISABLE, LEDSIDX_MO_WRONGID, LEDSIDX_MO_COMMERR, LEDSIDX_MO_COMMOK, LEDSIDX_MO_RDY
}TLEDStatusIdx;

typedef enum { CPU_MODULE_ERR, CPU_MODULE_ACT, DIO_MODULE_ERR, DIO_MODULE_ACT, AI_MODULE_ERR, AI_MODULE_ACT, AO_MODULE_ERR, AO_MODULE_ACT, CNT_MODULE_ERR, CNT_MODULE_ACT, SER_MODULE_ERR, SER_MODULE_ACT, CNDIO_MODULE_ERR, CNDIO_MODULE_ACT } LED_TYPE;

typedef struct{
	t_ui32 Min: 16;
	t_ui32 Maj: 16;
}TVersion; // 이 것은 사용자가 자기만의 버전을 기록할 수 있도록 한 것이다.

typedef struct{
	t_ui32 dwSign;
	TVersion SysVer; 
	TSockAddr IpAddr;
	TVersion UserVer;
	t_ui32 dwComment[8]; // [5]->[8] 변경됨. 사용자가 필요한 코멘트를 기록할 수 있도록 (4byte*8=32문자)
	t_ui32 dwCommentCnt;
	t_ui32 dwReserved[10]; // [14]->[10] 변경됨
}TSysConfig;

// mk_extern.c
unsigned char GetLastIpAddrFromGPIOF();
t_ui32 mkcTimerTick(void);

#if 1
t_bool mkLoadSysCfg(void);
t_i32 mkSaveSysCfg(void);
void SetLEDStatusIdx(t_ui16 uLEDStatusIdx, t_bool bUpdateOnce);
//void UpdateLEDStatus();
//void SetLED(t_i32 nType, long nModIdx, unsigned long hDevice, t_i32 bOn);

t_bool siGetOne(t_ui32 nChannel);
t_i32 siGetMulti(t_ui32 nIniChan, t_ui32 nNumChan);
void soPutOne(t_ui32 nChannel, t_bool bState);
t_bool soGetOne(t_ui32 nChannel);
void soPutMulti(t_ui32 nIniChan, t_ui32 nNumChan, t_ui32 dwStates);
t_i32 soGetMulti(t_ui32 nIniChan, t_ui32 nNumChan);
#endif

// FW_UPGRADE.lib
t_bool FW_MainLoop();
t_ui32 FW_GetVersion();

// Gpio.lib
extern void Act_LED_On(t_byte On);
extern void Err_LED_On(t_byte On);
extern t_i32 GetSerDigInput(t_i8 ch);

#endif //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #0
