3500/DataGraphView.cpp

836 lines
34 KiB
C++
Raw Normal View History

2023-10-19 14:15:31 +08:00
#include "DataGraphView.h"
#include "ui_DataGraphView.h"
#include <QMessageBox>
#include "log.h"
#define CHANNELID_ROLE (Qt::UserRole + 2)
#define CHANNELTYPE_ROLE (Qt::UserRole + 3)
CDataGraphView::CDataGraphView(QWidget *parent) :
QWidget(parent),
ui(new Ui::CDataGraphView)
{
ui->setupUi(this);
//ReadDat();
tracer = new QCPItemTracer(ui->widget_TimeGraph);
tracer->setStyle(QCPItemTracer::tsCrosshair);
tracer->setPen(QPen(Qt::red));
tracer->setBrush(Qt::red);
tracer->setSize(6);
tracer->setVisible(false);
tracer->setInterpolating(false);
QFont font;
font.setPixelSize(20);
tracerLabel = new QCPItemText(ui->widget_TimeGraph);
tracerLabel->setLayer("overlay");
tracerLabel->setPen(QPen(Qt::white));
tracerLabel->setBrush(QColor(64, 156, 225));
tracerLabel->setPadding(QMargins(2,2,2,2));//边界宽度
tracerLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
tracerLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
tracerLabel->position->setCoords(0, 0);
tracerLabel->setFont(font);
tracerLabel->setText("");
tracer2 = new QCPItemTracer(ui->widget_FsGraph);
tracer2->setStyle(QCPItemTracer::tsCrosshair);
tracer2->setPen(QPen(Qt::red));
tracer2->setBrush(Qt::red);
tracer2->setSize(6);
tracer2->setVisible(false);
tracer2->setInterpolating(false);
tracerLabel2 = new QCPItemText(ui->widget_FsGraph);
tracerLabel2->setLayer("overlay");
tracerLabel2->setPen(QPen(Qt::white));
tracerLabel2->setBrush(QColor(64, 156, 225));
tracerLabel2->setPadding(QMargins(2,2,2,2));//边界宽度
tracerLabel2->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
tracerLabel2->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
tracerLabel2->position->setCoords(0, 0);
tracerLabel2->setFont(font);
tracerLabel2->setText("");
connect(ui->widget_TimeGraph, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*)));
connect(ui->widget_TimeGraph, SIGNAL(mouseDoubleClick(QMouseEvent*)), this, SLOT(mouseDoubleClickEvent(QMouseEvent*)));
connect(ui->widget_FsGraph, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent2(QMouseEvent*)));
}
CDataGraphView::~CDataGraphView()
{
ui->widget_TimeGraph->clearGraphs();
ui->widget_TimeGraph->plotLayout()->clear();
ui->widget_TimeGraph->destroyed();
QMap<QString,QVector<WAVE_DATA>>::Iterator itermapWaveData = m_mapWaveData.begin();
for(itermapWaveData = m_mapWaveData.begin();itermapWaveData != m_mapWaveData.end();itermapWaveData++){
itermapWaveData->clear();
QVector<WAVE_DATA>().swap(itermapWaveData.value());
m_mapWaveData.erase(itermapWaveData);
}
delete ui;
}
void CDataGraphView::RemoveSeries()
{
tracer->setVisible(false);
tracer2->setVisible(false);
tracerLabel->setVisible(false);
tracerLabel2->setVisible(false);
ui->widget_TimeGraph->clearGraphs();
ui->widget_FsGraph->clearGraphs();
ui->widget_TimeGraph->replot();
ui->widget_FsGraph->replot();
ui->widget_FsGraph->replot(QCustomPlot::rpQueuedReplot);//刷新图表
}
void CDataGraphView::ItemPressSlot(QTableWidgetItem *item)
{
if(!item) return;
if(item->column() != 0) return;
QString strID = item->data(CHANNELID_ROLE).toString();
QString strType = item->data(CHANNELTYPE_ROLE).toString();
if(item->isSelected() && !item->checkState())
{
listChannelID.push_back(strID);
item->setCheckState(Qt::Checked);
item->setSelected(true);
qDebug() << "Add1 channelID" << strID << endl;
RemoveSeries();
emit ItemCheckStateSignal(strID, true);
}
else if(item->checkState() && !item->isSelected())
{
item->setCheckState(Qt::Unchecked);
emit ItemCheckStateSignal(strID, false);
listChannelID.removeOne(strID);
qDebug() << "remove1 channelID" << strID << endl;
RemoveSeries();
}
}
void CDataGraphView::ItemChangedSlot(QTableWidgetItem *item)
{
if(!item) return;
if(item->column() != 0) return;
QString strID = item->data(CHANNELID_ROLE).toString();
QString strType = item->data(CHANNELTYPE_ROLE).toString();
if(item->checkState() && !item->isSelected())
{
listChannelID.push_back(strID);
item->setCheckState(Qt::Checked);
item->setSelected(true);
qDebug() << "Add2 channelID" << strID << endl;
RemoveSeries();
emit ItemCheckStateSignal(strID, true);
}
else if(!item->checkState() && item->isSelected())
{
item->setCheckState(Qt::Unchecked);
item->setSelected(false);
emit ItemCheckStateSignal(strID, false);
listChannelID.removeOne(strID);
qDebug() << "remove2 channelID" << strID << endl;
RemoveSeries();
}
}
QTableWidgetItem * CDataGraphView::AddTableWgtItem(QString strText, QString clolor, QString strID)
{
ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
ui->tableWidget->setColumnWidth(0, 256);
ui->tableWidget->setColumnWidth(1, 5);
QTableWidgetItem *pItemName = new QTableWidgetItem();
pItemName->setText(strText);
pItemName->setCheckState(Qt::Unchecked);
QWidget *pWgt = new QWidget;
QVBoxLayout *pLayout = new QVBoxLayout(pWgt);
QLabel *pLabel = new QLabel(ui->tableWidget);
pLabel->setFixedSize(20, 20);
pLabel->setStyleSheet(QString("QLabel{background: rgb(%1)}").arg(clolor));
pLayout->addWidget(pLabel);
pLayout->setMargin(0);
pLayout->setAlignment(pLabel, Qt::AlignCenter);
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, pItemName);
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount() - 1, 1, pWgt);
m_mapChannelIDtoLabel[strID] = pItemName;
return pItemName;
}
void CDataGraphView::SetDataIDs(const QStringList &strIDList, QString strTitle,const QStringList& strChannleTypeList,\
const QStringList& strChannleNameList)
{
disconnect(ui->tableWidget, SIGNAL(itemPressed(QTableWidgetItem *)), this, SLOT(ItemPressSlot(QTableWidgetItem *)));
disconnect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(ItemChangedSlot(QTableWidgetItem *)));
//m_listChannelID = strIDList;
int i = 0;
for(int j = 0; j < strIDList.size();j++)
{
QString strNum1 = strIDList[j].right(4).left(2);
QString strNum2 = strIDList[j].right(2);
QString strChannleType = "";
if(strChannleTypeList[j] == "ACCELEROMETER")
{
strChannleType = "加速度";
}else if(strChannleTypeList[j] == "PROXIMETER"){
strChannleType = "径向位移";
}else if(strChannleTypeList[j] == "VELOCITY"){
strChannleType = "速度";
}else if(strChannleTypeList[j] == "SLOW_CURRENT"){
strChannleType = "电流";
}else if(strChannleTypeList[j] == "THRUST"){
strChannleType = "轴向位移";
}else if(strChannleTypeList[j] == "TACHOMETER"){
strChannleType = "转速";
}else if(strChannleTypeList[j] == "MICROPHONE"){
strChannleType = "声音";
}else if(strChannleTypeList[j] == "FAST_VOLTAGE"){
strChannleType = "动态电压";
}else if(strChannleTypeList[j] == "PULSE_CURRENT"){
strChannleType = "高速电流";
}
QString strText = QStringLiteral("%1-%2%3 (%4)").arg(strChannleNameList[j]).arg(strNum1).arg(strNum2).arg(strChannleType);
//QString strText = QStringLiteral("%1").arg(strChannleType[j]);
QString strColor = "0,255,0";
switch(i){
case 0:
strColor = "0,255,0";
break;
case 1:
strColor = "30,144,255";
break;
case 2:
strColor = "255,182,193";
break;
case 3:
strColor = "0, 255, 255";
break;
case 4:
strColor = "255, 0, 255";
break;
case 5:
strColor = "255, 255, 0";
break;
case 6:
strColor = "255,69,0";
break;
case 7:
strColor = "0, 255, 127";
break;
case 8:
strColor = "255,140,0";
break;
case 9:
strColor = "0, 191, 255";
break;
case 10:
strColor = "139, 0, 139";
break;
case 11:
strColor = "211, 211, 211";
break;
case 12:
strColor = "205, 205, 0";
break;
case 13:
strColor = "153,51, 250";
break;
case 14:
strColor = "255, 218, 185";
break;
case 15:
strColor = "0, 199 ,140";
break;
default:
strColor = "0,255,0";
break;
}
i++;
if(i > 15)
i = 0;
QTableWidgetItem *pItem = AddTableWgtItem(strText, strColor, strIDList[j]);
pItem->setData(CHANNELID_ROLE, strIDList[j]);
pItem->setData(CHANNELTYPE_ROLE, strChannleTypeList[j]);
}
connect(ui->tableWidget, SIGNAL(itemPressed(QTableWidgetItem *)), this, SLOT(ItemPressSlot(QTableWidgetItem *)));
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(ItemChangedSlot(QTableWidgetItem *)));
{
m_mapChannelIDtoLabel[strIDList[0]]->setSelected(true);
m_mapChannelIDtoLabel[strIDList[0]]->setCheckState(Qt::Checked);
listChannelID.push_back(strIDList[0]);
emit ItemCheckStateSignal(strIDList[0], true);
//ViewData(strIDList[0]);
}
}
void CDataGraphView::ViewData(QString& strChannelID,QVector<WAVE_DATA>& wavedata)
{
qDebug() << "ViewData" << endl;
foreach (auto ID, listChannelID){
if(ID != strChannelID){
m_mapChannelIDtoLabel[ID]->setCheckState(Qt::Unchecked);
m_mapChannelIDtoLabel[ID]->setSelected(false);
}
}
m_strChannelID = strChannelID;
m_wavedata = wavedata;
int Time = wavedata.size();
ui->widget_TimeGraph->xAxis->setRange(1, Time);
ui->widget_TimeGraph->xAxis->setLabel("Time(s)");
QVector<double> key,value;
key.reserve(Time*wavedata[0].waveData.size());
value.reserve(Time*wavedata[0].waveData.size());
qDebug() << "Time" << Time << endl;
double gap = (double)1/(double)wavedata[0].waveData.size();
double f = 0.0;
for(int i = 0; i < Time;i++){
for(int j = 0; j < wavedata[i].waveData.size();j++){
key.push_back(f);
value.push_back(wavedata[i].waveData[j]-wavedata[i].mean);
f += gap;
}
}
ui->widget_TimeGraph->addGraph(ui->widget_TimeGraph->xAxis, ui->widget_TimeGraph->yAxis);
QString str = QString("key size: %1,value size:%2").arg(key.size()).arg(value.size());
customLogMessageHandler(QtDebugMsg,str);
ui->widget_TimeGraph->graph(0)->setData(key, value);
QPen pen;
pen.setColor(wavedata.at(0).linColor);
pen.setStyle(Qt::SolidLine);
ui->widget_TimeGraph->graph(0)->setPen(pen);
ui->widget_TimeGraph->rescaleAxes(true);
QString stryLabel = wavedata[0].sensorType + "(" + wavedata[0].sensorEngineeringUnit +")";
ui->widget_TimeGraph->yAxis->setLabel( stryLabel);
ui->widget_TimeGraph->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
ui->widget_TimeGraph->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag);
QVector<double>::iterator max = std::max_element(std::begin(value), std::end(value));
QVector<double>::iterator min = std::min_element(std::begin(value), std::end(value));
double biggest = *max;
double minimum = *min;
2024-09-11 16:37:00 +08:00
ui->widget_TimeGraph->yAxis->setRange(minimum,biggest);
2023-10-19 14:15:31 +08:00
ui->widget_TimeGraph->axisRect()->setRangeZoomFactor(1.2,1);
ui->widget_TimeGraph->axisRect()->setRangeZoomAxes(ui->widget_TimeGraph->xAxis,ui->widget_TimeGraph->yAxis);
ui->widget_TimeGraph->replot();
}
void CDataGraphView::mouseMoveEvent2(QMouseEvent *event)
{
tracer2->setVisible(true);
tracerLabel2->setVisible(true);
//将像素点转换成qcustomplot中的坐标值并通过setGraphKey将锚点值设为真实数据值。tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x()));
int graphCount = ui->widget_FsGraph->graphCount();
if(graphCount < 1)
return;
//获得鼠标位置处对应的横坐标数据x
double x = ui->widget_FsGraph->xAxis->pixelToCoord(event->pos().x());
double y = ui->widget_FsGraph->xAxis->pixelToCoord(event->pos().y());
//遍历曲线
for (int i = 0; i < graphCount && tracer2->visible(); ++i)
{
//显示锚点
QCPGraph *mGraph = ui->widget_FsGraph->graph(i);
tracer2->setGraph(mGraph);//将锚点设置到被选中的曲线上
tracer2->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
tracer2->updatePosition(); //使得刚设置游标的横纵坐标位置生效
double xValue = tracer2->position->key();
double yValue = tracer2->position->value();
tracerLabel2->setVisible(true);
tracerLabel2->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
//显示tip框
//QCPDataContainer<QCPGraphData>::const_iterator coorPoint = ui->widget_TimeGraph->graph(0)->data().data()->findBegin(xValue, true);//true代表向左搜索
}
//重绘
ui->widget_FsGraph->replot();
}
void CDataGraphView::mouseMoveEvent(QMouseEvent *event)
{
tracer->setVisible(true);
tracerLabel->setVisible(true);
//将像素点转换成qcustomplot中的坐标值并通过setGraphKey将锚点值设为真实数据值。tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x()));
int graphCount = ui->widget_TimeGraph->graphCount();
if(graphCount < 1)
return;
//获得鼠标位置处对应的横坐标数据x
double x = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().x());
double y = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().y());
//遍历曲线
for (int i = 0; i < graphCount && tracer->visible(); ++i)
{
//显示锚点
QCPGraph *mGraph = ui->widget_TimeGraph->graph(i);
tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上
tracer->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效
double xValue = tracer->position->key();
double yValue = tracer->position->value();
tracerLabel->setVisible(true);
tracerLabel->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
//显示tip框
//QCPDataContainer<QCPGraphData>::const_iterator coorPoint = ui->widget_TimeGraph->graph(0)->data().data()->findBegin(xValue, true);//true代表向左搜索
}
//重绘
ui->widget_TimeGraph->replot();
}
void CDataGraphView::mouseDoubleClickEvent(QMouseEvent *event)
{
int graphCount = ui->widget_TimeGraph->graphCount();
if(graphCount < 1)
return;
qDebug()<<"mouseDoubleClickEvent" << endl;
int x = ui->widget_TimeGraph->xAxis->pixelToCoord(event->pos().x());
ui->widget_FsGraph->xAxis->setLabel("Fs(Hz)");
QVector<double> vecData,vecFFTSpecData;
double sum = std::accumulate(std::begin(m_wavedata[x].waveData), std::end(m_wavedata[x].waveData), 0.0);
float size = m_wavedata[x].SamleRate;
double mean = sum/size;
for(int j = 0 ; j < m_wavedata[x].SamleRate;j++){
vecData.push_back(m_wavedata[x].waveData.at(j)-mean);
}
comFun.FFTSpec(vecData,vecFFTSpecData);
QVector<double> key,value;
for(int j = 0; j < vecFFTSpecData.size();j++){
key.push_back(j);
}
ui->widget_FsGraph->addGraph(ui->widget_FsGraph->xAxis, ui->widget_FsGraph->yAxis);
ui->widget_FsGraph->graph(0)->setData(key, vecFFTSpecData);
QPen pen;
pen.setColor(m_wavedata.at(0).linColor);
pen.setStyle(Qt::SolidLine);
ui->widget_FsGraph->graph(0)->setPen(pen);
ui->widget_FsGraph->rescaleAxes(true);
QString stryLabel = m_wavedata[0].sensorType + "(" + m_wavedata[0].sensorEngineeringUnit +")";
ui->widget_FsGraph->yAxis->setLabel( stryLabel);
ui->widget_FsGraph->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
ui->widget_FsGraph->setInteractions(QCP::iRangeZoom|QCP::iRangeDrag);
QVector<double>::iterator max = std::max_element(std::begin(value), std::end(value));
QVector<double>::iterator min = std::min_element(std::begin(value), std::end(value));
double biggest = *max;
double minimum = *min;
ui->widget_FsGraph->yAxis->setRange(minimum-1,biggest+2);
ui->widget_FsGraph->graph(0)->rescaleValueAxis(false,true);
ui->widget_FsGraph->axisRect()->setRangeZoomFactor(1.2,1);
ui->widget_FsGraph->axisRect()->setRangeZoomAxes(ui->widget_FsGraph->xAxis,ui->widget_FsGraph->yAxis);
ui->widget_FsGraph->replot();
}
void CDataGraphView::ReadDatFile(QString strFileName){
QFile file(strFileName);
if (!file.open(QIODevice::ReadOnly))
{
qDebug() << "::MainWidget::ReadDatData() cannot open file for read";
return;
}
QProgressDialog *progressDialog = new QProgressDialog(this);
progressDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
progressDialog->setWindowModality(Qt::WindowModal);
progressDialog->setWindowTitle(tr("Please Wait"));
progressDialog->setLabelText(tr("数据读取中..."));
progressDialog->setCancelButton(0);
progressDialog->show();
QString m_sEquipNo; //设备号
QString m_strDeviceName; //设备名称
QString m_strCollectTime; //采集时间
QTime startTime = QTime::currentTime();
// qDebug() << "Vector 的 容量为1" << m_vecPushData.capacity() << endl;
qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl;
m_vecGroupdata.clear();
m_vecWaveInfo.clear();
QVector<GroupData>().swap(m_vecGroupdata);
QVector<WAVE_INFO>().swap(m_vecWaveInfo);
QVector<WAVE_ALLDATA>().swap(m_vecAllData);
QMap<QString,QVector<WAVE_DATA>>::Iterator iter1 = mapWaveData.begin();
for(iter1 = mapWaveData.begin();iter1 !=mapWaveData.end();iter1++){
QVector<WAVE_DATA>().swap(iter1.value());
mapWaveData.erase(iter1);
}
qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl;
int theSize = 0; //通道数
//读12字节头文件
int iJsonSize, iChannelsize;
char equipNo[12]; //设备No 12字节
char time[10]; //数据起始时间 10字节
file.read((char*)&iChannelsize, sizeof(iChannelsize));
qDebug() << "::MainWidget::ReadDatData() Channelsize:" << iChannelsize;
int iCount; //存储dat文件原始数据秒数
file.read((char*)&iCount, sizeof(iCount));
qDebug() << "::MainWidget::ReadDatData() iCount:" << iCount;
file.read(equipNo, sizeof(equipNo));
QString sEquipNo(equipNo);
m_sEquipNo = sEquipNo.left(12);
qDebug() << "::MainWidget::ReadDatData() equipNo:" << m_sEquipNo;
file.read(time, sizeof(time));
QString CollectTime(time);
m_strCollectTime = CollectTime.left(10);
qDebug() << "::MainWidget::ReadDatData() time:" << m_strCollectTime;
file.read((char *)&iJsonSize, sizeof(iJsonSize));
qDebug() << "::MainWidget::ReadDatData() iJsonSize:" << iJsonSize;
//读json串
char *buf0 = (char *)malloc(sizeof(char) *iJsonSize);
file.read(buf0,iJsonSize);
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(buf0,&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
qDebug()<<tr("解析json文件错误");
//delete progressDialog;
file.close();
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("Dat文件不符合规范!"));
return;
}
int channels = 0;
QJsonObject jsonObject = document.object();
QString strType = jsonObject["DeviceType"].toString();
qDebug() << "Device Type" << strType << endl;
if(jsonObject.contains(QStringLiteral("ChannelSettings"))){
QJsonValue arrayValue = jsonObject.value(QStringLiteral("ChannelSettings"));
if(arrayValue.isArray()){
QJsonArray array = arrayValue.toArray();
theSize = array.size();
for(int i = 0; i<array.size();i++){
WAVE_INFO waveInfo;
channelEnabled[i] = array.at(i)["isEnable"].toInt();
channelwork[i] = array.at(i)["isWork"].toInt();
QString strchannelType = array.at(i)["sensorType"].toString();
//qDebug() << channelEnabled[i] << channelwork[i] << array.at(i)["channelId"].toString() << endl;
if(channelEnabled[i] && channelwork[i] && strchannelType != "DO" && strchannelType != "DI"){
waveInfo.channelId = array.at(i)["channelId"].toString();
waveInfo.channelType = array.at(i)["sensorType"].toString();
waveInfo.channelName = array.at(i)["channelName"].toString();
waveInfo.sensorType = array.at(i)["sensorType"].toString();
waveInfo.channelSamleRate = array.at(i)["samplingRate"].toInt();
waveInfo.pairChannelID = array.at(i)["pairChannelId"].toString();
waveInfo.equipmentName = array.at(i)["equipmentName"].toString();
waveInfo.sensorEngineeringUnit = array.at(i)["sensorEngineeringUnit"].toString();
waveInfo.speedRefChannelId = array.at(i)["speedRefChannelId"].toString();
waveInfo.tachAutoTach = array.at(i)["tachAutoTach"].toBool();
waveInfo.sensorGapVoltage = array.at(i)["sensorGapVoltage"].toDouble();
waveInfo.sensorSensitivity = array.at(i)["sensorSensitivity"].toDouble();
QString strtachTriggerEdge = array.at(i)["tachTriggerEdge"].toString();
if(strtachTriggerEdge == "rising"){
waveInfo.iTrigger = 0;
}else if(strtachTriggerEdge == "falling"){
waveInfo.iTrigger = 1;
}
waveInfo.iTrigger = 0;
waveInfo.iKeyCount = array.at(i)["tachTriggerPerRev"].toInt();
waveInfo.iTriggerValue = array.at(i)["tachTriggerVoltageLevel"].toDouble();
waveInfo.iHysteresis = array.at(i)["tachTriggerHysteresis"].toDouble();
qDebug() <<waveInfo.channelId<< "iKeyCount" << waveInfo.iKeyCount << "iTriggerValue" << waveInfo.iTriggerValue << "iHysteresis" << waveInfo.iHysteresis << endl;
m_vecWaveInfo.push_back(waveInfo);
channels ++ ;
qDebug() << waveInfo.sensorGapVoltage << waveInfo.sensorSensitivity << endl;
qDebug() << waveInfo.channelId << waveInfo.channelType <<waveInfo.channelName << waveInfo.pairChannelID << waveInfo.sensorEngineeringUnit << waveInfo.speedRefChannelId << waveInfo.iTriggerValue<<endl;
}
}
}
}if(jsonObject.contains(QStringLiteral("groups"))){
QJsonValue arrayValue = jsonObject.value(QStringLiteral("groups"));
if(arrayValue.isArray()){
QJsonArray array1 = arrayValue.toArray();
theSize = array1.size();
for(int i = 0; i<array1.size();i++){
QString strChannelType = array1.at(i)["ChannelType"].toString();
QString strChannelID = array1.at(i)["name"].toString();
//if(strChannelType == "TACHOMETER")
{
for(int ii = 0; ii < m_vecWaveInfo.size();ii++){
if(strChannelID == m_vecWaveInfo[ii].channelId){
QJsonValue arrayValue = array1.at(i)["channels"];
QJsonArray array2 = arrayValue.toArray();
for(int j = 0; j<array2.size();j++){
if("SpeedProfileSpeed" == array2.at(j)["name"].toString()){
QJsonArray arrayValue = array2.at(j)["data"].toArray();
for(int jj = 0; jj < arrayValue.size();jj++){
m_vecWaveInfo[ii].SpeedProfileSpeed.push_back(arrayValue[jj].toDouble());
}
}
if("RMSValues" == array2.at(j)["name"].toString()){
QJsonArray arrayValue = array2.at(j)["data"].toArray();
for(int jj = 0; jj < arrayValue.size();jj++){
m_vecWaveInfo[ii].RMSValue.push_back(arrayValue[jj].toDouble());
}
}
}
}
}
}
}
}
}
qDebug()<<"channels" <<channels<<endl;
//循环读出原始数据内容
WAVE_CHNDATA m_WaveChnData[15000];
int Count, waveSize,bufferSiz;
if(strType == "3500")
bufferSiz = 16;
else
bufferSiz = 15;
char buf[bufferSiz];
m_vecAllData.clear();
//QVector<WAVE_DATA> pData;
int j = 0;
int temCount = 0;
int flag = -1;
progressDialog->setRange(0, iCount * channels-1);
while (!file.atEnd()) {
file.read((char *)&Count, sizeof(Count));
//qDebug()<<"Count" << Count << "temCount" <<temCount<< endl;
if(Count > temCount && flag == 0)//过滤超出的秒数的数据
break;
if(Count == temCount && flag == 0)
flag = 1;
if(Count < temCount || flag == 1){//过滤原始数据中转速多余数据
file.read(buf, sizeof(buf));
file.read((char *)&waveSize, sizeof(waveSize));
float f = 0.0;
QVector<double> vecSpeed;
qDebug()<<"waveSize1" <<waveSize<<endl;
for (int i = 0; i < waveSize; i++) {
file.read((char *)&f, sizeof(f));
vecSpeed.push_back(f);
}
for(int ii = 0; ii < 2000;ii++){
if(m_WaveChnData[ii].Second == Count){
m_WaveChnData[ii].TimeStamp = vecSpeed;
}
}
flag = 0;
qDebug()<<"::MainWidget::ReadDatData()11 wave.channelId" << buf <<" wave.count"<<Count<<" wave.wavedata"<<m_WaveChnData[j].waveData.size()<<"waveSize"<<waveSize << "j"<<j<<endl;;
}else {
file.read(buf, sizeof(buf));
file.read((char *)&waveSize, sizeof(waveSize));
float f = 0.0;
WAVE_ALLDATA waveAll;
if(waveSize < 0 || waveSize > 131072){
qDebug() << "waveSize2" << waveSize << endl;
//delete progressDialog;
file.close();
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("Dat文件不符合规范!"));
return;
}
for (int i = 0; i < waveSize; i++) {
file.read((char *)&f, sizeof(f));
m_WaveChnData[j].channelId = buf;
m_WaveChnData[j].waveData.push_back((double)f);
m_WaveChnData[j].Second = Count;
}
temCount = Count;
//qDebug()<<"::MainWidget::ReadDatData() wave.channelId" << m_WaveChnData[j].channelId<<" wave.count"<<Count<<" wave.wavedata"<<m_WaveChnData[j].waveData.size()<<"waveSize"<<waveSize << "j"<<j<<endl;;
}
progressDialog->setValue(j);
if (progressDialog->wasCanceled())
{
delete progressDialog;
file.close();
return ;
}
j++;
}
//qDebug()<<m_vecAllData.size()<<m_vecAllData.capacity() << "iCount" <<iCount << "m_vecWaveInfo" << m_vecWaveInfo.size() <<endl;
QVector<WAVE_INFO>::iterator iter = m_vecWaveInfo.begin();
int linecolor = 0;
for (;iter != m_vecWaveInfo.end() ; iter++ ) {
WAVE_DATA wave;
int ii = 0;
QVector<WAVE_DATA> m_vecPushData1;
for(int i = 0; i < j; i++){
//qDebug() << "i" << iter->channelId.left(bufferSiz) << "j " << m_WaveChnData[i].channelId.left(bufferSiz) <<endl;
if(iter->channelId.left(bufferSiz) == m_WaveChnData[i].channelId.left(bufferSiz)){
wave.waveData = m_WaveChnData[i].waveData;
double sum = 0.0;
if(iter->sensorType == "ACCELEROMETER" || iter->sensorType == "MICROPHONE" ||
iter->sensorType == "PROXIMETER" || iter->sensorType == "VELOCITY" ||
iter->sensorType == "TACHOMETER" || iter->sensorType == "THRUST" ||
iter->sensorType == "FAST_VOLTAGE"){
sum = std::accumulate(std::begin(wave.waveData), std::end(wave.waveData), 0.0);
double size = m_WaveChnData[i].waveData.size();
wave.mean = sum/size;
}else{
sum = 0.0;
}
if(iter->sensorType == "TACHOMETER"){
wave.TimeStamp = m_WaveChnData[i].TimeStamp;
//qDebug()<< "iCount" <<iCount<<endl;
ii ++;
}
wave.SpeedProfileSpeed = iter->SpeedProfileSpeed;
wave.wavesize = wave.waveData.size();
wave.SamleRate = iter->channelSamleRate;
wave.sensorType = iter->sensorType;
wave.channelId = iter->channelId;
wave.channelNo = theSize;
wave.Time = iCount;
wave.channelName = iter->channelName;
wave.pairChannelID = iter->pairChannelID;
wave.sensorEngineeringUnit = iter->sensorEngineeringUnit;
wave.speedRefChannelId = iter->speedRefChannelId;
wave.RMSValue = iter->RMSValue;
wave.iTrigger = iter->iTrigger;
wave.iKeyCount = iter->iKeyCount;
wave.iTriggerValue = iter->iTriggerValue;
wave.iHysteresis = iter->iHysteresis;
wave.tachAutoTach = iter->tachAutoTach;
wave.sensorGapVoltage = iter->sensorGapVoltage;
wave.sensorSensitivity = iter->sensorSensitivity;
switch(linecolor){
case 0:
wave.linColor = Qt::green ;
break;
case 1:
wave.linColor = QColor(30,144,255) ;
break;
case 2:
wave.linColor = QColor(255,182,193) ;
break;
case 3:
wave.linColor = Qt::cyan ;
break;
case 4:
wave.linColor = Qt::magenta ;
break;
case 5:
wave.linColor = Qt::yellow ;
break;
case 6:
wave.linColor = QColor(255,69,0) ;
break;
case 7:
wave.linColor = QColor(0, 255, 127) ;
break;
case 8:
wave.linColor = QColor(255,140,0) ;
break;
case 9:
wave.linColor = QColor(0, 191, 255) ;
break;
case 10:
wave.linColor = Qt::darkMagenta ;
break;
case 11:
wave.linColor = Qt::lightGray ;
break;
case 12:
wave.linColor = Qt::darkYellow ;
break;
case 13:
wave.linColor = QColor(153, 51, 250);
break;
case 14:
wave.linColor = QColor(255, 218, 185) ;
break;
case 15:
wave.linColor = QColor(0,199,140) ;
break;
default:
break;
}
m_vecPushData1.push_back(wave);
}
}
linecolor++;
if(linecolor > 15){
linecolor = 0;
}
qDebug() << "channelId"<<iter->channelId << endl;
mapWaveData.insert(iter->channelId,m_vecPushData1);
m_iRealCount = m_vecPushData1.size();
qDebug() << "m_iRealCount"<<m_iRealCount << endl;
qDebug()<<"mapWaveData size"<<mapWaveData.size()<<endl;
}
file.close();
free(buf0);
//qDebug() << "=====waveSpeedData time=====" <<mapWaveData[strChannelID].at(0).Time <<mapWaveData[speedChannelID].at(0).Time << endl;
qDebug() << "m_iRealCount" << m_iRealCount << endl;
//设置播放进度条
m_iCount = 0;
m_iCount = m_iRealCount;
QTime stopTime = QTime::currentTime();
qDebug() << "Time: " << startTime.msecsTo(stopTime) << "ms" <<endl;
delete progressDialog;
if(m_iRealCount < 1){
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("未读取到数据!"));
return;
}
QStringList strIDList,strChannleType,strChannleNameList;
QMap<QString,QVector<WAVE_DATA>>::Iterator iter2 = mapWaveData.begin();
for (; iter2 != mapWaveData.end(); iter2 ++)
{
if(!strIDList.contains(iter2.key()))
strIDList.push_back(iter2.key());
strChannleType.push_back(iter2.value()[0].sensorType);
strChannleNameList.push_back(iter2.value()[0].channelName);
}
qDebug() << "End1 " <<endl;
SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList);
}