#include "replay.h" Replay::Replay(QObject *parent) : ThreadTemplet(parent) { setRunFrq(5);//100 logFile.clear(); } Replay::~Replay() { qDebug() << "stop replay" << QThread::currentThreadId(); } void Replay::process()//线程函数 { QThread::msleep(5000);//5s后再发送 quint64 lastTimestamp = 0; quint64 currentTimestamp = 0; quint64 timeStamp = 0; while (true) { if(isplaying) { if(!ispause)//不暂停 { if(file)//已经有文件,那么可以读取 { if(position <= file->size()) { QByteArray raw; QByteArray time; file->seek(position); raw = file->read(MAVLINK_MAX_PACKET_LEN + sizeof(quint64)); if(raw.indexOf(0xFD) >= 8) { time = raw.mid(raw.indexOf(0xFD) - 8,8); } else { position -= 8 - raw.indexOf(0xFD); file->seek(position); raw = file->read(MAVLINK_MAX_PACKET_LEN + sizeof(quint64)); time = raw.mid(raw.indexOf(0xFD) - 8,8); } union {uint8_t B[8];uint64_t DW;}src; src.B[0] = time.data()[7]; src.B[1] = time.data()[6]; src.B[2] = time.data()[5]; src.B[3] = time.data()[4]; src.B[4] = time.data()[3]; src.B[5] = time.data()[2]; src.B[6] = time.data()[1]; src.B[7] = time.data()[0]; currentTimestamp = src.DW; if(lastTimestamp == 0) { lastTimestamp = currentTimestamp - 50; } if(((currentTimestamp - lastTimestamp) >0)&&((currentTimestamp - lastTimestamp) < 5000000)) { timeStamp = currentTimestamp - lastTimestamp; } if((currentTimestamp - lastTimestamp) >0) { if((((double)timeStamp)/ multiple) > 50) { QThread::usleep(uint64_t(timeStamp / multiple)); } else { QThread::usleep(1000); //qDebug() << "1000 us"; } if(timeStamp < 50) { timeStamp = 50; } } position += (uint8_t)raw.at(raw.indexOf(0xFD)+1) + 20; buff.clear(); buff = raw.mid(raw.indexOf(0xFD),(uint8_t)raw.at(raw.indexOf(0xFD) +1) + 12); //读取一帧数据 //将百分比增加,或者位置增加 percentage = (float)position / file->size(); emit currentPercentage(percentage); emit readReady(); lastTimestamp = currentTimestamp; QApplication::processEvents(); } else { emit replayComplete(); isplaying = false; } } } else { QThread::msleep(1000);//如果没有播放,那么每秒钟检测一下是否要播放 } } else { //QThread::yieldCurrentThread();//放弃运行 QThread::msleep(1000);//如果没有播放,那么每秒钟检测一下是否要播放 } if(isInterruptionRequested())//退出 { break; } //QThread::yieldCurrentThread(); } } //类相关函数 QByteArray Replay::readAll(void) { //把buff里面的数据返回 QByteArray data; data.clear(); if(!buff.isEmpty()) { data.append(buff); buff.clear(); } return data; } void Replay::setLogfile(const QString name, float percent) { if(name != logFile) { logFile = name; //重置各种参数 percentage = 0; ispause = false; isplaying = false; position = 0; emit currentPercentage(percentage); emit readReady(); emit replayComplete(); if(!file) { file = new QFile(); } file->setFileName(logFile); if(!file->open(QIODevice::ReadOnly)) { if(!logFile.isEmpty()) { QMessageBox::warning(nullptr, tr("Error"), tr("%1").arg(file->errorString())); } delete file; file = nullptr; } } else { logFile = name; //重置各种参数 percentage = percent; ispause = false; isplaying = false; } qDebug() << name << percent; } void Replay::setPercentage(float value) { percentage = value; qDebug() << "percent"<< value; if(file)//已经有文件,那么可以读取 { position = percentage * file->size(); } } void Replay::startReplay(bool flag) { qDebug() << "play flag" << flag; if(flag) { if(ispause == true) { ispause = false; } if(isplaying == false) { isplaying = true; } //根据百分比设置位置 if(file)//已经有文件,那么可以读取 { position = percentage * file->size(); } //启动线程 start(); } else { ispause = true; } } void Replay::setMultiple(double value) { qDebug() << "multiple"; if(value != 0) { multiple = value; qDebug() << "multiple" << multiple; } }