/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app source file
 * Author(s)   : Dan
 * version     : V1.0
 * Modify date : 2022-07-10
 ***********************************************************************/
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "uart1.h"
#include  "uart2.h"

uint32_t g_data_buf[512];

#ifdef UART0_COMM
uint8_t uart0_rx_flag = 0;
uint8_t uart0_rx_buf[64];
uint8_t uart0_rx_count = 0;
#endif

#ifdef UART1_COMM
uint8_t uart1_rx_flag = 0;
uint8_t uart1_rx_buf[64];
uint8_t uart1_rx_count = 0;
#endif

#ifdef UART2_COMM
uint8_t uart2_rx_flag = 0;
uint8_t uart2_rx_buf[64];
uint8_t uart2_rx_count = 0;
#endif

#ifdef UART0_COMM
/************************************************************************
 * function   : uart0_rec_pro
 * Description: uart0 rec pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart0_rec_pro(void)
{
	uart0_rx_buf[uart0_rx_count] = uart0_recv_byte();
	uart0_rx_count++;
	uart0_rx_flag = 1;	
}
#endif

#ifdef UART1_COMM
/************************************************************************
 * function   : uart1_rec_pro
 * description: uart1 rec pro 串口接收处理回调函数
 * input 	  : none
 * return	  : none
 ************************************************************************/
void uart1_rec_pro(void)
{
	uart1_rx_buf[uart1_rx_count] = uart1_recv_byte();
	uart1_rx_count++;
	uart1_rx_flag = 1;	
}
#endif

#ifdef UART2_COMM
/************************************************************************
 * function   : uart1_rec_pro
 * Description: uart1 rec pro 串口接收处理回调函数
 * input : none
 * return: none
 ************************************************************************/
void uart2_rec_pro(void)
{
	uart2_rx_buf[uart2_rx_count] = uart2_recv_byte();
	uart2_rx_count++;
	uart2_rx_flag = 1;	
}
#endif
/************************************************************************
 * function   : uart_init
 * description: uart_init 串口初始化
 * input 	  : none
 * return	  : none
 ************************************************************************/
void uart_init(void)
{
#ifdef  UART0_COMM     
	uart0_rx_flag = 0;
	uart0_init(PCLK, UART0_BAUD_RATE);
	uart0_irq_init(UART0_IRQ_ENABLE, uart0_rec_pro);
#endif

#ifdef  UART1_COMM	
	uart1_rx_flag = 0;	
	uart1_init(PCLK, UART1_BAUD_RATE);
	uart1_irq_init(UART1_IRQ_ENABLE, uart1_rec_pro);
#endif

#ifdef  UART2_COMM    
    uart2_rx_flag = 0;	
	uart2_init(PCLK, UART2_BAUD_RATE);
	uart2_irq_init(UART2_IRQ_ENABLE, uart2_rec_pro);
#endif
}

/************************************************************************
 * function   : uart_test
 * description: uart_test
 * input 	  : none
 * return	  : none
 ************************************************************************/
void uart_test(void)
{
	printfS("System run at %dHz\r\n", SystemCoreClock);
	printfS("start test uart! \n");
	printfS("waiting for output data.....! \n");

	
	while(1)
	{

#if defined UART0_COMM	                                                                //be defined in config.h
		if(uart0_rx_flag)
		{
																					    //一帧数据接收
			delay_ms(200);	 														    //等一帧数据收完（实际应用中请根据自己的通信协议进行一帧数据的接收）
			memcpy(rcv_buff, (uint8_t *)uart0_rx_buf, uart0_rx_count);		
			memcpy(send_buff, rcv_buff, uart0_rx_count);								//数据处理
					
			uart0_send_bytes((uint8_t *)send_buff, uart0_rx_count);						//数据回发		
			uart0_rx_count = 0;
			uart0_rx_flag = 0;
		}
#elif defined UART1_COMM  																//be defined in config.h
		if(uart1_rx_flag)
		{
																						//一帧数据接收
            delay_ms(200);															    //delay方式等一帧数据收完（实际应用中请根据自己的通信协议进行一帧数据的接收）
            memcpy(rcv_buff, (uint8_t *)uart1_rx_buf, uart1_rx_count);																
            memcpy(send_buff, rcv_buff, uart1_rx_count);	                            //数据处理		

            uart1_send_bytes((uint8_t *)send_buff, uart1_rx_count);		       			//数据回发		
            uart1_rx_count = 0;
            uart1_rx_flag = 0;
		}	
#else
		if(uart2_rx_flag)
		{
																						//一帧数据接收
			delay_ms(200);	 															//等一帧数据收完（实际应用中请根据自己的通信协议进行一帧数据的接收）
			memcpy(rcv_buff, (uint8_t *)uart2_rx_buf, uart2_rx_count);	
			memcpy(send_buff, rcv_buff, uart2_rx_count);								//数据处理	
		
			uart2_send_bytes((uint8_t *)send_buff, uart2_rx_count);						//数据回发		
			uart2_rx_count = 0;
			uart2_rx_flag = 0;
		}		
#endif
	
	}    
}

/************************************************************************
 * function   : soc_test
 * description: soc_test
 * input 	  : none
 * return	  : none
 ************************************************************************/
void soc_test(void)
{
	
	uart_test(); 
 
}
