#ifndef X_BASIC_TYPES_H	/* prevent circular inclusions */
#define X_BASIC_TYPES_H	/* by using protection macros */



#ifndef TRUE
	#define TRUE		1
#endif

#ifndef FALSE
	#define FALSE		0
#endif

#ifndef NULL
	#define NULL		0
#endif 

/*-----------------------------------------------------------------------------
Define the types
-----------------------------------------------------------------------------*/
typedef signed char         Int8;
typedef signed int          Int16;
typedef signed long         Int32; 
typedef signed long long    Int64;  

typedef unsigned char       UInt8;
typedef unsigned int        UInt16;
typedef unsigned long       UInt32; 
typedef unsigned long long  UInt64;

#ifndef real
typedef float real;
#endif


typedef enum {
	component_NotReady	= 0x1,  // не готов, не было инита и не было обмена
	component_Ready		= 0x2, // готов, прошел проверку на обмен по шине
	component_Started	= 0x4, // переходной режим, инит был, но обмена еще нет, после нескольких неудачных попыток обмена получим переход в component_Error
    component_Error	    = 0x8,  // ошибка или не прошел внутренний тест.
    component_Detected  = 0x10,  // плата обнаружена, но обмен с ней отключен в настройках проекта. Только при запуске поиска ВСЕХ плат.
    component_NotFinded = 0x20,  // плата включена в настройках проекта, но не была обнаружена при старте программы.
    component_NotDetected  = 0x40,  // плата не обнаружена, и обмен с ней отключен в настройках проекта. Только при запуске поиска ВСЕХ плат.
    component_ErrorSBus     = 0x80,  // нет обмена по SBUS
    component_ErrorPBus     = 0x100  // авария по PBUS
} T_component_status;

typedef enum {
    local_status_NotReady   = 0x1,       // не готов, не было инита и не было обмена
    local_status_Ok         = 0x2,      // Нет ошибок
    local_status_Error      = 0x4    // есть ошибки.
} T_local_status;


typedef enum { 
   status_Success = 0,
   status_Failed  = 1
} T_status_ReturnType;



//typedef UInt16 T_Status;
 

#define HiWord(l)((UInt16)(((UInt32)(l)>>16)&0xFFFF))
#define LoWord(l)((UInt16)( (UInt32)(l)     &0xFFFF))

#define HiByte(w)((UInt8)(((UInt16)(w)>>8)&0xFF))
#define LoByte(w)((UInt8)( (UInt16)(w)    &0xFF))

#define Byte3(l)((UInt8)(((UInt32)(l)>>24)&0xFF))
#define Byte2(l)((UInt8)(((UInt32)(l)>>16)&0xFF))
#define Byte1(l)((UInt8)(((UInt32)(l)>> 8)&0xFF))
#define Byte0(l)((UInt8)( (UInt32)(l)     &0xFF))

#define	Bit_UInt32(bit_index, value)	((UInt32)((((UInt32)(value)) >> (bit_index))	& 0x01))


#define	UInt16_Byte0(c)	((((UInt16)(c)) <<  0) & 0x00ff)
#define	UInt16_Byte1(c)	((((UInt16)(c)) <<  8) & 0xff00)

#define	UInt32_Byte0(c)	((((UInt32)(c)) <<  0) & 0x000000ff)
#define	UInt32_Byte1(c)	((((UInt32)(c)) <<  8) & 0x0000ff00)
#define	UInt32_Byte2(c)	((((UInt32)(c)) << 16) & 0x00ff0000)
#define	UInt32_Byte3(c)	((((UInt32)(c)) << 24) & 0xff000000)

#define	UInt32_LoWord(w) ((((UInt32)(w)) <<  0) & 0x0000ffff)
#define	UInt32_HiWord(w) ((((UInt32)(w)) << 16) & 0xffff0000)

#define	UInt16_Bit(index, value)	((((UInt16)(value)) & 0x0001)		<< (index))
#define	UInt32_Bit(index, value)	((((UInt32)(value)) & 0x00000001)	<< (index))



#define X_ASSERT_ESTOP0(useit)           		\
{												\
	if(useit == TRUE)							\
	{											\
	    X_Stop();								\
		asm ("   ESTOP0");						\
	}											\
}


/*------------------------------------------------------------------------------
 Prototypes for the functions in x_basic_types.c
------------------------------------------------------------------------------*/

void X_Stop();

#endif
