#ifndef _CAN_SETUP
#define _CAN_SETUP


#include <CAN_project.h>

#include "word_structurs.h"
#include "DSP281x_Device.h"

#define MAX_COUNT_UNITES_TERMINAL   4  // ôèêñ
#define MAX_COUNT_UNITES_UKSS       16 // ôèêñ
#define MAX_COUNT_UNITES_MPU        4  // ôèêñ
#define MAX_COUNT_UNITES_ALARM_LOG  2  // ôèêñ

////////////////////////////////////////

#define CAN_ADR_TERMINAL_DEFAULT            0x00EEEE01
#define START_CAN_ADR_UNITS_DEFAULT         0x00235500
#define CAN_ADR_MPU_DEFAULT                 0x00CEB0E1
#define CAN_ADR_ALARM_LOG_DEFAULT           0x0BCDEF01


////////////////////////////////////////
// ïîäñ÷åò êîë-âà áëîêîâ MPU
// äîëæíû áûòü àêòèâèðîâàíû â CAN_project.c
////////////////////////////////////////

#ifndef USE_MPU_0
#define USE_MPU_0      0
#endif

#ifndef USE_MPU_1
#define USE_MPU_1      0
#endif

#ifndef USE_MPU_2
#define USE_MPU_2      0
#endif

#ifndef USE_MPU_3
#define USE_MPU_3      0
#endif



#define MPU_UNIT_QUA_UNITS     (  USE_MPU_0 + USE_MPU_1  \
                            + USE_MPU_2 + USE_MPU_3 \
                            )   //êîë-âî ÿùèêîâ äëÿ MPU_CAN





///////////////////////////////////////////
// êîë-âî ÿùèêîâ äëÿ TERMINAL_CAN
///////////////////////////////////////////

////////////////////////////////////////
// ïîäñ÷åò êîë-âà áëîêîâ TERMINAL
// äîëæíû áûòü àêòèâèðîâàíû â CAN_project.c
////////////////////////////////////////
#ifndef USE_TERMINAL_1_OSCIL
#define USE_TERMINAL_1_OSCIL      0
#endif

#ifndef USE_TERMINAL_1_CMD
#define USE_TERMINAL_1_CMD      0
#endif

#ifndef USE_TERMINAL_2_OSCIL
#define USE_TERMINAL_2_OSCIL      0
#endif

#ifndef USE_TERMINAL_2_CMD
#define USE_TERMINAL_2_CMD      0
#endif



#define TERMINAL_UNIT_QUA_UNITS     (  USE_TERMINAL_1_OSCIL + USE_TERMINAL_1_CMD  \
                            + USE_TERMINAL_2_OSCIL + USE_TERMINAL_2_CMD \
                            )   //êîë-âî ÿùèêîâ äëÿ TERMINAL_CAN


////////////////////////////////////////
// ïîäñ÷åò êîë-âà áëîêîâ ALARM_LOG
// äîëæíû áûòü àêòèâèðîâàíû â CAN_project.c
////////////////////////////////////////

#ifndef USE_ALARM_LOG_0
#define USE_ALARM_LOG_0      0
#endif

#ifndef USE_ALARM_LOG_1
#define USE_ALARM_LOG_1      0
#endif



#define ALARM_LOG_UNIT_QUA_UNITS     (  USE_ALARM_LOG_0 + USE_ALARM_LOG_1  \
                            )   //êîë-âî ÿùèêîâ äëÿ ALARM_LOG_CAN






////////////////////////////////////////
// ïîäñ÷åò êîë-âà áëîêîâ ukss
// äîëæíû áûòü àêòèâèðîâàíû â CAN_project.c
////////////////////////////////////////

#ifndef USE_UKSS_0
#define USE_UKSS_0      0
#endif

#ifndef USE_UKSS_1
#define USE_UKSS_1      0
#endif

#ifndef USE_UKSS_2
#define USE_UKSS_2      0
#endif

#ifndef USE_UKSS_3
#define USE_UKSS_3      0
#endif

#ifndef USE_UKSS_4
#define USE_UKSS_4      0
#endif

#ifndef USE_UKSS_5
#define USE_UKSS_5      0
#endif

#ifndef USE_UKSS_6
#define USE_UKSS_6      0
#endif

#ifndef USE_UKSS_7
#define USE_UKSS_7      0
#endif

