//================================================================================================================
// [mk_common.h]: 
// - Version: 1.0.0.2
// - Update Data: 2007/09/17
// - Created by OYS
// -. Revision history:
//   <Ver 1.0.0.0>: 이전 버전 기록 없음.
//   <Ver 1.0.0.1>: [2009/03/17] 
//    1) 인터락 함수(IntLk_xx) 선언부 추가
//    2) 인터락 처리 관련 구조체 정의
//    3) ResetAIOModule, ResetDIOModule, ResetMotionModule, ResetCntrModule 함수 선언부 추가.(기존 각 mk_aio.h, mk_dio.h mk_motion.h, mk_counter.h 에 선언되어있던것을 이곳으로 옮김)
//   <Ver 1.0.0.2>: [2009/03/27] 
//    1) PEER_CHECK_RETRY_COUNT 상수 추가
//   <Ver 1.0.0.3>: [2009/11/06]
//    1) t_i16 GnIsModuleAvailable(t_ui16 uModId); // 2009.11.06 추가
//	 <Ver 1.0.0.4>: [2010/09/13]
//		1) 모니터링을 위한 시리얼 테스트 함수 헤더 추가
//			serTestGetErrCount, serTestAddErrCount, serTestReset, serTestGetRegOne, serTestGetRegAll)(세메스 지원)
//	 <Ver 1.0.0.5>: [2010/09/15]
//		1) 라이브러리 버전 얻는 함수 헤더 추가
//			fwlibGetVersion, gpioGetVersion, commonGetVersion, flsGetVersion;
//================================================================================================================

#ifndef _MK_COMMON_DEFINES_H_
#define _MK_COMMON_DEFINES_H_

#include <string.h> 
#include <math.h> 
#include <stdlib.h>  
#include <stdio.h>


#define OYS_20130823	// OYS가 8월 23일경에 수정한 내용들 표시하기 위해서 선언한 것임 

//[CHECKME] System platform 정의부는 mk_extdef.h 에서 mk_common.h 로 이전했습니다. 확인 요망.
// System platform 정의 //
#define PLF_miCUBE		0
#define PLF_miCUBE_E	1
#define PLF_EtherIP_1	2 // TMS320F2812 CPU with Ethernet/IP 2축 motion 모듈
#define PLF_SIMULINE_1	3 // Simuline motion control board
#define PLF_EtherIP_2	4 // ceNM_PE 모듈용 
#define PLF_RTEX		5 // COMI-LX520
#define PLF_ME3			6 // COMI-LX530
#define PLF_SS3			7 // COMI-LX540
#define PLF_SEAlpha		8 // ceNM_SE Alpha 모듈용 
#define PLF_PEAlpha		9 // ceNM_PE Alpha 모듈용 

#define _PLATFORM		PLF_EtherIP_2  // _PLATFORM 정의로 platform을 구분한다.

#define PEER_CHECK_RETRY_COUNT	0x03 // PEER Alive Packet 전송 Retry Count, 2009.03.27 추가됨. by hjo

#if	(_PLATFORM==PLF_miCUBE || _PLATFORM==PLF_miCUBE_E)
/* Boot Loader for Startup */
asm("	.text				");
asm("	.global	_c_int00	");
asm("	BR		_c_int00	");
#define	INT0	1
#define	INT1	2
#define	INT2	3
#define	INT3	4
#define	XINT0	5
#define	RINT0	6
#define	TINT0	9
#define	TINT1	10
#define	DINT0	11
#define	DINT1	12

#elif (_PLATFORM==PLF_EtherIP_1)
#include "DSP281x_Device.h"
// do nothing any more : // DSP281x_PieVect.h 에 정의된 PINT 형의 TINT0 와 중복되어 compile 시 에러로 주석 처리함. 기타 INT 도 선언하면 안됨.
#elif (_PLATFORM==PLF_RTEX)
#include "DSP2833x_Device.h"
#else

#endif

// 플랫폼 공통 선언
enum {SOCK_SERIAL, SOCK_ETHERNET, SOCK_USB};
enum {	DEV_ID_INVALID=-1, DEV_ID_AI04=0x10, DEV_ID_AI08=0x11, DEV_ID_AIRNT=0x17, DEV_ID_AO02=0x1A, DEV_ID_AO04=0x1B,
		DEV_ID_D16CM=0x14, DEV_ID_DI32=0x13, DEV_ID_DO32=0x12,
		DEV_ID_MC02P=0x15, DEV_ID_MC04P=0x16,
		DEV_ID_CN08=0x1C, DEV_ID_CN02E=0x1D,
		DEV_ID_SC04=0x1E,
		DEV_ID_CM01A=0x19 };

