#ifndef _RS_FUNCTIONS_H
#define _RS_FUNCTIONS_H


#define MAX_RECEIVE_LENGTH		254
#define MAX_SEND_LENGTH			400 //266	//254

#define CMD_RS232_MODBUS_1			1
#define CMD_RS232_MODBUS_3			3
#define CMD_RS232_MODBUS_4			4
#define CMD_RS232_MODBUS_5			5
#define CMD_RS232_MODBUS_6			6
#define CMD_RS232_MODBUS_15			15
#define CMD_RS232_MODBUS_16			16

#define RS_TIME_OUT 6000
#define RS_TIME_OUT_MPU 6000//6000  // ожидание ответа от МПУ
#define RS_TIME_OUT_HMI 1000
#define RS_TIME_OUT_MAX 10000
#define RS_TIME_OUT_LOST 1000



typedef unsigned char CHAR;

// Message RS declaration
typedef struct {
	unsigned int    commnumber; // Номер порта
	unsigned long	RS_Length; // Длина пакета
	
	unsigned int	*pRS_RecvPtr; // Буфер приема
	unsigned int	*pRS_SendPtr; // Буфер посылки
    unsigned int    *pRS_SendPtr_stage1; // Буфер посылки
    unsigned int    *pRS_SendPtr_stage2; // Буфер посылки
	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    buffer_stage1[8]; // Буфер длЯ отсылки по RS
//    unsigned int    buffer_stage2[8]; // Буфер длЯ отсылки по 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; // Количество байт уже передали

    unsigned long   RS_SLength_stage1; // Длина пакета длЯ посылки
    unsigned long   RS_SLength_stage2; // Длина пакета длЯ посылки

	unsigned int	time_wait_rs_out;
	unsigned int	time_wait_rs_out_mpu;
    unsigned int    time_wait_rs_lost; // слишком большая пауза между байтами - есть потеря!!!


	char	RS_SendBlockMode;				/* Режим передачи */
    char    RS_SendBlockMode_stage1;               /* Режим передачи */
    char    RS_SendBlockMode_stage2;               /* Режим передачи */
	char	RS_Flag9bit;					/* длЯ RS485???????? */

	int		BS_LoadOK;/** Флаг успешности приема блока */
	int		RS_FlagBegin;
	int		RS_HeaderCnt;
	int		RS_FlagSkiping;

	int     RS_DataReadyAnswer; // флаг, что мы получили ответ на свой запрос, если мы мастер
    int     RS_DataReadyAnswerAnalyze; // флаг, что мы получили ответ на свой запрос, если мы мастер и обработали его

    int     RS_DataSended; // флаг, что мы отправили свой запрос, ждем ответ и мы мастер
    int     RS_DataWillSend; // флаг, что мы подготовили свой запрос и сейчас начнем его передавать и мы мастер

    int     RS_DataReadyRequest; // флаг, что мы получили запрос, если мы слейв
    int     RS_DataReadyFullUpdate; // флаг, что мы получили ответы и массив полностью обновился

    int     RS_OnTransmitedData ; // флаг что мы еще передаем запрошенные данные
    int     current_tx_stage;
    int     cmd_tx_stage;

    unsigned int count_recive_ok; // принято посылок с валидным crc,
    unsigned int count_recive_error_crc; // ошибок crc
    unsigned int count_recive_dirty;  // принято посылок до расчета crc, совпала только длина и код команды
    unsigned int count_recive_bad;  // принято посылок c неправильным форматом
    unsigned int count_recive_bytes_all; // принято всего байт
    unsigned int count_recive_bytes_skipped; // пропущено всего байт
    unsigned int count_recive_cmd_skipped; // пропущено всего посылок
    unsigned int count_recive_rxerror; // ошибки по прерыванию

    unsigned int do_resetup_rs; // выполнить пересброс порта при ошибках.

    int     RS_DataWillSend2; // флаг2, что мы подготовили свой запрос и сейчас начнем его передавать и мы мастер




	} RS_DATA_STRUCT;

#define RS_DATA_STRUCT_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}
//////////////////////////////////////////////////////////

#define TMS_TO_TERMINAL_TEST_ALL_STRUCT_DEFAULT {{0}, {0}, {0}, 0, 0, 0}

enum {
	CMD_RS232_LOAD = 51, CMD_RS232_UPLOAD, CMD_RS232_RUN, CMD_RS232_XFLASH, CMD_RS232_TFLASH,
	CMD_RS232_PEEK, CMD_RS232_POKE, CMD_RS232_INITLOAD, CMD_RS232_INIT,CMD_RS232_EXTEND,
	CMD_RS232_VECTOR = 61, CMD_RS232_IMPULSE, CMD_RS232_STD = 65, CMD_RS232_TEST_ALL, CMD_RS232_STD_ANS,
	CMD_RS232_LAST
	};

//enum {
//	false = 0, true
//	};

#define RS_LEN_CMD  CMD_RS232_LAST

//extern RS_DATA_STRUCT RS232_A, RS232_B;
extern RS_DATA_STRUCT rs_a,rs_b;

int RS_Send(RS_DATA_STRUCT *rs_arr,unsigned int *pBuf,unsigned long len);
void RS232_WorkingWith(unsigned int enable_rs_a, unsigned int enable_rs_b, unsigned int enable_int_timeout);
void RS232_TuneUp(unsigned long speed_baud_a, unsigned long speed_baud_b);
void inc_RS_timeout_cicle(void);
void resetup_rs_on_timeout_lost(int rsp);

void resetup_rs(RS_DATA_STRUCT *rs_arr);
void resetup_mpu_rs(RS_DATA_STRUCT *rs_arr);
int test_rs_live(RS_DATA_STRUCT *rs_arr);
void RS_SetControllerLeading(RS_DATA_STRUCT *RS232_Arr,int boool);
void RS_SetAdrAnswerController(RS_DATA_STRUCT *RS232_Arr,int  set_addr_answer);
void SetCntrlAddr (int cntrl_addr,int cntrl_addr_for_all);

extern float KmodTerm, freqTerm;
extern unsigned int RS_Len[RS_LEN_CMD];
extern int flag_special_mode_rs, disable_flag_special_mode_rs;

#endif
