/*
 * @Description: 
 * @Author: yangsw
 * @Date: 2022-06-24 16:54:32
 * @LastEditTime: 2022-08-19 14:51:26
 * @LastEditors: 002389 yangsw@lierda.com
 * @Reference: 
 */
#include "svc_pulse_uart.h"
#include "../../log/svc/svc_log.h"
#include "../../com/svc/svc_com.h"
#include "svc_pulse_protocol.h"
#include "../../util/util_data.h"
#include "../../lcd/svc/svc_lcd.h"
#include "../../flash/svc/svc_flash.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../rtc/svc/svc_rtc.h"
#include "../../pulse/svc/svc_pulse_protocol.h"
#include "../../pulse/svc/svc_pulse_uart.h"

static S_Pulse_Uart s_pulse_uart;

static void Pulse_Uart_Quene_Init(void);

/**
 * @brief: 计量串口初始化
 * @param  {gw_u16}u16Baudrate 串口通信波特率
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Pulse_Uart_Init(gw_u16 u16Baudrate)
{
  Bsp_Pulse_Uart_Init(u16Baudrate);
  Pulse_Uart_Quene_Init();
}
/**
 * @brief: 将一字节数据放入接收队列
 * @return {char} 1：队列已满，0：队列未满
 * @note: 
 * @see: 
 * @param {char} data 待放入数据
 */
char Svc_Pluse_Uart_Put_Data_Quene(char data)
{
  s_pulse_uart.time_cnt=0;      //队列计数清零
  s_pulse_uart.time_en=1;
  if(((s_pulse_uart.fornt+1)%PULSE_UART_RX_BUF_SIZE)==s_pulse_uart.rear)      //串口队列缓冲区满
  {
    s_pulse_uart.format=1;
    return 1;
  }
  s_pulse_uart.RX_BUF[s_pulse_uart.fornt]=data;
  s_pulse_uart.fornt=(s_pulse_uart.fornt+1)%PULSE_UART_RX_BUF_SIZE;
  return 0;
}

/**
 * @brief: 从队列中取出一字节数据
 * @param  {char*} data 取出的数据
 * @return {char} 1：队列为空，0：正常
 * @note: 
 * @see: 
 */
char Svc_Pulse_Uart_Out_data_Quene(char* data)
{
  if(s_pulse_uart.rear==s_pulse_uart.fornt)
  {
    //Svc_Log_Print("C\r\n");
    return 1;
  }
  *data=s_pulse_uart.RX_BUF[s_pulse_uart.rear];
  s_pulse_uart.rear=(s_pulse_uart.rear+1)%PULSE_UART_RX_BUF_SIZE;
  return 0;
}

/**
 * @brief: 串口接收队列初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
static void Pulse_Uart_Quene_Init(void)
{
  s_pulse_uart.fornt=0;
  s_pulse_uart.rear=0;
  s_pulse_uart.time_cnt=0;
  s_pulse_uart.format=0;
  memset(s_pulse_uart.RX_BUF,0,sizeof(s_pulse_uart.RX_BUF));
}

/**
 * @brief: 获取队列中数据长度
 * @param  {void}
 * @return {short} 队列中数据长度
 * @note: 
 * @see: 
 */
static short Get_Buf_Length(void)
{
  if(s_pulse_uart.fornt>=s_pulse_uart.rear)
  {
    return s_pulse_uart.fornt-s_pulse_uart.rear;
  }
  else
  {
    return s_pulse_uart.fornt+PULSE_UART_RX_BUF_SIZE-s_pulse_uart.rear;
  }
}

/**
 * @brief: 从队列中获取指定字节数的数据
 * @return {short} 实际获取字节数
 * @note: 
 * @see: 
 * @param {char} *data 存放获取数据的指针
 * @param {short} buf_len 想要获取的数据长度
 */
short Get_Pulse_Uart_Bytes(char *data,short buf_len)
{
  short data_len=0;
  short i=0;
  char* ptr=data;
  data_len=Get_Buf_Length();
  s_pulse_uart.time_cnt=0;
  s_pulse_uart.format=0;
  s_pulse_uart.time_en=0;

  if(data_len==0)
  {
    return 0;
  }
  for(i=0;i<data_len&&i<buf_len;i++)
  {
    Svc_Pulse_Uart_Out_data_Quene(ptr);
    ptr++;
  }

   return i;
}

/**
 * @brief: 自动断帧检测
 * @param  {void}
 * @return {void}
 * @note: 隔1ms检查串口是否有数据
 * @see: 
 */
void Svc_Pulse_get_Cnt_Add(void)         //隔1ms检查串口是否有数据
{
  if(s_pulse_uart.time_en==1)           //串口有数据
  {
    s_pulse_uart.time_cnt++;
    if(s_pulse_uart.time_cnt>PULSE_UART_CNT_MAX)         //接收自动断帧
    {
      s_pulse_uart.time_cnt=0;
      s_pulse_uart.format++;
      s_pulse_uart.time_en=0;
    }
  }
}

/**
 * @brief: 判断一帧数据是否接收完成
 * @param  {void}
 * @return {char} 1：一帧数据收完，0：一帧数据未收完
 * @note: 
 * @see: 
 */
char Pulse_Is_Format(void)
{
  return s_pulse_uart.format;
}

/**
 * @brief: 模块是否忙
 * @param  {void}
 * @return {E_Result_Check} E_CHECK_OK:正忙，E_CHECK_FAIL:空闲
 * @note:
 * @see:
 */
E_Result_Check Svc_Pulse_Lpuart_Is_Busy(void)
{
  /*计量串口有数据正在接收或者有数据待处理时，返回忙*/
  if ((s_pulse_uart.time_en == 1) || (s_pulse_uart.format > 0))
  {
    return E_CHECK_OK;
  }
  return E_CHECK_FAIL;
}

/**
 * @brief: 串口接收处理
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Pulse_Uart_Recv(void){
  if(Pulse_Is_Format()>=1){
    gw_u16 recv_len=0;
    gw_u16 buf_len;
    s_pulse_uart.temp_buf=Svc_Com_Get_Buf();

    buf_len=PULSE_UART_RX_BUF_SIZE;
    
    recv_len=Get_Pulse_Uart_Bytes((char*)s_pulse_uart.temp_buf,buf_len);
    if(recv_len<PULSE_UART_RX_BUF_SIZE){
      s_pulse_uart.temp_buf[recv_len]='\0';
//      printf("Pulse Recv: ");
//      for(gw_u8 i=0; i<=recv_len; i++)
//      {
//        printf("%x ",s_pulse_uart.temp_buf[i]);
//      }
//      printf("\n");
      Svc_Pulse_Protocol_Parse(s_pulse_uart.temp_buf,recv_len);
    }else{
      Svc_Log_Printf(LOG_WARNING,"PULSE recv len too long!\r\n");
    }
  }
}  