#ifndef USE_UKSS_8
#define USE_UKSS_8      0
#endif

#ifndef USE_UKSS_9
#define USE_UKSS_9      0
#endif

#ifndef USE_UKSS_10
#define USE_UKSS_10      0
#endif

#ifndef USE_UKSS_11
#define USE_UKSS_11      0
#endif

#ifndef USE_UKSS_12
#define USE_UKSS_12      0
#endif

#ifndef USE_UKSS_13
#define USE_UKSS_13      0
#endif

#ifndef USE_UKSS_14
#define USE_UKSS_14     0
#endif

#ifndef USE_UKSS_15
#define USE_UKSS_15      0
#endif


#ifndef USE_R_B_0
#define USE_R_B_0   0
#endif
#ifndef USE_R_B_1
#define USE_R_B_1   0
#endif
#ifndef USE_R_B_2
#define USE_R_B_2   0
#endif
#ifndef USE_R_B_3
#define USE_R_B_3   0
#endif
#ifndef USE_R_B_4
#define USE_R_B_4   0
#endif
#ifndef USE_R_B_5
#define USE_R_B_5   0
#endif
#ifndef USE_R_B_6
#define USE_R_B_6   0
#endif
#ifndef USE_R_B_7
#define USE_R_B_7   0
#endif
#ifndef USE_R_B_8
#define USE_R_B_8   0
#endif
#ifndef USE_R_B_9
#define USE_R_B_9   0
#endif
#ifndef USE_R_B_10
#define USE_R_B_10   0
#endif
#ifndef USE_R_B_11
#define USE_R_B_11   0
#endif
#ifndef USE_R_B_12
#define USE_R_B_12   0
#endif
#ifndef USE_R_B_13
#define USE_R_B_13   0
#endif
#ifndef USE_R_B_14
#define USE_R_B_14   0
#endif
#ifndef USE_R_B_15
#define USE_R_B_15   0
#endif


#define UNIT_QUA_UNITS     (  USE_UKSS_0 + USE_UKSS_1 \
                            + USE_UKSS_2 + USE_UKSS_3 \
                            + USE_UKSS_4 + USE_UKSS_5 \
                            + USE_UKSS_6 + USE_UKSS_7 \
                            + USE_UKSS_8 + USE_UKSS_9 \
                            + USE_UKSS_10 + USE_UKSS_11 \
                            + USE_UKSS_12 + USE_UKSS_13 \
                            + USE_UKSS_14 + USE_UKSS_15)   // 2       //3//8 //êîëè÷åñòâî CAN óñòðîéñòâ ïåðåäàþùèõ â ñèñòåìå CANMODBUS - êîë-âî Unites

///////////////////////////////////////////
// íàñòðîéêè CAN_Open
///////////////////////////////////////////

#ifdef INGITIM_CAN_OPEN
    #define MBOX0_CANOPEN       0x00000013 //0x180 t1PDO1
    #define MBOX1_CANOPEN       0x0000018d //0x280 t2PDO1
    #define MBOX2_CANOPEN       0x000000c5 //0x380 t3PDO1
    #define MBOX3_CANOPEN       0x12000000 //0x480 t4PDO1
    #define MBOX4_CANOPEN       0x16000000 //0x580 t4PDO1
    #define MBOX5_CANOPEN       0x1a000000 //0x680 t4PDO1

#define CANOPEN_CAN_SETUP_DEFAULT { {MBOX0_CANOPEN,MBOX1_CANOPEN,MBOX2_CANOPEN,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},  \
                                {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, \
                                3}

#endif


#ifdef BWC_CAN_FATEC
    #define MBOX0_CANOPEN       0x08040000  //201; 010 0000 0001
    #define MBOX1_CANOPEN       0x0C040000  //301; 011 0000 0001
    #define MBOX2_CANOPEN       0x10040000 //401; 100 0000 0001
    #define MBOX3_CANOPEN       0x14040000 //501; 101 0000 0001
    #define MBOX4_CANOPEN       0x08080000 //202; 010 0000 0010
    #define MBOX5_CANOPEN       0x0C080000 //302; 011 0000 0010
    #define MBOX6_CANOPEN       0x10080000 //402; 100 0000 0010
    #define MBOX7_CANOPEN       0x14080000 //502; 101 0000 0010