#define INVALID_HANDLE_VALUE	0xffffffff

#define false	0
#define true 	1

#ifndef FALSE
#define FALSE	0
#endif

#ifndef TRUE
#define TRUE	1
#endif

#define OFF		0
#define ON		1

#ifndef NULL
 #define NULL	0
#endif


#if	(_PLATFORM==PLF_miCUBE || _PLATFORM==PLF_miCUBE_E) //@@@@@@@@@@@@@@@@@ #1
// 공통 선언부
typedef char			t_bool;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char 			BOOL;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char			t_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_byte;		// 2812 에서는 8비트가 아닌 16비트임에 주의, 또한 2812 에서는 byte 의 의미는 없지만 공통 함수 사용으로 편의상 byte 사용.
typedef unsigned char	u_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	UCHAR;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_uchar;	// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	SOCKET;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef double 			t_float32;
typedef double			t_f32;
typedef t_uchar			t_ui8;
typedef t_char			t_i8;
typedef long double 	t_float40;
typedef unsigned int 	ULONG;
typedef unsigned int 	UINT;
typedef unsigned char 	BYTE;
typedef unsigned short	u_short;	// 16-bit value
typedef unsigned int	u_int;		// 32-bit value
typedef unsigned long	u_long;		// 32-bit value
typedef unsigned int	t_ui32;
typedef int				t_i32;
typedef short			t_i16;
typedef unsigned short	t_ui16;
typedef unsigned int	HANDLE;
typedef unsigned int 	DWORD;
typedef unsigned short 	WORD;		// [CHECKME] typedef unsigned int WORD 에서 typedef unsigned short WORD 로 변경했습니다. 상관없는지 확인 요망.
typedef unsigned int (*TfpGetTimerTick) (void);

#define	Int_enable()	asm("		OR	2000H,ST	");  // enable all interrupt
#define	Int_disable()	asm("		ANDN	2000H,ST	"); // disable all interrupt
#define	Int_clear()		asm("		LDI	0000H,IE	"); // clear all interrupt

#define Outp32(cs, ofs, outval) *((volatile t_i32*)cs + (ofs)) = outval
#define Inp32(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs)))
#define Outp16(cs, ofs, outval) *((volatile t_i16*)cs + (ofs)) = (outval) & 0xffff
#define Inp16(cs, ofs)	(*((volatile t_i16*)(cs) + (ofs)) & 0xffff)
#define Outp8(cs, ofs, outval) *((volatile t_byte*)cs + (ofs)) = (outval) & 0xff
#define Inp8(cs, ofs)	(*((volatile t_byte*)(cs) + (ofs)) & 0xff)

#elif (_PLATFORM==PLF_EtherIP_1) //@@@@@@@@@@@@@@@@@ #1
// 공통 선언부
typedef char			t_bool;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char 			BOOL;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char			t_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_byte;		// 2812 에서는 8비트가 아닌 16비트임에 주의, 또한 2812 에서는 byte 의 의미는 없지만 공통 함수 사용으로 편의상 byte 사용.
typedef unsigned char	u_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	UCHAR;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_uchar;	// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	SOCKET;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef double 			t_float32;
typedef double			t_f32;
typedef t_uchar			t_ui8;
typedef t_char			t_i8;
typedef unsigned long	ULONG;
typedef unsigned int	t_ui16;		// 2812 에서는 int 는 16비트 임.
typedef int				t_i16;		// 2812 에서는 int 는 16비트 임.
typedef unsigned long	t_ui32;
typedef long			t_i32;
typedef unsigned long	HANDLE;
typedef unsigned long	DWORD;

void Int_enable();
void Int_disable();
void Int_clear();

#define Outp32(cs, ofs, outval) *((volatile t_i32*)cs + (ofs)) = outval
#define Inp32(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs)))
#define Outp16(cs, ofs, outval) *((volatile t_i16*)cs + (ofs)) = (outval) & 0xffff
#define Inp16(cs, ofs)	(*((volatile t_i16*)(cs) + (ofs)) & 0xffff)
#define Outp8(cs, ofs, outval) *((volatile t_byte*)cs + (ofs)) = (outval) & 0xff
#define Inp8(cs, ofs)	(*((volatile t_byte*)(cs) + (ofs)) & 0xff)

