#ifndef _X_OPTLINK_TMS2TMS_H
#define _X_OPTLINK_TMS2TMS_H

#define MAX_WAIT_ERROR_X_OPTLINK_TMS2TMS 	1 	// ìàêñ. êîë-âî îæèäàíèß ÷òåíèß ñ øèíû


typedef union {
    unsigned int all;
    struct {
			unsigned int id:8;
			unsigned int count_receiver_error:4; 
			unsigned int trans_busy:1;	 		// ïðèåìíèê íà âíåøíåé ïëàòå ÒÊ
			unsigned int trans_error:1;	 		// ïðèåìíèê íà âíåøíåé ïëàòå ÒÊ
			unsigned int receiver_busy :1; 		// ïðèåìíèê íà òåêóùåé ïëàòå ÒÊ
			unsigned int receiver_error:1; 		// ïðèåìíèê íà òåêóùåé ïëàòå ÒÊ
    } bit;
} X_OPTLINK_TMS2TMS_status;




typedef union {
    unsigned int all;
    struct {
      unsigned int started:1;
	  unsigned int error:1;
	  unsigned int cmd_start:1;
	  unsigned int count_error:4;
	  unsigned int slave_addr_error:4;
	  unsigned int init:1;
	  unsigned int was_started:1;
	  unsigned int rezerv:3;

    } bit;
} X_OPTLINK_TMS2TMS_flags;




typedef struct {
				 unsigned int setup_error_count_read; 	// íàñòðîéêà ìàêñ êîë-âà ïîïûòîê ÷òåíèé ñ øèíû äî âîçíèêíîâåíèß îøèáêè
} X_OPTLINK_TMS2TMS_Setup;



typedef struct { X_OPTLINK_TMS2TMS_flags flags;  		// ôëàãè   
          		 X_OPTLINK_TMS2TMS_Setup setup;		// íàñòðîéêà

          		 X_OPTLINK_TMS2TMS_status  status1;		// ñòàòóñ1
          		 X_OPTLINK_TMS2TMS_status  status2;		// ñòàòóñ2

				 unsigned int data_receiver[4];  			// äàííûå ïðèíßòûå - 0..3
				 unsigned int data_send[4];  				// äàííûå äëß ïåðåäà÷è - 0..3

				 unsigned int error_count_send; 	// îáùåå êîëè÷-âî îøèáîê ïåðåäà÷è
				 unsigned int error_count_receiver; 	// îáùåå êîëè÷-âî îøèáîê ïåðåäà÷è
				 unsigned int count_receiver; 			// îáùåå êîëè÷-âî ÷òåíèß
				 unsigned int count_send; 			// îáùåå êîëè÷-âî ïåðåäà÷è

//				 unsigned int error_count_write;	// îáùåå êîëè÷-âî îøèáîê çàïèñè
//				 unsigned int error_count_hold; 	// îáùåå êîëè÷-âî îøèáîê çàõâàòà øèíû 

				 void (*init)(); 					// Pointer to init function
				 void (*read_data)(); 			// Pointer to init function
				 void (*write_data)(); 			// Pointer to init function
				 }X_OPTLINK_TMS2TMS;



/*
// òàéìàóò îæèäàíèß âûïîëåíèß êîìàíäû
#define TIME_OUT_SERIAL_BUS	10000 // max 65535


#define CMD_SERIAL_BUS_READ		0x0000
#define CMD_SERIAL_BUS_WRITE	0x8000

*/


typedef X_OPTLINK_TMS2TMS *X_OPTLINK_TMS2TMS_handle;

#define X_OPTLINK_TMS2TMS_DEFAULTS { 0, \
								0,0,\
						    	MAX_WAIT_ERROR_X_OPTLINK_TMS2TMS, \
								{0,0,0,0},\
								{0,0,0,0},\
						    	0, \
						    	0, \
						    	0, \
						    	0, \
						    	(void (*)(Uint32))x_optlink_tms2tms_init,\
						    	(void (*)(Uint32))x_optlink_tms2tms_read_data,\
						    	(void (*)(Uint32))x_optlink_tms2tms_write_data\
						    } 


void x_optlink_tms2tms_init(X_OPTLINK_TMS2TMS_handle);

void x_optlink_tms2tms_read_data(X_OPTLINK_TMS2TMS_handle);

void x_optlink_tms2tms_write_data(X_OPTLINK_TMS2TMS_handle);


extern X_OPTLINK_TMS2TMS x_optlink_tms2tms_project;



#endif // end _X_OPTLINK_TMS2TMS_H