#define CANOPEN_CAN_SETUP_DEFAULT { {MBOX0_CANOPEN,MBOX1_CANOPEN,MBOX2_CANOPEN,MBOX3_CANOPEN,MBOX4_CANOPEN,MBOX5_CANOPEN,MBOX6_CANOPEN,MBOX7_CANOPEN,0,0,0,0,0,0,0,0},  \
                                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1},  \
                                {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, \
                                0}

#endif

#ifdef BWC_CAN_SIEMENS
    #define MBOX0_CANOPEN       0x00040000  //  0x08040000  //201; 010 0000 0001
    #define MBOX1_CANOPEN       0x00080000  //301; 011 0000 0001

#define CANOPEN_CAN_SETUP_DEFAULT { {MBOX0_CANOPEN,MBOX1_CANOPEN,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1},  \
                                {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, \
                                0}
#endif


#ifndef CANOPEN_CAN_SETUP_DEFAULT
#define CANOPEN_CAN_SETUP_DEFAULT { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
                                {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},  \
                                {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, \
                                0}
#endif


/////////////////////////////////////////////////////////////////////





extern int CAN_input_data[];
extern int CAN_output_data[];
extern int* CAN_output;

extern int flag_enable_can_from_mpu;


/////////////////////////////////////////////////////////////////////


#define UNIT_QUA	        32      //12 // ­  êîëè÷åñòâî CAN óñòðîéñòâ â ñèñòåìå - ßùèêîâ



#define TERMINAL_UNIT_LEN   128
#define UNIT_LEN	        128
#define FIFO_LEN	        10
#define NEW_FIFO_LEN        128
#define NEW_CYCLE_FIFO_LEN        256
#define NEW_CYCLE_FIFO_LEN_MASK        (NEW_CYCLE_FIFO_LEN-1)




////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////

typedef struct
{
    int * adr_from;
    unsigned int adr_to;
    unsigned int adr;
	unsigned int quant;
	int busy;
	int FLY;
	int extended;

} CYCLE;


typedef struct
{
    int * adr_from;
    unsigned long adr_to;
    unsigned long adr;
    unsigned long quant;
    int busy;
    int FLY;
    int extended;
    int box;
    int priority;
    unsigned int quant_block;

} NEW_CYCLE_DATA;

typedef struct
{
	int box;
	long hiword;
	long loword;

} PACK;



typedef struct
{
	int adr;
	PACK pak[FIFO_LEN];

}FIFO;


typedef struct
{
    int index_data;         // òåêóùèé èíäåêñ ïðè çàãðóçêå äàííûìè
    int index_send;         // òåêóùèé èíäåêñ ïðè ïåðåäà÷å
    int flag_inter;         // ìû æäåì ñáðîñà â ïðåðûâàíèè
    unsigned int count_lost; // êîëè÷åñòâî ïîòåðü
    unsigned int count_load;       // çàãðóçêà ìàññèâà
    unsigned int count_free;       // ñâîáîäà ìàññèâà
    NEW_CYCLE_DATA cycle_data[NEW_CYCLE_FIFO_LEN];
    int cycle_box[UNIT_QUA];
    int lost_box[UNIT_QUA];


}NEW_CYCLE_FIFO;

//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////

#define USE_BOX	            1
#define NOT_USE_BOX	        0

#define CAN_BOX_TYPE_IN		1
#define CAN_BOX_TYPE_OUT	2


#define FREE_TYPE_BOX 		    0
#define UNITS_TYPE_BOX 		    1
#define MPU_TYPE_BOX 		    2
#define CANOPEN_TYPE_BOX 	    3
#define SMPU_TYPE_BOX 		    4
#define TERMINAL_TYPE_BOX       5
#define ALARM_LOG_TYPE_BOX       6

/////////////////////////////////////////////////////////////////////

#define CAN_BOX_PRIORITY_NORMAL     0
#define CAN_BOX_PRIORITY_LOW        -1
#define CAN_BOX_PRIORITY_HIGH       1

/////////////////////////////////////////////////////////////////////
#define CAN_BOX_EXTENDED_ADR    1
#define CAN_BOX_STANDART_ADR    0
/////////////////////////////////////////////////////////////////////
#define CAN_BOX_STAT_ON         1
#define CAN_BOX_STAT_OFF        0
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