#elif (_PLATFORM==PLF_EtherIP_2) //@@@@@@@@@@@@@@@@@ #1

void _Int_disable(void);
void _Int_enable(void);

typedef char			t_char; 
typedef unsigned char	t_byte;
typedef unsigned char	t_uchar;
typedef t_byte			t_bool;
typedef t_char			t_i8;
typedef t_uchar			t_ui8;
typedef unsigned short	t_ui16;
typedef short			t_i16;
typedef unsigned int	t_ui32;
typedef int				t_i32;
typedef float			t_f32;
typedef double			t_f64;
typedef t_ui32			HANDLE;
typedef t_uchar			SOCKET;

///////////////////////////////////////////////////////////////
enum { SEMES_ERR_TIMEOUT=0, SEMES_ACTLED_SET=1, SEMES_ERRLED_SET=2, SEMES_BOOTUP=3, SEMES_SEROPEN=4, SEMES_SERCLOSE=5, SEMES_ERR_FIFOFULL=6, SEMES_ERR_485SET=7,
		SEMES_ERR_INVALIDCH=8, SEMES_ERR_BASEADDRFAIL=9, SEMES_ERR_TXOP=10, SEMES_ERR_RXOP=11 };

#define MAX_SER_ERR_NUM	12
#define MAX_SER_REG_NUM	10

// test functions 2010년 8월26일 세메스 내 테스트용 함수 추가
t_ui32 serTestGetErrCount(t_ui16 uIdx);
void serTestAddErrCount(t_ui16 uIdx);
void serTestReset();
t_byte serTestGetRegOne(t_i32 nPort, t_ui16 uRegID, t_bool bDisableInt);
/*
// uRegName : // TL16C55x 및 TL16C754B 공통 사용 레지스터 번호 //
#define TL_RBR		0 // TL16C754B의 RHR
#define TL_DLL		0
#define TL_DLM		1 // TL16C754B의 DLH
#define TL_IER		1
#define TL_IIR		2
#define TL_FCR		2
#define TL_LCR		3
#define TL_MCR		4
#define TL_LSR		5
#define TL_MSR		6
#define TL_SCR		7 // not in use
*/
void _serTestGetRegAll(t_i32 nPort, t_bool bDisableInt); // extern t_byte g_abySerRegVals[MAX_SER_REG_NUM]; // MAX_SER_REG_NUM = 10
///////////////////////////////////////////////////////////////

#define	Int_enable()	_Int_enable()
#define	Int_disable()	_Int_disable()
#define	Int_clear()

#define Outp32(cs, ofs, outval) *((volatile t_i32*)cs + (ofs/4)) = outval
#define Inp32(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs/4)))
#define Outp16(cs, ofs, outval) *((volatile t_i32*)cs + (ofs/2)) = (outval) & 0xffff
#define Inp16(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs/2)) & 0xffff)
//#define Outp8(cs, ofs, outval) *((volatile t_i32*)cs + (ofs)) = (outval) & 0xff
//#define Inp8(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs)) & 0xff)
#define Outp8(cs, ofs, outval) *((volatile t_i32*)cs + (ofs)) = (outval) & 0xff
#define Inp8(cs, ofs)   (*((volatile t_i32*)(cs) + (ofs)) & 0xff)

#elif (_PLATFORM==PLF_RTEX) //@@@@@@@@@@@@@@@@@ #1
// 공통 선언부
typedef char			t_bool;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char 			BOOL;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef char			t_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_byte;		// 2812 에서는 8비트가 아닌 16비트임에 주의, 또한 2812 에서는 byte 의 의미는 없지만 공통 함수 사용으로 편의상 byte 사용.
typedef unsigned char	u_char;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	UCHAR;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef unsigned char	t_uchar;	// 2812 에서는 8비트가 아닌 16비트임에 주?
typedef unsigned char	SOCKET;		// 2812 에서는 8비트가 아닌 16비트임에 주의
typedef double 			t_float32;
typedef double			t_f32;
typedef t_uchar			t_ui8;
typedef t_char			t_i8;
typedef unsigned char  *PBYTE;
typedef unsigned long	ULONG;
typedef unsigned int	t_ui16;		// 2812 에서는 int 는 16비트 임.
typedef int				t_i16;		// 2812 에서는 int 는 16비트 임.
typedef unsigned long	t_ui32;
typedef long			t_i32;
typedef unsigned long	HANDLE;
typedef unsigned long	DWORD;

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_AC

