#include "Barcode_Scanner.h"
#include "string.h"

#define UART_RX_MAX_DEPTH (1024UL)    // 4K

typedef struct
{
    uint32_t read_pos;
    uint32_t write_pos;
    uint8_t  Rx_Buffer [ UART_RX_MAX_DEPTH ];
} UARTRxBuf_t;

static UARTRxBuf_t      UARTRxBuf;
static uint8_t  mDataBufPtr[256]   = {0};
static uint16_t mDataBufLen   = 0;
uint8_t  BarCode[50] = {0};
uint32_t readNum = 0;

static uint32_t Protocol_UartRead(uint8_t *pData, uint32_t len);
uint8_t nowdata[4];
uint8_t lastdata[4];
uint8_t checkresult;
uint8_t sendmsg[8];
uint8_t timenum = 0;
void datacheck(void)
{
    // if(mDataBufPtr[0] == 0x59 && mDataBufPtr [1] == 0x44)
    // {
    //     sendnum++;
    //     for(int i = 0;i < 4; i++)
    //     {
    //         if(lastdata[i] != mDataBufPtr[i+4])
    //         {
    //             checkresult = 1;
    //             break;
    //         }
    //         else
    //         {
    //             checkresult = 0;
    //         }
    //     }
        // for(int j = 0;j<1000;j++)
        // {
        //     for(int k;k<1000;k++)
        //     {
                sendnum++;
                if(timenum <101)
                {
                    timenum++;
                     
                }
                // RS485_TX_finish = 0;
                RS485_TX_finish = 0;
                

        //     }
        // }
    
    
    //     if(mDataBufPtr[9] == 0x4B && mDataBufPtr [10] == 0x4A)
    //     {
            if(RS485_TX_finish == 0)
            {
                // LINE_OUT_NEG_09 = 1;
            }
            else
            {
                RS485_TX_finish = 0;
                // LINE_OUT_NEG_09 = 1;
            }
            RS485_TX_finish = 0;
            

    //     }
        
        
    // }
    
}

void UART_Put(uint32_t Value)
{
    uint32_t nextPos = 0u;
    
    nextPos = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;

    if ( nextPos == UARTRxBuf.read_pos )
    {
        //队列已满，无法插入队列
        // UARTRxBuf.write_pos  = 0;
        // RS485_TX_finish = 0;
    }
    else
    {
        UARTRxBuf.Rx_Buffer [ UARTRxBuf.write_pos ] = Value;
        UARTRxBuf.write_pos                         = (UARTRxBuf.write_pos + 1) % UART_RX_MAX_DEPTH;
    }
    // RS485_TX_finish = 0;
    // LINE_OUT_NEG_09 = 1;
    // RS485_TX_finish = 0;
    return;
}

void Recv_Byte(void)
{
    int      i = 0;
    int      j = 0;
    int      len;

    readNum = Protocol_UartRead(mDataBufPtr + mDataBufLen, 256 - mDataBufLen);
    if ( readNum > 0 )
    {
        mDataBufLen += readNum;

        while(mDataBufLen)
        {
            for(i = 0; i < mDataBufLen; i++)
            {
                if(mDataBufPtr[i] == 0x0D)
                {
                    if( i < 1)
                    {
                        break;
                    }
                    memset(BarCode, 0, sizeof(BarCode));
                    for(j = 0; j < i; j++)
                    {
                        BarCode[j] = mDataBufPtr[j];
                    }
                    break;
                }
            }

            // 解析协议
            len = i+1;
            if ( (len > 0) && (len < mDataBufLen) )
            {
                // 将未解析的数据移到头部
                // Move unparsed data to the head
                
                memcpy(mDataBufPtr, mDataBufPtr + len, mDataBufLen - len);
                // memcpy(nowdata,mDataBufPtr + len,len);
                // datacheck();
            }
            datacheck();
            mDataBufLen -= len;
        }
    }
    return;
}

static uint32_t Protocol_UartRead(uint8_t *pData, uint32_t len)
{
    uint32_t i       = 0;
    uint32_t DataLen = 0u;
    uint32_t ReadLen = 0u;

    if ( UARTRxBuf.write_pos == UARTRxBuf.read_pos )
    {
        return 0;    //队列空
    }

    if ( UARTRxBuf.write_pos > UARTRxBuf.read_pos )
    {
        DataLen = UARTRxBuf.write_pos - UARTRxBuf.read_pos;
    }
    else
    {
        DataLen = UART_RX_MAX_DEPTH - (UARTRxBuf.read_pos - UARTRxBuf.write_pos);
    }

    if ( len > DataLen )
    {
        ReadLen = DataLen;
    }
    else
    {
        ReadLen = len;
    }

    for ( i = 0u; i < ReadLen; i++ )
    {
        pData [ i ]        = UARTRxBuf.Rx_Buffer [ UARTRxBuf.read_pos ];
        UARTRxBuf.read_pos = (UARTRxBuf.read_pos + 1) % UART_RX_MAX_DEPTH;
    }

    return ReadLen;
}