typedef struct {
  long can_in_mbox_adr[16];
  long can_out_mbox_adr[16];
  int adr_box[16];
  int adr_in_mbox[16];

  int max_number;

} CANOPEN_CAN_SETUP;

/////////////////////////////////////////////////////////////////////
typedef struct {
  long can_mbox_adr[32];
//  long can_out_mbox_adr[16];
  int type_box[32];
  int local_number_box[32];
  int type_in_out_box[32];

  int max_number_in;
  int max_number_out;

} MAILBOXS_CAN_SETUP;

#define MAILBOXS_CAN_SETUP_DEFAULT { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
								{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
								{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
								{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},  \
								0, \
								0}


/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////


typedef struct {
  unsigned long can_base_adr;
  long can_in_mbox_adr[MAX_COUNT_UNITES_UKSS];
  long can_out_mbox_adr[MAX_COUNT_UNITES_UKSS];
  int adr_box[MAX_COUNT_UNITES_UKSS+1];
  int adr_in_mbox[MAX_COUNT_UNITES_UKSS+1];
  int adr_out_mbox[MAX_COUNT_UNITES_UKSS+1];

  int active_box[MAX_COUNT_UNITES_UKSS];
  int adr_detect_refresh[MAX_COUNT_UNITES_UKSS];
  int revers_box[MAX_COUNT_UNITES_UKSS];

  unsigned int CAN_count_cycle_input_units[MAX_COUNT_UNITES_UKSS];

  int max_number;

} UNITES_CAN_SETUP;

/////////////////////////////////////////////////////////////////////

typedef struct {
  unsigned long can_base_adr;
  long can_in_mbox_adr[MAX_COUNT_UNITES_MPU];
  long can_out_mbox_adr[MAX_COUNT_UNITES_MPU];
  int adr_box[MAX_COUNT_UNITES_MPU];

  int adr_in_mbox[MAX_COUNT_UNITES_MPU];
  int adr_out_mbox[MAX_COUNT_UNITES_MPU];

  int active_box[MAX_COUNT_UNITES_MPU];

  unsigned int CAN_count_cycle_input_units[MAX_COUNT_UNITES_MPU];


  int adr_detect_refresh[MAX_COUNT_UNITES_MPU];

  int max_number;

} MPU_CAN_SETUP;

/////////////////////////////////////////////////////////////////////

typedef struct {
  unsigned long can_base_adr;
  long can_in_mbox_adr[MAX_COUNT_UNITES_TERMINAL];
  long can_out_mbox_adr[MAX_COUNT_UNITES_TERMINAL];
  int adr_box[MAX_COUNT_UNITES_TERMINAL];

  int adr_in_mbox[MAX_COUNT_UNITES_TERMINAL];
  int adr_out_mbox[MAX_COUNT_UNITES_TERMINAL];

  int active_box[MAX_COUNT_UNITES_TERMINAL];

  unsigned int CAN_count_cycle_input_units[MAX_COUNT_UNITES_TERMINAL];

  int max_number;

} TERMINAL_CAN_SETUP;

////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

typedef struct {
  unsigned long can_base_adr;
  long can_in_mbox_adr[MAX_COUNT_UNITES_ALARM_LOG];
  long can_out_mbox_adr[MAX_COUNT_UNITES_ALARM_LOG];
  int adr_box[MAX_COUNT_UNITES_ALARM_LOG];

  int adr_in_mbox[MAX_COUNT_UNITES_ALARM_LOG];
  int adr_out_mbox[MAX_COUNT_UNITES_ALARM_LOG];

  int active_box[MAX_COUNT_UNITES_ALARM_LOG];

  unsigned int CAN_count_cycle_input_units[MAX_COUNT_UNITES_ALARM_LOG];

  int max_number;

} ALARM_LOG_CAN_SETUP;

////////////////////////////////////////////////////////////////////////////////
#define _UNITS_DEFAULT_ZERO             {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
#define _UNITS_DEFAULT_MINUS_ONE        {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}

#define UNITES_CAN_SETUP_DEFAULT  { START_CAN_ADR_UNITS_DEFAULT, _UNITS_DEFAULT_ZERO,  \
                                _UNITS_DEFAULT_ZERO,  \
                                _UNITS_DEFAULT_MINUS_ONE, \
                                _UNITS_DEFAULT_MINUS_ONE, \
                                _UNITS_DEFAULT_MINUS_ONE, \
								{USE_UKSS_0,USE_UKSS_1,USE_UKSS_2,USE_UKSS_3,USE_UKSS_4,USE_UKSS_5, \
								USE_UKSS_6,USE_UKSS_7,USE_UKSS_8,USE_UKSS_9,USE_UKSS_10, \
								USE_UKSS_11,USE_UKSS_12,USE_UKSS_13,USE_UKSS_14,USE_UKSS_15},  \
								_UNITS_DEFAULT_ZERO, \
								{USE_R_B_0,USE_R_B_1,USE_R_B_2,USE_R_B_3,USE_R_B_4,USE_R_B_5,USE_R_B_6,USE_R_B_7,USE_R_B_8, \
								 USE_R_B_9,USE_R_B_10,USE_R_B_11,USE_R_B_12,USE_R_B_13,USE_R_B_14,USE_R_B_15}, \
								 _UNITS_DEFAULT_ZERO,  \
								0}