// Base address of each section // // 다음은 F28335 에 맞게 Base 주소가 수정되어야 함. 원래 mk_extdef.h 에 있던 내용인데 mk_common.h 로 통합함.
#define AM_RS232	0xf00000
#define AM_ETHER	0x2000
#define AM_EBUS		0x200000
#define AM_SLOT_ADDR_OFS	0x100	// 장치 스캔할 때 각 슬롯마다의 주소값 오프셋
#define NUM_MAX_AXES_PERMOD		2	// 모션 모듈 하나당 최대 축수 2개.
#define NUM_MAX_COMMMODULE		10 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_MOTIONMODULE	10 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_DIOMODULE		10 // 0 base (모듈Idx) 와 1 base (모듈ID) 공용 이므로 9가 아닌 10으로 크기 설정.
#define NUM_MAX_AIOMODULE		10 // 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	18 // defines for motion control
#define MAX_N_DIO_CHAN	160 // maximum number of DIO channels
#define FW_UPDATE_CHECKSIGN	0xABCD1234
#define FW_VERSION		0x01131224 // 상위 네자리(Major Version(1~99+연도): 0109, 하위 네자리(Minor;월일) : 0226

#define Outp32(cs, ofs, outval) *((volatile t_i32*)cs + (ofs)) = outval
#define Inp32(cs, ofs)	(*((volatile t_i32*)(cs) + (ofs)))
#define Outp16(cs, ofs, outval) *((volatile t_i16*)cs + (ofs)) = (outval) & 0xffff
#define Inp16(cs, ofs)	(*((volatile t_i16*)(cs) + (ofs)) & 0xffff)
#define Outp8(cs, ofs, outval) *((volatile t_byte*)cs + (ofs)) = (outval) & 0xff
#define Inp8(cs, ofs)	(*((volatile t_byte*)(cs) + (ofs)) & 0xff)

extern void DSP28x_usDelay(t_ui32 Count);
#define Delay_us(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
#define Delay_ms(ms) Delay_us((ms)*1000L)
void Delay_100ns(void);
void Delay_200ns(void);

#define CPU_RATE    6.667L   // for a 150MHz CPU clock speed (SYSCLKOUT)

#endif //@@@@@@@@@@@@@@@@@ #1

// IEEE 형식의 부동소수점 포맷 //
typedef union{
	struct{
		t_ui32 f:	23;
		t_ui32 e:	8;
		t_ui32 s:	1;
	}b;
	t_ui32 v;
}TIeeeFloat;

// TMS320CVC33 형식의 부동소수점 포맷 //
typedef union{
	struct{
		t_ui32 f:	23;
		t_ui32 s:	1;
		t_ui32 e:	8;
	}b;
	t_ui32 v;
}TTms32Float;

typedef union{
	struct{
		t_ui32 b4: 8;
		t_ui32 b3: 8;
		t_ui32 b2: 8;
		t_ui32 b1: 8;
	}addr_1;
	t_ui32 addr_4;
}TSockAddr;

// added on 2008/09/22 by johyun
// 장착된 확장 시리얼 장치 로드 정보 //
typedef struct{
	HANDLE hDevice; // PC모드=>Device handle, DSP모드=>Base address
	t_i32 nNumSerPort;
	t_i32 nSerIni;
	struct{
		t_ui32 Id:	4; // Device ID
		t_ui32 Ver:	4; // H/W Version
		t_ui32 ModId: 4; // Module Id (로터리 스위치에서 설정한 값)
		t_ui32 ModType: 4; // Module Type (0: CPU 모듈 내장기본(miCUBE),  1: 확장 시리얼 모듈(miCUBE), 2: CPU 모듈 내장기본(PE), 3: 확장 시리얼 모듈(PE))
		t_ui32 Rsv:	16;
	}u;
	t_i32 nReserved[3];
		
}TSerDevice;

