/******************************************************************************

                  MNPP SATURN (C), 2024, SNK

 ******************************************************************************
  Имя файла   : uart_5.c
  версия  : V1.0
  автор   :  SNK
  дата   : 14/04/2024
	функции для последовательного порта  RS485 в термостае TC 040 C11 U04
	подготовленно на основе примера DWIN
******************************************************************************/

#include "uart_5.h"
#include "modbus.h"

/********************************
*  прием ведется в буфер по по прерыванию
*  размер буфера задается в UART5_MAX_LEN в uart_5.h
********************************/

/****++++++++++++++++++++++++++++****************************/
//sbit DBG = P1^1; //РЕЛЕ #2 LOW (IO1) (используем для отладки)

u8 uart5_rx_count=0; //число принятых байт в буфере
u8 uart5_rx_RD_ptr=0; // указатель зачтнанных байт из буфера
u8 xdata Uart5_Rx[UART5_MAX_LEN];


/*****************************************************************************
инициализация порта  : void UART5_Init(void)
*****************************************************************************/
void UART5_Init(void)
{
		P0MDOUT |= 0x02;//конфигурируем P0.1 на выход (ножка управления драйвером RS485)
    SCON3T=0x80;
    SCON3R=0x80;
		BODE3_DIV_H=0x00;     //Установка делителя для скорости 115200
    BODE3_DIV_L=0xE0;			//
    //ES3T=1;							//Управляющий бит разрешения прерывания приема UART5
    ES3R=1;							//Управляющий бит разрешения прерывания приема UART5
		RS485_TX_EN=0; 			//ножка управления драйвером RS485
    EA=1; 							//главный управляющий бит прерывания
}

/*****************************************************************************
: void UART5_Sendbyte(u8 dat)

*****************************************************************************/
void UART5_Sendbyte(u8 dat)
{
     SBUF3_TX = dat;    
     while((SCON3T&0x01)==0); 
     SCON3T &=0xFE;    
}

/*****************************************************************************
 : void UART5_SendStr(u8 *pstr,u8 strlen)

*****************************************************************************/
void write(u8 *pstr,u8 strlen)
{
    if((NULL == pstr)||(0 == strlen))
    {
        return;
    }
	RS485_TX_EN=1;
    while(strlen--)
    {
        UART5_Sendbyte(*pstr);
        pstr++;
    }
	RS485_TX_EN=0;
}

/*****************************************************************************/
s8 read_block( u8 *pstr, u8 len , u16 TimeOutMS)
{
		u8 N;
	//	u16 TO;
		N=len; //Устанавливем сколько надо считать байт из буфера
		delay_tick=TimeOutMS; //Устанавливаем тайм аут приема UART5 (каждую mSec > уменьшается на 1 в прерываниях)
	//	delay_tick=7;
	//  TO=delay_tick;
	
		while(delay_tick) 
		{ 
				//ждем према пока не кончилось время
				if ((uart5_rx_count-uart5_rx_RD_ptr) >=len)
				{ //ждем пока не накопится нужное колличество данных
						while (N--) 
						{ 
								//считаем кол-во считанных байт
								*pstr=Uart5_Rx[uart5_rx_RD_ptr]; //копируем N данных из буфера приема UART5 в указанный массив данных pstr
								pstr++;
								uart5_rx_RD_ptr++;
						}
						return  1; //успешно читнали сколко надо байт
				}
		/*		if (delay_tick != TO) 
				{
					DBG=1; 
					TO=delay_tick; 
					DBG=0; 
				} */
		}

		return 0 ; //не пришло N=len данных за установленне время.
}

/*****************************************************************************/
void UART5_TX_ISR_PC(void)    interrupt 12
{
}

/*****************************************************************************
прием байтов по прерываниям
*****************************************************************************/
void UART5_RX_ISR_PC(void)    interrupt 13
{
    u8 res=0; //
	
//DBG = 1;
    EA=0;
    if((SCON3R&0x01)==0x01)
    {
        res=SBUF3_RX;
        Uart5_Rx[uart5_rx_count]=res; 
				uart5_rx_count++;
        SCON3R&=0xFE;  

    }
    EA=1;
//DBG = 0;		
}
/*****************************************************************************
Очитска указателей буфера приема UART5
*****************************************************************************/
void purge( void) 
{
uart5_rx_count=0;
uart5_rx_RD_ptr=0;	
}   

