/*
 * @Description: NB模块-svc层-串口子模块
 * @Author: yangsw
 * @Date: 2021-06-04 14:05:58
 * @LastEditTime: 2023-05-31 16:08:52
 * @LastEditors: Lida
 * @Reference: 
 */

#include "svc_nb_uart.h"
#include "svc_nb_core.h"
#include "../../log/svc/svc_log.h"
#include "../../com/svc/svc_com.h"

static S_Nb_Uart s_nb_uart;

 S_Nb_Uart s_nb_uart;
/**
 * @brief: NB串口初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Nb_Uart_Init(void)
{
    Bsp_Nb_Uart_Init();
    Nb_Uart_Quene_Init();
}

/**
 * @brief: NB串口初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Nb_Wake_Init(void)
{
    Bsp_Nb_Uart_Init();
}
/**
 * @brief: 将一字节数据放入接收队列
 * @return {char} 1：队列已满，0：队列未满
 * @note: 
 * @see: 
 * @param {char} data 待放入数据
 */
char Svc_Nb_Uart_Put_Data_Quene(char data)
{
    s_nb_uart.time_cnt=0;      //队列计数清零
    s_nb_uart.time_en=1;
    if(((s_nb_uart.fornt+1)%NB_UART_RX_BUF_SIZE)==s_nb_uart.rear)      //串口队列缓冲区满
    {
      //Svc_Log_Print("F\r\n");
      s_nb_uart.format=1;
      return 1;
    }
    s_nb_uart.RX_BUF[s_nb_uart.fornt]=data;
    s_nb_uart.fornt=(s_nb_uart.fornt+1)%NB_UART_RX_BUF_SIZE;
    return 0;
}

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

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

/**
 * @brief: 获取队列中数据长度
 * @param  {void}
 * @return {short} 队列中数据长度
 * @note: 
 * @see: 
 */
static short Get_Buf_Length(void)
{
  // Svc_Log_Print("gprs_quene->fornt=%d\r\n",gprs_quene->fornt);
 // Svc_Log_Print("gprs_quene->rear=%d\r\n",gprs_quene->rear);
  if(s_nb_uart.fornt>=s_nb_uart.rear)
  {
    return s_nb_uart.fornt-s_nb_uart.rear;
  }
  else
  {
    return s_nb_uart.fornt+NB_UART_RX_BUF_SIZE-s_nb_uart.rear;
  }
}

/**
 * @brief: 从队列中获取指定字节数的数据
 * @return {short} 实际获取字节数
 * @note: 
 * @see: 
 * @param {char} *data 存放获取数据的指针
 * @param {short} buf_len 想要获取的数据长度
 */
short Get_Nb_Uart_Bytes(char *data,short buf_len)
{
  short data_len=0;
  short i=0;
  char* ptr=data;
  data_len=Get_Buf_Length();
  s_nb_uart.time_cnt=0;
  s_nb_uart.format=0;
  s_nb_uart.time_en=0;
//  Svc_Log_Print("gprs_buf.fornt=%d\r\n",gprs_buf.fornt);
//  Svc_Log_Print("gprs_buf.rear=%d\r\n",gprs_buf.rear);
//  Svc_Log_Print("data_len=%d\r\n",data_len);

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

   return i;
}

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

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


/**
 * @brief: 串口接收处理
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Nb_Uart_Recv(void){
  if(Nb_Is_Format()>=1){
    gw_u16 recv_len=0;
    gw_u16 buf_len;
    s_nb_uart.temp_buf=Svc_Com_Get_Buf();
    // s_nb_uart.temp_buf=(gw_u8 *)malloc(NB_UART_RX_BUF_SIZE);
    if(s_nb_uart.temp_buf==NULL){
        Svc_Log_Printf(LOG_ERROR,"%s->malloc fail!",__FUNCTION__);
        return ;
    }
    buf_len=NB_UART_RX_BUF_SIZE;
    memset(s_nb_uart.temp_buf,0,buf_len);
    recv_len=Get_Nb_Uart_Bytes((char*)s_nb_uart.temp_buf,buf_len);
    // if(strstr(s_nb_uart.temp_buf,"+ECSTATUS: PHY")){
    //     Svc_Log_Printf(LOG_WARNING,"NB recv +ECSTATUS: PHY !\r\n");
    // }
    //Svc_Log_Printf(LOG_INFO,"NB recv len:%d\r\n",recv_len);
    if(recv_len<NB_UART_RX_BUF_SIZE){
      s_nb_uart.temp_buf[recv_len]='\0'; //这句会破坏收的数据
      // Svc_Log_Printf(LOG_INFO,"NB recv:%s\r\n",s_nb_uart.temp_buf);(有bug)
      #if LOG_FUNC_ENABLE
          Svc_Log_Print("NB recv:%s\r\n",s_nb_uart.temp_buf);
      #endif
      Svc_Nb_Recv_Parse(s_nb_uart.temp_buf,recv_len);
    }else{
      Svc_Log_Printf(LOG_WARNING,"NB recv len too long!\r\n");
    }
    // if(s_nb_uart.temp_buf!=NULL){
    //     free(s_nb_uart.temp_buf);
    //     s_nb_uart.temp_buf=NULL;
    // }
  }
}