// 인터락 처리 관련 추가. 2009.03.13
typedef union{
	struct{
		t_ui32 c16: 2;
		t_ui32 c15: 2;
		t_ui32 c14: 2;
		t_ui32 c13: 2;
		t_ui32 c12: 2;
		t_ui32 c11: 2;
		t_ui32 c10: 2;
		t_ui32 c9: 2;
		t_ui32 c8: 2;
		t_ui32 c7: 2;
		t_ui32 c6: 2;
		t_ui32 c5: 2;
		t_ui32 c4: 2;
		t_ui32 c3: 2;
		t_ui32 c2: 2;
		t_ui32 c1: 2;
	}dogrp[18];
	t_ui32 dogrps[18]; // 32채널 ceDO32N 기준으로 최대9개까지 가능하므로 32비트 변수 두개가 모듈 하나를 커버하니까 32비트 변수 18개가 필요함.
}TDoInterLockActionMode; // 각 채널별 모드는 0: off (default), 1: on, 2: 현재상태 유지(불변), 3: reserved

typedef union{
	struct{
		t_ui32 c16: 2;
		t_ui32 c15: 2;
		t_ui32 c14: 2;
		t_ui32 c13: 2;
		t_ui32 c12: 2;
		t_ui32 c11: 2;
		t_ui32 c10: 2;
		t_ui32 c9: 2;
		t_ui32 c8: 2;
		t_ui32 c7: 2;
		t_ui32 c6: 2;
		t_ui32 c5: 2;
		t_ui32 c4: 2;
		t_ui32 c3: 2;
		t_ui32 c2: 2;
		t_ui32 c1: 2;
	}aogrp[2];
	t_ui32 aogrps[2]; // 2채널 ceAO02N 기준으로 최대9개까지 가능하므로 32비트 변수 두개면 충
}TAoInterLockActionMode; // 각 채널별 모드는 0: 최소 전압출력 값(0V, 0 mA)출력 (default), 1: reserved, 2: 현재상태 유지(불변), 3: reserved

typedef union{
	struct{
		t_ui32 c16: 2;
		t_ui32 c15: 2;
		t_ui32 c14: 2;
		t_ui32 c13: 2;
		t_ui32 c12: 2;
		t_ui32 c11: 2;
		t_ui32 c10: 2;
		t_ui32 c9: 2;
		t_ui32 c8: 2;
		t_ui32 c7: 2;
		t_ui32 c6: 2;
		t_ui32 c5: 2;
		t_ui32 c4: 2;
		t_ui32 c3: 2;
		t_ui32 c2: 2;
		t_ui32 c1: 2;
	}motgrp[2];
	t_ui32 motgrps[2]; // 2채널 ceMC02P 기준으로 최대9개까지 가능하므로 32비트 변수 두개면 충분
}TMotInterLockActionMode; // 각 채널별 모드는 0: 감속후 정지 (default), 1: 즉시 정지, 2: 현재상태 유지(불변), 3: reserved

// Disconnect InterLock 구조
typedef struct{
	// 1. 발생조건: disconnection 자동으로 판단

	// 2. 각종 설정
	t_bool bEnable; //인터락 사용 여부
	t_bool bIsPeerDisconReq; // PEER (PC단) 에서의 Disconnect 요청인지 여부, 만일 PEER 측으로부터의 Disconnect 요청이라면 Disconnect 인터락 처리를 해서는 안됨.
	t_ui16 uPeerKeepAliveTimeout; 	// PEER Keep Alive 체크시 disconnection 유지 타임아웃.(단위:밀리초)
	t_ui16 uPeerKeepAliveRetryCount; 	// PEER Keep Alive 체크시 disconnection 발생에 대한 재시도 횟수

	// 3. 처리방법
	// 3.0 ceNM-SE  처리 모드
	t_ui32 uCpuActMode;

	// 3.1 Digital Output 처리 모드
	TDoInterLockActionMode 	tDoActModes;

	// 3.2 Analog Output 처리 모드
	TAoInterLockActionMode 	tAoActModes;

	// 3.3 Motion 처리 모드
	TMotInterLockActionMode	tMotActModes;
}TDisconInterLock;

// 함수 선언. 플랫폼 공통
t_i32 fwlibGetVersion(void); // 2010년 9월15일 추가.
t_i32 gpioGetVersion(void);
t_i32 commonGetVersion(void);
t_i32 flsGetVersion(void);

#define Long2Float(l) (*((t_f32*)(&(l))))  // t_i32형 변수에 담겨진 부동소수점표현식을 부동소수점수로 변환
#define Float2Long(f) (*((t_i32*)(&(f)))) // 부동소수점수를 32비트 부동소수점 표현식으로 변환
// SetBit() : 지정한 비트의 값을 변경		//
// v:대상 변수, n:bit번호, s:변경값(state)	//
#define SetBit(v,n,s)  if(s) v|=((t_ui32)1<<(n)); else v&=~((t_ui32)1<<(n));
#define RoundOff(v) ((t_ui32)((v)+0.5)) // 반올림 함수 
#define IsValidIOCH(ch, maxch) (ch >= 0 && ch < maxch)

