398 lines
9.5 KiB
C++
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);
|
|
}
|
|
|
|
//暂停播放
|
|
|
|
//下一帧
|
|
}
|
|
|