/////////////////////////////////////////////////////////////////////

#define _MPU_DEFAULT_ZERO             {0,0,0,0}
#define _MPU_DEFAULT_MINUS_ONE        {-1,-1,-1,-1}

#define  MPU_CAN_SETUP_DEFAULT  { CAN_ADR_MPU_DEFAULT, _MPU_DEFAULT_ZERO,  \
                                _MPU_DEFAULT_ZERO,  \
                                _MPU_DEFAULT_MINUS_ONE, \
                                _MPU_DEFAULT_MINUS_ONE, \
                                _MPU_DEFAULT_MINUS_ONE, \
								{USE_MPU_0,USE_MPU_1,USE_MPU_2,USE_MPU_3},  \
								_MPU_DEFAULT_ZERO,  \
								_MPU_DEFAULT_ZERO,  \
								0}

//-------------------------------------------------------------------------------//

#define _TERMINAL_DEFAULT_ZERO             {0,0,0,0}
#define _TERMINAL_DEFAULT_MINUS_ONE        {-1,-1,-1,-1}

#define  TERMINAL_CAN_SETUP_DEFAULT  {CAN_ADR_TERMINAL_DEFAULT, _TERMINAL_DEFAULT_ZERO,  \
                                _TERMINAL_DEFAULT_ZERO,  \
                                _TERMINAL_DEFAULT_MINUS_ONE, \
                                _TERMINAL_DEFAULT_MINUS_ONE, \
                                _TERMINAL_DEFAULT_MINUS_ONE, \
                                {USE_TERMINAL_1_OSCIL,USE_TERMINAL_1_CMD,USE_TERMINAL_2_OSCIL,USE_TERMINAL_2_CMD},  \
                                _TERMINAL_DEFAULT_ZERO,  \
                                0}
//-------------------------------------------------------------------------------//
#define _ALARM_LOG_DEFAULT_ZERO             {0,0}
#define _ALARM_LOG_DEFAULT_MINUS_ONE        {-1,-1}

#define  ALARM_LOG_CAN_SETUP_DEFAULT  {CAN_ADR_ALARM_LOG_DEFAULT, _ALARM_LOG_DEFAULT_ZERO,  \
                                _ALARM_LOG_DEFAULT_ZERO,  \
                                _ALARM_LOG_DEFAULT_MINUS_ONE, \
                                _ALARM_LOG_DEFAULT_MINUS_ONE, \
                                _ALARM_LOG_DEFAULT_MINUS_ONE, \
                                {USE_ALARM_LOG_0,USE_ALARM_LOG_1},  \
                                _ALARM_LOG_DEFAULT_ZERO,  \
                                0}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

typedef struct {
    WORD_INT2BITS_STRUCT  buf[TERMINAL_UNIT_LEN];
} TERMINAL_UNITES_STRUCT;
////
typedef TERMINAL_UNITES_STRUCT *TERMINAL_UNITES_STRUCT_handle;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


extern int TerminalUnites[TERMINAL_UNIT_QUA_UNITS][TERMINAL_UNIT_LEN];

extern int Unites[UNIT_QUA_UNITS][UNIT_LEN];


////////////////////////////////////////////////////////////////////////////////
extern CYCLE cycle[];	//	26.01.2011 Dimas


