#include "tcpclient.h"
#include <QDataStream>
#include "datatype.h"
#include <QDebug>
TcpClient::TcpClient(QObject * parent):QObject (parent)
{
    connect(&m_TcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadMessage()));
    connect(&m_TcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
    // 设置接收缓冲区大小
     int receiveBufferSize = 1024 * 1024; // 1MB
     m_TcpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, receiveBufferSize);
}
TcpClient::~TcpClient()
{

    disConnectServer();
    m_isConnected = false;

}
bool   TcpClient::disConnectServer()
{
    if (m_TcpSocket.state() == QAbstractSocket::ConnectedState || m_TcpSocket.state() == QAbstractSocket::ConnectingState)
    {
           qDebug() << "Disconnecting from server...";
           m_TcpSocket.disconnectFromHost();

    }
    else
    {
            qDebug() << "Already disconnected or not connected.";

    }
    m_isConnected = false;
    qDebug()<<"state"<<m_TcpSocket.state()<<endl;
    return m_TcpSocket.state() ==  QAbstractSocket::UnconnectedState;

}

 bool TcpClient::connectServer(QString ip ,qint16 port)
 {

     //直接读取状态，如果连接正常，则直接返回
      if(m_TcpSocket.state()== QAbstractSocket::ConnectedState)
       {
            if(m_TcpSocket.isValid())
            {
                m_isConnected = true;
                return true;
            }
            else
            {
                m_isConnected = false;
                return false;
            }
        }

       //尝试连接
       m_TcpSocket.abort();//取消原有连接
       m_TcpSocket.connectToHost(ip,port);
        if(m_TcpSocket.waitForConnected(1000))
        {
            m_isConnected = true;
        }
        else
        {
             m_isConnected = false;
        }

        return m_isConnected;

 }



bool TcpClient::sendMessage(QByteArray & data)
{

    if(!m_isConnected)
    {
        return false;
    }
    //分包发送
    const int PayloadSize = 64*1024;//一个帧数据包大小
    int totalSize = data.size();
    int bytesWritten = 0;
    int bytesToWrite = totalSize;
    while(bytesWritten<totalSize)
    {
        int startIdx = bytesWritten;
        int length = std::min(PayloadSize,bytesToWrite);
        if(startIdx+length>totalSize)
            return false;

        QByteArray smallBlock = data.mid(startIdx,length);
        qint64 written = m_TcpSocket.write(smallBlock);
        bool success = m_TcpSocket.waitForBytesWritten();

        if(!success)//发送失败包时，停止发送
        {
               return false;
        }

        bytesWritten+=written;
        bytesToWrite-=written;
    }
    m_TcpSocket.flush();

    return true;


}

 QByteArray TcpClient::GetData()
 {

    return QByteArray();
 }
 void   TcpClient::slotTestReadMessage()
 {

     QByteArray temp_BtyeArray = m_TcpSocket.readAll();
     m_msgArray.append(temp_BtyeArray );
     //数据头大小为23个字节
     //数据块长度192或者6
     //剩余部分5
     while(!m_msgArray.isEmpty())
     {
             qint32 allSize = m_msgArray.size();
             //数据头不够
             if (allSize < 23)
             {
                 qDebug()<<"sizeRcre"<<temp_BtyeArray<<endl;
                 return;
             }
             DataPacket dataRec;
             dataRec.deserializeHeader(m_msgArray);
             //数据总数不够
             qint32 dataLength = dataRec.dataLength+23+5;
             if(dataRec.dataLength+23+5 >allSize )
             {
                 qDebug()<<"datalength:"<<dataRec.dataLength<<temp_BtyeArray<<endl;
                 return ;
             }
             dataRec.deserialize(m_msgArray);
             QByteArray readContent = m_msgArray.left(dataLength);
             m_msgArray.remove(0, dataLength);
             emit  SigRectMsg(readContent);
       }

 }
 void  TcpClient::slotReadMessage()
 {
       qDebug()<<m_msgArray.size()<<endl;
     QByteArray temp_BtyeArray = m_TcpSocket.readAll();
     qDebug()<<temp_BtyeArray.size()<<endl;
     m_msgArray.append(temp_BtyeArray );
     quint8 frameHeader;       // 帧头 (1 byte)
     quint32 packetSeq;        // 包序号 (4 bytes)
     quint16 dataLength;       // 数据块长度 (2 bytes)
     quint8 batteryLevel;      // 电量 (1 byte)
     quint8 channelCount;      // 通道数量 (1 byte)
     qint16 pitchAngle;        // 俯仰角 (2 bytes)
     qint16 rollAngle;         // 滚动角 (2 bytes)
     qint16 yawAngle;          // 偏航角 (2 bytes)
     quint16 ecg;              // 心电 (2 bytes)
     quint16 spo2;             // 血氧 (2 bytes)
     quint8 reserved1;         // 预留1 (1 byte)
     quint8 reserved2;         // 预留2 (1 byte)
     quint8 reserved3;         // 预留3 (1 byte)
     quint8 reserved4;         // 预留4 (1 byte)

     QByteArray dataBlock;     // 数据块 (192 bytes 或 6 bytes)
     quint8 syncSource;        // 同步触发源 (1 byte)
     quint8 syncSeq;           // 同步触发序号 (1 byte)
     quint8 checksum;          // 校验和 (1 byte)
     quint16 packetTail;       // 包尾 (2 bytes)


     QDataStream in(m_msgArray);
            in.setVersion(QDataStream::Qt_5_13);



     in >>frameHeader>>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
        >> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
        >> reserved1 >> reserved2 >> reserved3 >> reserved4;
    qDebug()<<"---:"<<dataLength<<endl;
     dataBlock.resize(dataLength);
     in.readRawData(dataBlock.data(), dataLength);

     in >> syncSource >> syncSeq;

     in >> checksum;

     in >> packetTail;
     qDebug()<<"getdataLength:"<<dataLength<<endl;
      m_msgArray.remove(0, dataLength+23+5);
 }


 void  TcpClient::slotDisconnected()
 {
        disConnectServer();
 }
 void TcpClient::slotSendMessage(QByteArray & data)
 {
     sendMessage(data);
 }
