/****************************************************************/
/*			    	  		TMS320C32							*/
/* 	======             BIOS, КЛАИН, КЛВСП              ====== 	*/
/* 	 		   		ЦНИИ СЭТ	  (с) 1998-2000 г.				*/
/****************************************************************
     RS485.h
 ****************************************************************
 *				 	Процедуры работы с UART		 				*
 ****************************************************************/
#ifndef _RS485
#define _RS485

#ifdef __cplusplus
  extern "C" {  
#endif
    
//#include "DSP2833x_Device.h"     // DSP281x Headerfile Include File
//#include "DSP2833x_Sci.h"
//#include "cntrl_adr.h"
//#include "params.h"

#define COM_1 1
#define COM_2 2

#define MAX_RECEIVE_LENGTH 400 //	80 //150
#define MAX_SEND_LENGTH	400 //150

#define TIME_WAIT_RS_BYTE_OUT 1000	 
#define TIME_WAIT_RS_LOST_BYTE 100
#define RS_TIME_OUT (SECOND*10)

#define Rec_Bloc_Begin	0x200000
#define Rec_Bloc_End	0x2F0000
#define Rec_Bloc_Length	(Rec_Bloc_End-Rec_Bloc_Begin)

/* Message RS declaration											*/
typedef struct
{
	volatile struct SCI_REGS *SciRegs;

    unsigned int	commnumber;						// Номер порта
	unsigned long	RS_Length;						// Длина пакета

	unsigned int	*pRS_RecvPtr;					// Буфер приема
	unsigned int	*pRS_SendPtr;					// Буфер посылки
	unsigned int	*pRecvPtr;  

	unsigned int	RS_PrevCmd;						// Предыдущаа комманда
	unsigned int	RS_Cmd;							// Текущаа комманда
	unsigned int	RS_Header[MAX_RECEIVE_LENGTH];	// Заголовок
    unsigned int	flag_TIMEOUT_to_Send;			// Флаг ожиданиа таймаута на отсылку
	unsigned int	flag_TIMEOUT_to_Receive;		// Флаг ожиданиа таймаута на прием
	unsigned int	RS_DataReady;					// Флаг готовности RS данных
	unsigned int	buffer[MAX_SEND_LENGTH];		// Буфер дла отсылки по RS

	unsigned int	addr_answer;					// адрес куда отвечать в режиме ведущего
	unsigned int	addr_recive;					// адрес по которому нас запросили
	unsigned int	flag_LEADING;					// Флаг режима контроллера (по умолчанию ведомый)
	unsigned long	RS_RecvLen; 
	unsigned long	RS_SLength;						// Длина пакета дла посылки
	unsigned long	RS_SendLen;						// Количество байт уже передали
	char			RS_SendBlockMode;				// Режим передачи
	char			RS_Flag9bit;					// дла RS485????????
	int 			BS_LoadOK;						// Флаг успешности приема блока
	int 			RS_FlagBegin;
	int 			RS_HeaderCnt;
	int 			RS_FlagSkiping;
	unsigned long 	curr_baud;
	unsigned long 	time_wait_rs_out;

} RS_DATA; 

extern RS_DATA rs_a,rs_b;

extern unsigned int
	RS_Len[70]; 		/* Действительнаа длина команды (отладочной) + 1 */

interrupt void RSA_RX_Handler(void);
interrupt void RSA_TX_Handler(void);
interrupt void RSB_RX_Handler(void);
interrupt void RSB_TX_Handler(void);

/* иницилизациа переменных rs_a,rs_b*/
void create_uart_vars(char size_cmd15);

/** Повторнаа инициализациа последовательного порта, используетса после подвиса */
/** Настройка режима приема/передачи */                                 
void RS_SetBitMode(RS_DATA *rs_arr, int n);

/** Посылка блока байтов. 
 Посылает массива 32-битных целых чисел старшие биты должны быть 0.
 @precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
 @param buf адрес массива
 @param len количество байт 
 @see RS_BSend, RS_TRANSMIT_INTR
*/
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);

/** Посылка блока упакованных байтов.
 @precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
 @param buf адрес массива
 @param len количество 8-битных байт 
 @see RS_Send, RS_TRANSMIT_INTR
 */
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);
                
/** Инициализациа последовательного порта */
void setup_uart(char commnumber,unsigned long speed_baud);  /* speed_baud - скорость линии в бодах */

void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop);
void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed);

// Transmit a character from the SCI'
#define SCI_send(x,y)	x->SciRegs->SCITXBUF=(unsigned char)(y)

// Ожидание завершениа передачи UART
// wait for TRDY =1 for empty state
#define RS_Wait4OK(x)	while(!(x->SciRegs->SCICTL2.bit.TXEMPTY))

/** Переключение линии на прием */
#define RS_Line_to_receive(x)	if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;

/** Переключение линии на передачу */
#define RS_Line_to_send(x)		if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0;

/** Разрешение прерываний по получению символа и ошибкам от UART	*/
#define enableUARTInt(x)	x->SciRegs->SCICTL2.all=2
#define enableUARTIntW(x)	x->SciRegs->SCICTL2.all=1

void clear_timer_rs_live(RS_DATA *rs_arr);
void test_rs_live(RS_DATA *rs_arr);

#ifdef __cplusplus
  }
#endif

#endif /* _RS485 */

