Files
capture/Play.cpp
T
2023-10-18 19:47:12 +08:00

398 lines
9.5 KiB
C++

#include "Play.h"
#include "ui_Play.h"
#include "QDebug"
#include "QFile"
#include "QFileInfoList"
#include "QDir"
#include "QLabel"
#include "QPushButton"
static QString Bin2Hex(QByteArray raw)
{
//原始数据转16进制代码
QString str;
QString data = raw.toHex().data();//以十六进制显示
data = data.toUpper ();//转换为大写
for(int i = 0;i<data.length ();i+=2)//填加空格
{
QString st = data.mid (i,2);
str += st;
str += " ";
}
return str;
}
QStringList getFiles(const QString &filePath,const QString &fileSuffix)
{
QStringList list;
list.clear();
QDir Dir(filePath); //查看工作路径是否存在
if(!Dir.exists()){ return list;} //如果文件夹不存在则返回
Dir.setFilter(QDir::Files); //设置过滤器只查看文件
QFileInfoList filelist = Dir.entryInfoList(QDir::Files); //获取所有文件
foreach (QFileInfo file, filelist) //遍历只加载.fileSuffix到文件列表
{
if(file.fileName().split(".").back() == fileSuffix) //判断进行再次确认是.fileSuffix
{
list.push_back(file.absoluteFilePath());
}
}
return list;
}
Play::Play(QWidget *parent) :
QWidget(parent),
ui(new Ui::Play)
{
ui->setupUi(this);
//根据json初始化端口
Packer_init(&packer);
Parser_init(&parser);
logname = QString("raw%1").arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss"));
QTableWidget *table = ui->tableWidget;
QStringList tabletitle;
tabletitle << tr("name") << tr("size");
table->setColumnCount(tabletitle.size()); //设置列数
table->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选中模式为选中行
table->setSelectionMode ( QAbstractItemView::SingleSelection); //设置选择模式,选择单行
table->setAlternatingRowColors(true);
table->setEditTriggers(QAbstractItemView::NoEditTriggers); //不能编辑
table->setMouseTracking(true);
table->setFocus();
table->setFocusPolicy(Qt::StrongFocus);
QString tableStyleSheet;
tableStyleSheet.clear();
//tableStyleSheet.append("QTableWidget::item:selected { background-color: rgb(25, 115, 194);} \n");
tableStyleSheet.append("QTableWidget{ background-color: rgb(27, 26, 55) ; color: rgb(255, 255, 255);} \n");
tableStyleSheet.append("QTableWidget{ alternate-background-color: rgb(20, 20, 74);}");
table->setStyleSheet(tableStyleSheet);
table->setColumnWidth(0,300); //设置第1列的列宽(name)
table->setColumnWidth(1,150); //设置第2列的列宽(size)
table->setHorizontalHeaderLabels(tabletitle);
QHeaderView* V_headerView = table->verticalHeader();
V_headerView->setHidden(true); //行名隐藏
QHeaderView* H_headerView = table->horizontalHeader();
H_headerView->setDefaultAlignment(Qt::AlignLeft); //表头信息显示居中靠左
H_headerView->setHighlightSections(false); //不高亮选中内容的所在列标题
H_headerView->setStretchLastSection(true);
H_headerView->setHidden(true);
connect(ui->tableWidget,&QTableWidget::itemDoubleClicked,this,[=](QTableWidgetItem *item)
{
int row=item->row();
int column = item->column();
QString key = table->item(row,0)->data(Qt::DisplayRole).toString();
QString path = filelist.value(key);
select_file = path;
ui->label_selectfile->setText(path);
ParseData();
});
QTimer *flushTimer = new QTimer();
flushTimer->setInterval(1000);
connect(flushTimer,&QTimer::timeout,this,[=](){
QStringList loglist = getFiles("./log","bin");
if(lastloglist != loglist)
{
QTableWidget *table = ui->tableWidget;
table->clear();
table->setRowCount(0);
foreach (QString txt, loglist) {
QFileInfo info(txt);
size_t logsize = info.size();
filelist.insert(info.fileName(),txt);
table->setRowCount(ui->tableWidget->rowCount() + 1);
int idx = ui->tableWidget->rowCount()-1;
table->removeCellWidget(idx,0);
table->setItem(idx,0,new QTableWidgetItem(info.fileName()));
table->removeCellWidget(idx,1);
table->setItem(idx,1,new QTableWidgetItem(QString::number(logsize)));
}
}
});
connect(this,&Play::destroyed,flushTimer,&QTimer::deleteLater);
flushTimer->start();
}
Play::~Play()
{
//结束播放
play_state = 0x00;
emit changedPlayState(play_state);
delete ui;
}
void Play::resizeEvent(QResizeEvent *event)
{
QTableWidget *table = ui->tableWidget;
table->setColumnWidth(0,300); //设置第1列的列宽(name)
table->setColumnWidth(1,150); //设置第2列的列宽(size)
}
void Play::ParseData()
{
if(play_state == 0x01)//停止播放
{
play_state = 0x00;
}
QString filename = select_file;
Parse *parse = new Parse;
parse->parseData(filename);
connect(parse,&Parse::frameList,this,[=](QMap<QDateTime,QByteArray> data){
playdata.clear();
playdata = data;
});
QThreadPool::globalInstance()->start(parse);
}
void Play::setSave(QHostAddress ip,uint16_t port,QByteArray data)
{
if(play_state > 0)//如果目前是播放模式,那就不记录
{
//return;
}
QByteArray frame;
frame.clear();
union{uint8_t B[8];qint16 h[4];quint16 H[4]; qint32 i[2];quint32 I[2];qint64 q;quint64 Q;}src;
qint64 time_t = QDateTime::currentMSecsSinceEpoch();
src.q = time_t;
frame.append(src.B[0]);
frame.append(src.B[1]);
frame.append(src.B[2]);
frame.append(src.B[3]);
frame.append(src.B[4]);
frame.append(src.B[5]);
frame.append(src.B[6]);
frame.append(src.B[7]);
save_count++;
src.Q = save_count;
frame.append(src.B[0]);
frame.append(src.B[1]);
frame.append(src.B[2]);
frame.append(src.B[3]);
frame.append(src.B[4]);
frame.append(src.B[5]);
frame.append(src.B[6]);
frame.append(src.B[7]);
src.I[0] = ip.toIPv4Address();
frame.append(src.B[0]);
frame.append(src.B[1]);
frame.append(src.B[2]);
frame.append(src.B[3]);
src.H[0] = port;
frame.append(src.B[0]);
frame.append(src.B[1]);
frame.append(data);
//长度可能太短,需要修改打包协议
size_t tx_len = Packer_pack(&packer, 01, (uint8_t*)frame.data(), frame.size());
QFile file("./log/" + logname + ".bin");
if(file.open(QIODevice::Append) )
{
QByteArray data;
data.clear();
data.append((const char *)packer.buff,tx_len);
QDataStream stream(&file);
stream << data;
file.flush();
file.close();
}
}
void Play::on_pushButton_last_clicked()
{
//暂停播放
if(play_state == 0x01)//正在播放
{
play_state = 0x02;
emit changedPlayState(play_state);
if(current_frame > 0)
{
current_frame -= 1;
}
emit changedframe(current_frame);
}
//上一帧
}
void Play::on_pushButton_play_clicked()
{
if(play_state == 0x02)//暂停了
{
play_state = 0x01;
emit changedPlayState(play_state);
}
else if(play_state == 0x01)//正在播放
{
play_state = 0x02;
emit changedPlayState(play_state);
}
else if(play_state == 0x00)//没有播放,可以播放
{
play_state = 0x01;
emit changedPlayState(play_state);
PlayThread *playthread = new PlayThread;
playthread->playData(playdata);
connect(playthread,&PlayThread::progress,this,[=](uint64_t all,uint64_t current){
ui->horizontalSlider->setMaximum(all);
ui->horizontalSlider->setValue(current);
ui->label_status->setText(" "+ QString::number(current) + "/" + QString::number(all) + " ");
current_frame = current;
total_frame = all;
qDebug() << all << current;
});
connect(this,&Play::changedframe,playthread,[=](int64_t pos){
playthread->setNewPos(pos);
play_state = 1;
emit changedPlayState(play_state);
});
connect(this,&Play::changedPlayState,playthread,[=](uint8_t state){
playthread->setPlayState(state);
});
connect(playthread,&PlayThread::frameData,this,[=](quint8 channel,quint8 type,QDateTime time, QByteArray raw){
emit frameData(channel,type,time,raw);
//qDebug() << channel << type << time << raw;
});
connect(ui->horizontalSlider,&QSlider::sliderMoved,this,[=](int value){
play_state = 2;
emit changedPlayState(play_state);
playthread->setNewPos(value);
play_state = 1;
emit changedPlayState(play_state);
qDebug() << "sliderMoved" << value;
});
QThreadPool::globalInstance()->start(playthread);
}
}
void Play::on_pushButton_next_clicked()
{
if(play_state == 0x01)//正在播放
{
play_state = 0x02;
emit changedPlayState(play_state);
if(current_frame < total_frame)
{
current_frame += 1;
}
emit changedframe(current_frame);
}
//暂停播放
//下一帧
}