#include "realtimepositioninfothread.h"
#include "qdebug.h"

/*
 * @brief 实时接收飞机位置信息子线程,并将位置信息传递给其他线程
 */
RealTimePositionInfoThread::RealTimePositionInfoThread(QObject *parent)
    : QObject{parent}
{
//    showPos_timer.setInterval(200);
//    showPos_timer.start();
//    connect(&showPos_timer,&QTimer::timeout,this,[=](){
//        emit sendPos(this->qmapLon[0],this->qmapLat[0],this->qmapHeading[0]);
//    });
}

void RealTimePositionInfoThread::working()
{
//    qDebug()<<"*************************RealTimePositionInfoThread:"<<QThread::currentThread();
//    while(true)
//    {
//        if(this->qmapLon[0].size()>=MAX_CONTAINER)
//        {
//            mutex.lock();
//            removePositionContainer(50);
//            mutex.unlock();
//        }
//        QThread::msleep(100);
//    }

}

//定时任务:发送地形碰撞检测所需位置信息
void RealTimePositionInfoThread::startSendCollisionDetectionPosInfo(int ms)
{
    collisionDetect_timer = new QTimer;
    connect(collisionDetect_timer,&QTimer::timeout,this,&RealTimePositionInfoThread::collisionDetectTimeout);
    collisionDetect_timer->start(ms);
}

//接收实时飞行位置信息
void RealTimePositionInfoThread::receiveRealTimePositionInfo(QList<double> lon, QList<double> lat, QList<double> relativeAlititude, QList<double> heading, QList<double> speed)
{
//    qDebug() << "RealTimePositionThread address: " << QThread::currentThread();
//    qDebug()<<"*************************receiveRealTimePositionInfo:";
    mutex.lock();
//    qDebug()<<"*************************size:"<<this->qmapLon[0].size();
    if(this->qmapLon[0].size()>=MAX_CONTAINER)
    {
        removePositionContainer(50);
    }
    for(int index=0;index<lon.size();index++)//飞机数量
    {
        this->qmapLon[index].append(lon.at(index));
        this->qmapLat[index].append(lat.at(index));
        this->qmapRelativeAlititude[index].append(relativeAlititude.at(index));
        this->qmapHeading[index].append(heading.at(index));
        this->qmapSpeed[index].append(speed.at(index));
    }
    mutex.unlock();
}

//发送位置信息用于实时显示飞机位置
void RealTimePositionInfoThread::startSendDisplayInfo(int ms)
{

    showPos_timer = new QTimer;
    connect(showPos_timer,&QTimer::timeout,this,[=](){
//        qDebug()<<"*************************RealTimePositionInfoThread:";
        emit sendDisplayInfo(this->qmapLon,this->qmapLat,this->qmapHeading);
    });
    showPos_timer->start(ms);
}

//停止发送数据给碰撞探测子线程
void RealTimePositionInfoThread::stopSendCollisionDetectionPosInfo()
{
    collisionDetect_timer->stop();
    delete collisionDetect_timer;
}

void RealTimePositionInfoThread::receiveTest(int i)
{
    qDebug() << "************************receive i:"<<i;
}

void RealTimePositionInfoThread::removePositionContainer(int count)
{
    for(int i=0;i<this->qmapLon.size();i++)
    {
        for(int j=0;j<count;j++)
        {
            this->qmapLon[i].pop_front();
            this->qmapLat[i].pop_front();
            this->qmapRelativeAlititude[i].pop_front();
            this->qmapHeading[i].pop_front();
            this->qmapSpeed[i].pop_front();
        }
    }
}

void RealTimePositionInfoThread::collisionDetectTimeout()
{
//    qDebug()<<"*****************************collisionDetectTimeout:";
    QList<double> lon,lat,relativeAlititude,heading,speed;
    mutex.lock();
    for(int i=0;i<this->qmapLon.keys().size();i++)
    {
        lon.append(this->qmapLon[i].takeLast());
        lat.append(this->qmapLat[i].takeLast());
        relativeAlititude.append(this->qmapRelativeAlititude[i].takeLast());
        heading.append(this->qmapHeading[i].takeLast());
        speed.append(this->qmapSpeed[i].takeLast());
    }
    mutex.unlock();
    emit sendCollisionDetectPosInfo(lon,lat,relativeAlititude,heading,speed);
}