extern NEW_CYCLE_FIFO new_cycle_fifo;

extern int CanOpenUnites[CANOPENUNIT_LEN];

//add yura
extern MAILBOXS_CAN_SETUP mailboxs_can_setup;

extern FIFO fifo;

extern int CAN_timeout[];
extern int CAN_request_sent[];
extern unsigned int CAN_timeout_cicle[];


//////////////////////////////////////////////////
//////////////////////////////////////////////////
int init_units_can_boxs(UNITES_CAN_SETUP *p);
int init_canopen_can_boxs(CANOPEN_CAN_SETUP *p);
int init_mpu_can_boxs(MPU_CAN_SETUP *p );
int init_terminal_can_boxs(TERMINAL_CAN_SETUP *p );
int init_alarm_log_can_boxs(ALARM_LOG_CAN_SETUP *p );
//////////////////////////////////////////////////

void init_mailboxs_can( UNITES_CAN_SETUP    *p_units,
                        MPU_CAN_SETUP       *p_mpu,
                        TERMINAL_CAN_SETUP  *p_terminal,
                        ALARM_LOG_CAN_SETUP *p_alarm_log,
                        CANOPEN_CAN_SETUP   *p_canopen,
                        MAILBOXS_CAN_SETUP  *p_mailboxs
                        );


void init_all_mailboxs(unsigned long can_base_adr_units, unsigned long can_base_adr_mpu, unsigned long can_base_adr_alarm_log, unsigned long can_base_adr_terminal);




void InitCan(unsigned long can_base_adr_units, unsigned long can_base_adr_mpu, unsigned long can_base_adr_alarm_log, unsigned long can_base_adr_terminal);


//void CAN_send(int box, unsigned long hiword, unsigned long loword);
//void CAN_word_send(int type_box, int box, int Addr, int Data);
//void CAN_array_send(int type_box, int box, int Addr, int * Data);

void CAN_cycle_send(int type_box, int box, unsigned long Addr, int * Data, unsigned long quant, int extended, int priority);

//void FIFO_send(int box, unsigned long hiword, unsigned long loword);

//int CAN_FLY_free(int box);
//int CAN_FIFO_free(unsigned int quant);

int CAN_cycle_free(int box);
int CAN_cycle_full_free(int box, int statistics_flag);

//void CAN_cycle_stop(int box);


//void CAN_cycle_step(int box);


void CAN_request(unsigned int addr, unsigned int quant);
void CAN_assign(unsigned int addr, unsigned int quant);


void reset_CAN_timeout_cicle(int box);
void inc_CAN_timeout_cicle();

unsigned int test_can_live_mpu(void);
unsigned int test_can_live_terminal(int n);
void InitCanSoft(void);

void timer_pause_enable_can_from_mpu(void);
void timer_pause_enable_can_from_terminal(void);
void read_manch_can(void);
void write_manch_can(void);
void detect_time_refresh_units(int box, int adr);
void detect_time_refresh_mpu(int box, int adr);



void parse_data_from_mbox(unsigned int box, unsigned long hiword,
                                            unsigned long loword);


int get_real_out_mbox(int type_box, int box);
int get_real_in_mbox(int type_box, int box);



void messagePaserToUnitesIngitim(int box, unsigned long h_word, unsigned long l_word);




//////////////////
void new_fifo_calc_load(void);
int new_fifo_load(int box,unsigned long hiword, unsigned long loword);

int new_cycle_fifo_load(int box, unsigned long adr, int * adr_from,  unsigned long addr_to, unsigned long quant, int extended, int priority, int cmd_wait);

int get_new_cycle_fifo_load_level(void);


void CAN_send2(int box,unsigned long hiword, unsigned long loword);
int CAN_cycle_fifo_step(void);
int CAN_cycle_fifo_one_box(void);

//////////////////
int CAN_may_be_send_cycle_fifo(void);

void stop_can_interrupt(void);
void start_can_interrupt(void);


//// Prototype statements for functions found within this file.
interrupt void CAN_handler(void);
interrupt void CAN_reset_err(void);



extern UNITES_CAN_SETUP unites_can_setup;
extern MPU_CAN_SETUP mpu_can_setup;


extern unsigned int CanTimeOutErrorTR;
extern unsigned int CanBusOffError;

#endif	// _CAN_SETUP