3500/DataGraphView.cpp

836 lines
34 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
ui->widget_TimeGraph->yAxis->setRange(minimum,biggest);
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);
}