#ifdef OYS_20130823
 #define Idx2No(idx) ((idx)+1) //0-based 수를 1-based수로 변환 
 #define No2Idx(no)	((no)-1) // 1-based 수를 0-based수로 변환 
#endif

t_ui32 atoh(t_char *str);
t_ui16 Hex2Str(t_ui32 dwValue, t_char *pszBuf, t_i16 nWidth, t_bool bFillZero, t_bool bCapital);
t_ui32 FltCnvt_I2T(t_ui32 dwIeee_v); // convert float data from IEEE to TI format
t_ui32 FltCnvt_T2I(t_ui32 dwTms_v); // convert float data from TI to IEEE format

void mkcBootup(void);
t_ui32 mkcTimerTick(void);
void mkcTimerTick_Set(t_ui32 dwSetValue);
void mkcTimerCallback(void);

// 초기화 함수
void ResetMotionModule(t_bool bStopMotion, t_bool bDecel);
void ResetDIOModule(void);
void ResetAIOModule(void);
void ResetCntrModule(void);

#if	(_PLATFORM==PLF_miCUBE || _PLATFORM==PLF_miCUBE_E) // @@@@@@@@@@@@@@@@ #2
extern void Delay_us(int us); // mk_asmfunc.asm 소스
#define Delay_ms(ms) Delay_us((ms)*1000)
inline void Delay_100ns();
inline void Delay_200ns();

#elif (_PLATFORM==PLF_EtherIP_1) // @@@@@@@@@@@@@@@@ #2
#define CPU_RATE    6.667L   // for a 150MHz CPU clock speed (SYSCLKOUT)
// Delay함수 호출시 ACC시작값: 1us(28), 1ms(29996), 100ns(1), 200ns(4)
// DO NOT MODIFY THIS LINE.  
extern void DSP28x_usDelay(Uint32 Count);
#define Delay_us(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
#define Delay_ms(ms) Delay_us((ms)*1000L)
void Delay_100ns(void);
void Delay_200ns(void);
void FW_Reboot(int nProgMode);

// 인터락 관련 추가. 2009.03.13
// 추가 함수.
enum {INTLK_DISCONN, INTLK_SENSOR}; // Interlock type : 연결끊김인터락(0), 센서인터락(1)
enum {MOD_CPU, MOD_AO, MOD_DO, MOD_MOT}; // Module type: ceNM-SE(0), ceAO02N(1), ceDxxN(2), ceMC02P(3)
enum {CPU_ACT_RESERVED, CPU_ACT_REBOOT, CPU_ACT_KEEP}; // CPU (ceNM-SE) : reserved(0), reboot(1), 그대로(2) => reboot(1) 인 경우만 유효.
enum {DO_ACT_OFF, DO_ACT_ON, DO_ACT_KEEP}; // Digital Output 모듈의 인터락 Action 정의 : off 출력(0), on 출력(1), 현출력상태 유지(2)
enum {AO_ACT_MIN, AO_RESERVED1, AO_ACT_KEEP}; // Analog Output 모듈의 인터락 Action 정의 : 0: 최소 전압출력 값(0V, 0 mA)출력 (default), 1: reserved, 2: 현재상태 유지(불변), 3: reserved
enum {MOT_ACT_DECELSTOP, MOT_ACT_EMGSTOP, MOT_ACT_KEEP}; // Motion 모듈의 인터락 Action 정의 : 0: 감속후 정지 (default), 1: 즉시 정지, 2: 현재상태 유지(불변), 3: reserved

void _IntLk_Init(); 
void _IntLk_ProcessAll();
void _InterlockMotion();
void _InterlockAio();
void _InterlockDio();

void IntLk_SetEnable(t_ui32 uType, t_bool bEnable);
t_bool IntLk_GetEnable(t_ui32 uType);
void IntLk_SetPeerDisconReq(t_bool bPeerReq);
t_bool IntLk_GetPeerDisconReq();
void IntLk_SetDisconTimeout(t_ui16 uTimeout);
t_ui32 IntLk_GetDisconTimeout();
void IntLk_SetRetryCount(t_ui32 uCount);
t_ui32 IntLk_GetRetryCount();
void IntLk_SetActModeOne(t_ui32 nModType, t_ui32 uChannel, t_ui32 uActMode);
t_ui32 IntLk_GetActModeOne(t_ui32 nModType, t_ui32 uChannel);
void IntLk_SetActModeMulti(t_ui32 nModType, t_ui32 nIniChan, t_ui32 nNumChan, t_ui32 dwActModes);
t_ui32 IntLk_GetActModeMulti(t_ui32 nModType, t_ui32 nIniChan, t_ui32 nNumChan);

