diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index bfe6311..c90c8f0 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -104,62 +104,6 @@ return resultObj; } -QJsonObject HttpRequestController::initDeviceList(QString devType) -{ - QJsonObject resultObj; - - QString counterDevType = ""; - QMapIterator it(ConstCache::getInstance().deviceTypes); - while (it.hasNext()) - { - it.next(); - if (it.value().contains(devType) == true) - { - counterDevType = it.key(); - break; - } - } - - // 获取设备列表的接口地址 - QUrl url = baseUrl + "/device/list"; - QUrlQuery query; - query.addQueryItem("type", counterDevType); - url.setQuery(query); - - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Content-type", "application/json"); - request.setRawHeader("token", token.toLocal8Bit()); - request.setRawHeader("system", system.toLocal8Bit()); - - QNetworkReply * reply = httpUtil->sendGetRequest(request); - const QByteArray reply_data = reply->readAll(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { - resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - ConstCache::getInstance().deviceList.clear(); - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - ConstCache::getInstance().deviceList.append(item); - } - } - } else - { - resultObj.insert("code", -1); - } - - qDebug() << resultObj; - - return resultObj; -} - QJsonObject HttpRequestController::initDeviceList(QString devType, QString system) { QJsonObject resultObj; diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index bfe6311..c90c8f0 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -104,62 +104,6 @@ return resultObj; } -QJsonObject HttpRequestController::initDeviceList(QString devType) -{ - QJsonObject resultObj; - - QString counterDevType = ""; - QMapIterator it(ConstCache::getInstance().deviceTypes); - while (it.hasNext()) - { - it.next(); - if (it.value().contains(devType) == true) - { - counterDevType = it.key(); - break; - } - } - - // 获取设备列表的接口地址 - QUrl url = baseUrl + "/device/list"; - QUrlQuery query; - query.addQueryItem("type", counterDevType); - url.setQuery(query); - - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Content-type", "application/json"); - request.setRawHeader("token", token.toLocal8Bit()); - request.setRawHeader("system", system.toLocal8Bit()); - - QNetworkReply * reply = httpUtil->sendGetRequest(request); - const QByteArray reply_data = reply->readAll(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { - resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - ConstCache::getInstance().deviceList.clear(); - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - ConstCache::getInstance().deviceList.append(item); - } - } - } else - { - resultObj.insert("code", -1); - } - - qDebug() << resultObj; - - return resultObj; -} - QJsonObject HttpRequestController::initDeviceList(QString devType, QString system) { QJsonObject resultObj; diff --git a/CounterRealTime/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index a70e5aa..db9d36a 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -20,7 +20,6 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDictDeviceType(); - QJsonObject initDeviceList(QString devType); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getChannelList(QString deviceId); diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index bfe6311..c90c8f0 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -104,62 +104,6 @@ return resultObj; } -QJsonObject HttpRequestController::initDeviceList(QString devType) -{ - QJsonObject resultObj; - - QString counterDevType = ""; - QMapIterator it(ConstCache::getInstance().deviceTypes); - while (it.hasNext()) - { - it.next(); - if (it.value().contains(devType) == true) - { - counterDevType = it.key(); - break; - } - } - - // 获取设备列表的接口地址 - QUrl url = baseUrl + "/device/list"; - QUrlQuery query; - query.addQueryItem("type", counterDevType); - url.setQuery(query); - - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Content-type", "application/json"); - request.setRawHeader("token", token.toLocal8Bit()); - request.setRawHeader("system", system.toLocal8Bit()); - - QNetworkReply * reply = httpUtil->sendGetRequest(request); - const QByteArray reply_data = reply->readAll(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { - resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - ConstCache::getInstance().deviceList.clear(); - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - ConstCache::getInstance().deviceList.append(item); - } - } - } else - { - resultObj.insert("code", -1); - } - - qDebug() << resultObj; - - return resultObj; -} - QJsonObject HttpRequestController::initDeviceList(QString devType, QString system) { QJsonObject resultObj; diff --git a/CounterRealTime/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index a70e5aa..db9d36a 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -20,7 +20,6 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDictDeviceType(); - QJsonObject initDeviceList(QString devType); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getChannelList(QString deviceId); diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ccfa7ac..6b57aab 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -45,6 +45,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); + RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); BASE_URL = getProperty("http", "baseUrl").toString(); diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index bfe6311..c90c8f0 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -104,62 +104,6 @@ return resultObj; } -QJsonObject HttpRequestController::initDeviceList(QString devType) -{ - QJsonObject resultObj; - - QString counterDevType = ""; - QMapIterator it(ConstCache::getInstance().deviceTypes); - while (it.hasNext()) - { - it.next(); - if (it.value().contains(devType) == true) - { - counterDevType = it.key(); - break; - } - } - - // 获取设备列表的接口地址 - QUrl url = baseUrl + "/device/list"; - QUrlQuery query; - query.addQueryItem("type", counterDevType); - url.setQuery(query); - - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Content-type", "application/json"); - request.setRawHeader("token", token.toLocal8Bit()); - request.setRawHeader("system", system.toLocal8Bit()); - - QNetworkReply * reply = httpUtil->sendGetRequest(request); - const QByteArray reply_data = reply->readAll(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { - resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - ConstCache::getInstance().deviceList.clear(); - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - ConstCache::getInstance().deviceList.append(item); - } - } - } else - { - resultObj.insert("code", -1); - } - - qDebug() << resultObj; - - return resultObj; -} - QJsonObject HttpRequestController::initDeviceList(QString devType, QString system) { QJsonObject resultObj; diff --git a/CounterRealTime/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index a70e5aa..db9d36a 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -20,7 +20,6 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDictDeviceType(); - QJsonObject initDeviceList(QString devType); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getChannelList(QString deviceId); diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ccfa7ac..6b57aab 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -45,6 +45,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); + RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); BASE_URL = getProperty("http", "baseUrl").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 93f40ce..ae345ff 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -52,6 +52,7 @@ qint8 MASTER; qint8 DISPLAY_COUNT; quint16 SERVER_PORT; + qint8 RESIDUAL_CALC_SEC; QString BASE_URL; diff --git a/ClockUtils/MainWindow.cpp b/ClockUtils/MainWindow.cpp index db060b5..5810fc3 100644 --- a/ClockUtils/MainWindow.cpp +++ b/ClockUtils/MainWindow.cpp @@ -22,7 +22,6 @@ void MainWindow::on_btnOpenClockLogFile_clicked() { QString filename = QFileDialog::getOpenFileName(this, "选择日志", QDir::currentPath(), "Log File (*.log)"); - qDebug() << filename; if (filename.isEmpty() == true) { return; @@ -68,20 +67,17 @@ this->clockDataSecond.append(item); } - - qDebug() << this->clockDataSecond.size(); } void MainWindow::calcResidualMinute() { -// QDateTime qdt = QDateTime::fromMSecsSinceEpoch(this->clockDataSecond.at(0).at(0)); QVector times; for (int i = 0; i < this->clockDataSecond.size(); i++) { QString minute = QDateTime::fromMSecsSinceEpoch(((QString) this->clockDataSecond.at(i).at(0)).toULongLong()).toString("yyyy-MM-dd HH:mm"); if (times.contains(minute) == false) { times.append(minute); - qulonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; + qlonglong tm = ((QString) this->clockDataSecond.at(i).at(0)).toULongLong() / 1000; QVector timeVec; QVector dataVec; @@ -90,9 +86,9 @@ if (i - RESIDUAL_HALF_COUNT + 1 >= 0) { for (int j = RESIDUAL_HALF_COUNT - 1; j > 0 ; j--) { - qulonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; + qlonglong tm1 = ((QString) this->clockDataSecond.at(i - j).at(0)).toULongLong() / 1000; if (tm - tm1 <= RESIDUAL_HALF_COUNT) { - timeVec.append(tm - tm1); + timeVec.append(tm1 - tm); dataVec.append(((QString) this->clockDataSecond.at(i - j).at(1)).toDouble()); } } @@ -101,7 +97,7 @@ if (i + RESIDUAL_HALF_COUNT + 1 < this->clockDataSecond.size()) { for (int j = 0; j <= RESIDUAL_HALF_COUNT ; j++) { - qulonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; + qlonglong tm2 = ((QString) this->clockDataSecond.at(i + j).at(0)).toULongLong() / 1000; if (tm2 - tm <= RESIDUAL_HALF_COUNT) { timeVec.append(tm2 - tm); dataVec.append(((QString) this->clockDataSecond.at(i + j).at(1)).toDouble()); @@ -113,7 +109,6 @@ lineReg.xArray = timeVec.data(); lineReg.yArray = dataVec.data(); lineReg.calcLineRegParams(timeVec.size()); - qDebug() << timeVec.size(); double value = lineReg.slope * 0 + lineReg.intercept; QStringList item; @@ -125,3 +120,18 @@ } } } + +void MainWindow::on_btnTimeFormat_clicked() +{ + QString tsStr = ui->iptTimestamp->text(); + qlonglong ts = tsStr.toLongLong(); + QDateTime dt; + if (tsStr.length() >= 11) + { + dt = QDateTime::fromMSecsSinceEpoch(ts); + } else { + dt = QDateTime::fromSecsSinceEpoch(ts); + } + + ui->labelDateTime->setText(dt.toString("yyyy-MM-dd HH:mm:ss.zzz")); +} diff --git a/ClockUtils/MainWindow.h b/ClockUtils/MainWindow.h index f0d3911..8597c27 100644 --- a/ClockUtils/MainWindow.h +++ b/ClockUtils/MainWindow.h @@ -23,6 +23,8 @@ void on_btnResiMi_clicked(); + void on_btnTimeFormat_clicked(); + private: Ui::MainWindow *ui; diff --git a/ClockUtils/MainWindow.ui b/ClockUtils/MainWindow.ui index dcb9c7c..25a126b 100644 --- a/ClockUtils/MainWindow.ui +++ b/ClockUtils/MainWindow.ui @@ -66,6 +66,68 @@ + + + + 0 + 100 + 400 + 16 + + + + Qt::Horizontal + + + + + + 30 + 130 + 160 + 24 + + + + + + + 230 + 130 + 80 + 24 + + + + 时间转换 + + + + + + 20 + 180 + 160 + 16 + + + + + + + + + + 220 + 180 + 160 + 16 + + + + + + diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 971cdf7..842c69d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -1,5 +1,6 @@ #include "CounterDevice.h" +#include #include #include @@ -95,11 +96,7 @@ { this->dataBuff.append(data); -// QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd"); -// QString filename = "serial_" + devCode + ".log"; -// QString content = QString::fromLocal8Bit(data.data()); -// QLogUtil::writeRawDataLogByDate(date, filename, content); -// qDebug() << this->dataBuff; + QDateTime now = QDateTime::currentDateTime(); CounterDataDto * counterData = new CounterDataDto(this); if (CounterProtocolXH::checkFrame(this->dataBuff) == true) @@ -113,15 +110,20 @@ if (parse == true) { this->dataBuff.clear(); - QDateTime now = QDateTime::currentDateTime(); counterData->devCode = this->devCode; counterData->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } + + // 到达拟合计算时间点时 触发 + if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) + { + this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); + } } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { - qDebug() << QString("%1").arg(this->dataBuff.size()); + std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; this->dataBuff.clear(); } @@ -146,6 +148,7 @@ QString msgLogFilename = "msg_" + devCode + ".log"; CounterChannel * refChanPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(counterData->channelRefId)); + this->refChannelNo = counterData->channelRefId; double refDelay = 0.0; if (refChanPtr != nullptr && refChanPtr->getDelays().isEmpty() == false) { refDelay = refChanPtr->getDelays().toDouble(); @@ -154,27 +157,26 @@ // 2. 各个通道的clock diff数据 for (int i = 1; i <= counterData->channelActiveArray.size(); i++) { - // 恢复传参考通道的数据,传0 -// if (counterData->channelRefId == i) -// { -// continue; -// } if (counterData->channelActiveArray.at(i-1).toUInt() == 1) { - QString chFilename("%1_CH_%2.log"); - chFilename = chFilename.arg(devCode); - if (i < 10) + if (counterData->channelRefId != i) { - chFilename = chFilename.arg(QString("0%1").arg(i)); - } else - { - chFilename = chFilename.arg(i); + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + // 写通道数据日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); } - QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - - // append data into hisDataList + // 加到hisDataList中 用于绘制图表 CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(QString("%1-%2").arg(deviceId).arg(i)); if (channelPtr != nullptr && channelPtr->isActive() == true) { @@ -209,3 +211,72 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } + +void CounterDevice::calcResidualClockData(qlonglong tm) +{ + qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); + QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); + + QJsonArray messageArray; + QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; + + for (int j = 1; j <= 16; j++) + { + QString channelKey = QString("%1-%2").arg(deviceId).arg(j); + if (ConstCache::getInstance().channelMap.contains(channelKey)) + { + CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); + QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); + + QVector timeVec; + QVector dataVec; + + for (int k = 0; k < minuteDataList.size(); k++) + { + qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; + if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { + timeVec.append(tmData - tm); + dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); + } + } + + LinearRegression lineReg; + lineReg.xArray = timeVec.data(); + lineReg.yArray = dataVec.data(); + lineReg.calcLineRegParams(timeVec.size()); + double value = lineReg.slope * 0 + lineReg.intercept; + + if (j != this->refChannelNo) + { + // 写入通道的拟合数据日志 + QString chFilename("MINUTE_%1_CH_%2.log"); + chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); + + // 写日志 + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + } + + // 生成json对象 + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->refChannelNo); + dataObj.insert("dataValue", QString::number(value, 'f', 12)); + dataObj.insert("rawValue", QString::number(value, 'f', 12)); + dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); + jsonObj.insert("data", dataObj); + + jsonObj.insert("channelNo", j); + jsonObj.insert("ts", tm * 1000); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("master", SettingConfig::getInstance().MASTER); + jsonObj.insert("deviceId", deviceId); + messageArray.append(jsonObj); + } + } + + QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + + qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); +} diff --git a/CounterRealTime/CounterDevice.h b/CounterRealTime/CounterDevice.h index b13d9f2..107177d 100644 --- a/CounterRealTime/CounterDevice.h +++ b/CounterRealTime/CounterDevice.h @@ -11,6 +11,7 @@ #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" #include "common/ConstCache.h" +#include "common/LinearRegression.h" #include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject @@ -45,6 +46,7 @@ QString comName; // 串口名 int baudRate; // 波特率 int isUse; + int refChannelNo; // 计数器所在的列索引 int formColIndex; @@ -54,6 +56,7 @@ QByteArray dataBuff; void afterFramePhase(CounterDataDto * counterData); + void calcResidualClockData(qlonglong tm); signals: void sendDataToDraw(QJsonArray messageArray); diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 34bf3d6..78a410e 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -11,10 +11,6 @@ move(0, 0); resize(SettingConfig::getInstance().WINDOW_WIDTH, SettingConfig::getInstance().WINDOW_HEIGHT); - QDateTime tm; - tm.setMSecsSinceEpoch(1665370695412); - qDebug() << tm.toString("yyyy-MM-dd HH:mm:ss"); - settingForm = new CounterSettingForm(); connect(settingForm, &CounterSettingForm::channelSettingSubmit, this, &CounterWindowRT::onChannelSettingSubmit); @@ -73,7 +69,7 @@ devicePtr->initSerialPort(); } - httpReq->getSysClockAlarmCount(); +// httpReq->getSysClockAlarmCount(); } CounterWindowRT::~CounterWindowRT() diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 09c042a..9b193f3 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -25,7 +25,6 @@ } QMap deviceTypes; - QList deviceList; QMap deviceMap; // 计数器对象集合 key=deviceId QList deviceIdLoopA; // A路计数器对象集合 key=deviceId diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index bfe6311..c90c8f0 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -104,62 +104,6 @@ return resultObj; } -QJsonObject HttpRequestController::initDeviceList(QString devType) -{ - QJsonObject resultObj; - - QString counterDevType = ""; - QMapIterator it(ConstCache::getInstance().deviceTypes); - while (it.hasNext()) - { - it.next(); - if (it.value().contains(devType) == true) - { - counterDevType = it.key(); - break; - } - } - - // 获取设备列表的接口地址 - QUrl url = baseUrl + "/device/list"; - QUrlQuery query; - query.addQueryItem("type", counterDevType); - url.setQuery(query); - - QNetworkRequest request; - request.setUrl(url); - request.setRawHeader("Content-type", "application/json"); - request.setRawHeader("token", token.toLocal8Bit()); - request.setRawHeader("system", system.toLocal8Bit()); - - QNetworkReply * reply = httpUtil->sendGetRequest(request); - const QByteArray reply_data = reply->readAll(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { - resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - ConstCache::getInstance().deviceList.clear(); - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - ConstCache::getInstance().deviceList.append(item); - } - } - } else - { - resultObj.insert("code", -1); - } - - qDebug() << resultObj; - - return resultObj; -} - QJsonObject HttpRequestController::initDeviceList(QString devType, QString system) { QJsonObject resultObj; diff --git a/CounterRealTime/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index a70e5aa..db9d36a 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -20,7 +20,6 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDictDeviceType(); - QJsonObject initDeviceList(QString devType); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getChannelList(QString deviceId); diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ccfa7ac..6b57aab 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -45,6 +45,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); + RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); BASE_URL = getProperty("http", "baseUrl").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 93f40ce..ae345ff 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -52,6 +52,7 @@ qint8 MASTER; qint8 DISPLAY_COUNT; quint16 SERVER_PORT; + qint8 RESIDUAL_CALC_SEC; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index 2ea0a01..c7ed463 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -24,6 +24,7 @@ master=1 displayCount=4 serverPort=5905 +residualCalcSec=30 [http] baseUrl="http://192.168.20.135:11410"