#elif (_PLATFORM==PLF_EtherIP_2) // @@@@@@@@@@@@@@@@ #2
void Delay_us(t_ui32 usec);
void Delay_100ns(void);
void Delay_200ns(void);
#define Delay_ms(ms) Delay_us(ms*1000)
void FW_Reboot(int nProgMode);
t_bool GnIsModuleAvailable(t_ui16 uModNo, t_i16 *pnDevId); // 2009.11.06 추가

#define McBSP0_DRR      0x18c0000   /* Address of data receive reg.         */
#define McBSP0_DXR      0x18c0004   /* Address of data transmit reg.        */
#define McBSP0_SPCR     0x18c0008   /* Address of serial port contl. reg.   */
#define McBSP0_RCR      0x18c000C   /* Address of receive control reg.      */
#define McBSP0_XCR      0x18c0010   /* Address of transmit control reg.     */
#define McBSP0_SRGR     0x18c0014   /* Address of sample rate generator     */
#define McBSP0_MCR      0x18c0018   /* Address of multichannel reg.         */
#define McBSP0_RCER     0x18c001C   /* Address of receive channel enable.   */
#define McBSP0_XCER     0x18c0020   /* Address of transmit channel enable.  */
#define McBSP0_PCR      0x18c0024   /* Address of pin control reg.          */

void GnInitMcBSP(void);		// 2012.04.10 추가 : McBSP 사용하도록 초기화
t_ui32 GnReadTemp(void);	// 2012.04.10 추가 : 센서로부터 온도를 얻어와 정수로 반환
void SetLED(t_bool Data);


#endif // @@@@@@@@@@@@@@@@ #2

//************* Error codes *************************************//

#define cmERR_NONE					0
#define cmERR_MEM_ALLOC_FAIL		-290	// Memory allocation fail
#define cmERR_GLOBAL_MEM_FAIL		-292	// Global memory allocation fail
#define cmERR_ISR_CONNEC_FAIL 		-310	// ISR registration fail
#define cmERR_DIVIDE_BY_ZERO		-400	// Cause divide by zero error 
#define cmERR_WORNG_NUM_DATA		-500	// Number of data is too small or too big
#define cmERR_VER_MISMATCH			-600 	// Version(of file or device) mismatch
#define cmERR_FLASH_ERASE_FAIL		-601	// fail to erase a flash-memory sector
#define cmERR_FLASH_WRITE_FAIL		-602	// fail to write a flash-memory sector
#define cmERR_FLASH_COPYSECT_FAIL	-603	// fail to copy whole data from source sector to target sector
#define cmERR_FLASH_CANNOTMODIFY	-604	// cannot modify the sector
#define cmERR_INVALID_SYSCFG		-605	// TSysConfig 의 dwSign 값이 SYS_CFG_SIGN 과 맞지 않음.
#define cmERR_MAXBYTESLIMIT_SYSCFG	-606	// TSysConfig 의 dwComment 의 최대 허용바이트수 초과됨.

#define cmERR_INVALID_DEVICE_ID		-1010 // Invalid device id => Load Device 또는 SetDeviceId()에서...
#define cmERR_INVALID_HANDLE		-1020
#define cmERR_UNSUPORTED_FUNC		-1030 
#define cmERR_INVALID_PARAMETER		-1101
#define cmERR_INVALID_MODULE_TYPE	-1102
#define cmERR_INVALID_CHANNEL		-1105
#define cmERR_INVALID_INDEX			-1106 // Index parameter is not valid
#define cmERR_INVALID_INPUT_RANGE	-1111 // Invalid range value (AI, AO)
#define cmERR_INVALID_FREQ_RANGE	-1121 // Invalid input or output frequency
#define	cmERR_FILE_CREATE_FAIL		-1501 // File create fail 
#define cmERR_FILE_OPEN_FAIL		-1511 // File open fail
#define cmERR_FILE_READ_FAIL		-1522 // File reading fail
#define cmERR_EVENT_CREATE_FAIL		-1550 // Event handle creation fail			
#define cmERR_INT_INSTANCE_FAIL		-1560 // Interrupt event instance creation fail
#define	cmERR_DITHREAD_CRE			-1570 // D/I state change monitor thread creation fail
#define cmERR_BUFFER_SMALL			-1580 // Buffer size is too small
#define cmERR_INVALID_BUF_SIZE		-1581 // Invalid buffer size
#define cmERR_HIGH_TIMER_UNSUPP		-1590 // The installed hardware does not support a high-resolution performance counter (cmmUtlDelayMicroSec() function fails)
#define cmERR_OUT_OF_RANGE			-1600 // The range of some parameter is out of range
#define cmERR_WRONG_MODE			-1601 // 잘못된 모드

#define cmERR_ON_MOTION				-5001
#define cmERR_STOP_BY_SLP			-5002 // Abnormally stopped by positive soft limit
#define cmERR_STOP_BY_SLN			-5003 // Abnormally stopped by negative soft limit
#define cmERR_STOP_BY_CMP3			-5004 // Abnormally stopped by comparator3
#define cmERR_STOP_BY_CMP4			-5005 // Abnormally stopped by comparator4
#define cmERR_STOP_BY_CMP5			-5006 // Abnormally stopped by comparator5
#define cmERR_STOP_BY_ELP			-5007 // Abnormally stopped by (+) external limit
#define cmERR_STOP_BY_ELN			-5008 // Abnormally stopped by (-) external limit
#define cmERR_STOP_BY_ALM			-5009 // Abnormally stopped by alarm input signal
#define	cmERR_STOP_BY_CSTP			-5010 // Abnormally stopped by CSTP input signal
#define cmERR_STOP_BY_CEMG			-5011 // Abnormally stopped by CEMG input signal
#define cmERR_STOP_BY_SD			-5012 // Abnormally stopped by SD input signal
#define cmERR_STOP_BY_DERROR		-5013 // Abnormally stopped by operation data error
#define cmERR_STOP_BY_IP			-5014 // Abnormally stopped by other axis error during interpolation
#define cmERR_STOP_BY_PO			-5015 // An overflow occurred in the PA/PB input buffer
#define cmERR_STOP_BY_AO			-5016 // Out of range position counter during interpolation
#define cmERR_STOP_BY_EE			-5017 // An EA/EB input error occurred (does not stop)
#define cmERR_STOP_BY_PE			-5018 // An PA/PB input error occurred (does not stop)
#define cmERR_STOP_BY_SLVERR		-5019 // Abnormally stopped because slave axis has been stopped
#define cmERR_STOP_BY_SEMG			-5020 // Abnormally stopped by software emergency setting

#define cmERR_MOT_MAOMODE			-5110 // Master output mode is not CW/CCW mode // Master/Slave 동작시에 Master output모드가 CW/CCW모드가 아니다.
#define cmERR_MOT_SLAVE_SET			-5120 // Slave start fail (Motion state가 "Wait for Pulsar Input"으로 변하지 않는다.
#define cmERR_SPEED_RANGE_OVER		-5130 // 
#define cmERR_INVALID_SPEED_SET		-5140 // Speed setting value is not valid
#define cmERR_ACC_LOW_LIMIT_OVER	-5142 // Acceleration setting value is too low
#define cmERR_ACC_HIGH_LIMIT_OVER	-5143 // Acceleration setting value is too high
#define cmERR_DEC_LOW_LIMIT_OVER	-5144 // Deceleration setting value is too low
#define cmERR_DEC_HIGH_LIMIT_OVER	-5145 // Deceleration setting value is too high
#define cmERR_INVALID_IXMAP			-5150 // Invalid interpolation map
#define cmERR_INVALID_LMMAP			-5160 // Invalid List-Motion Map
#define cmERR_INACTIVE_LMMAP		-5161 // Specified ListMotion Map is not active(enabled) map 
#define cmERR_MOT_SEQ_SKIPPED		-5170 // Motion command is skipped because the axis is already running.  
#define cmERR_MOT_PREREG_FULL		-5180 // Motion command is skipped because the pre-register is full of an axis.
#define cmERR_LTC_QUE_SIZE_ERROR	-5190 // Specified latch-que size is too big.
#define cmERR_LTC_QUE_BUF_FREED		-5191 // Latch-que is not allocated.

#define	cmERR_UNKNOWN				-9999

#endif


