diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/conf/config.ini b/conf/config.ini index 6c43ea9..39ff360 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -5,6 +5,7 @@ [dev] channelCount=16 +skipHeader=5 [log] basePath="/home/admin/Qt/ZXSSCJ-Release/PhaseCompAcq/logs/" diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/conf/config.ini b/conf/config.ini index 6c43ea9..39ff360 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -5,6 +5,7 @@ [dev] channelCount=16 +skipHeader=5 [log] basePath="/home/admin/Qt/ZXSSCJ-Release/PhaseCompAcq/logs/" diff --git a/protocol/PhaseProtocolBM.cpp b/protocol/PhaseProtocolBM.cpp index 6b5ca73..ad930e1 100644 --- a/protocol/PhaseProtocolBM.cpp +++ b/protocol/PhaseProtocolBM.cpp @@ -37,13 +37,17 @@ if (channelRawData == CALCULATE_OFFSET) { dataObj->channelActive.append("0"); + dataObj->rawPhaseDiffData.append(0); + dataObj->channelBeforeDelay.append(0.00); dataObj->channelData.append(0.00); dataObj->channelDataStr.append("0.00"); } else { double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR; dataObj->channelActive.append("1"); - dataObj->channelData.append(phase); + dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); + dataObj->channelBeforeDelay.append(phase); + dataObj->channelData.append(phase); // 暂时不加补偿值 dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } } diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/conf/config.ini b/conf/config.ini index 6c43ea9..39ff360 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -5,6 +5,7 @@ [dev] channelCount=16 +skipHeader=5 [log] basePath="/home/admin/Qt/ZXSSCJ-Release/PhaseCompAcq/logs/" diff --git a/protocol/PhaseProtocolBM.cpp b/protocol/PhaseProtocolBM.cpp index 6b5ca73..ad930e1 100644 --- a/protocol/PhaseProtocolBM.cpp +++ b/protocol/PhaseProtocolBM.cpp @@ -37,13 +37,17 @@ if (channelRawData == CALCULATE_OFFSET) { dataObj->channelActive.append("0"); + dataObj->rawPhaseDiffData.append(0); + dataObj->channelBeforeDelay.append(0.00); dataObj->channelData.append(0.00); dataObj->channelDataStr.append("0.00"); } else { double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR; dataObj->channelActive.append("1"); - dataObj->channelData.append(phase); + dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); + dataObj->channelBeforeDelay.append(phase); + dataObj->channelData.append(phase); // 暂时不加补偿值 dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } } diff --git a/protocol/dto/PhaseDataDto.cpp b/protocol/dto/PhaseDataDto.cpp deleted file mode 100644 index 5163335..0000000 --- a/protocol/dto/PhaseDataDto.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "PhaseDataDto.h" - -PhaseDataDto::PhaseDataDto(QObject *parent) : QObject(parent) -{ - -} - -QJsonObject PhaseDataDto::toJSON(int i) -{ - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("dataValue", this->channelDataStr.at(i)); - dataObj.insert("frameId", this->frameId); - - jsonObj.insert("channelNo", (i + 1)); - jsonObj.insert("ts", this->milisecond); - jsonObj.insert("data", dataObj); - - return jsonObj; -} diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/conf/config.ini b/conf/config.ini index 6c43ea9..39ff360 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -5,6 +5,7 @@ [dev] channelCount=16 +skipHeader=5 [log] basePath="/home/admin/Qt/ZXSSCJ-Release/PhaseCompAcq/logs/" diff --git a/protocol/PhaseProtocolBM.cpp b/protocol/PhaseProtocolBM.cpp index 6b5ca73..ad930e1 100644 --- a/protocol/PhaseProtocolBM.cpp +++ b/protocol/PhaseProtocolBM.cpp @@ -37,13 +37,17 @@ if (channelRawData == CALCULATE_OFFSET) { dataObj->channelActive.append("0"); + dataObj->rawPhaseDiffData.append(0); + dataObj->channelBeforeDelay.append(0.00); dataObj->channelData.append(0.00); dataObj->channelDataStr.append("0.00"); } else { double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR; dataObj->channelActive.append("1"); - dataObj->channelData.append(phase); + dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); + dataObj->channelBeforeDelay.append(phase); + dataObj->channelData.append(phase); // 暂时不加补偿值 dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } } diff --git a/protocol/dto/PhaseDataDto.cpp b/protocol/dto/PhaseDataDto.cpp deleted file mode 100644 index 5163335..0000000 --- a/protocol/dto/PhaseDataDto.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "PhaseDataDto.h" - -PhaseDataDto::PhaseDataDto(QObject *parent) : QObject(parent) -{ - -} - -QJsonObject PhaseDataDto::toJSON(int i) -{ - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("dataValue", this->channelDataStr.at(i)); - dataObj.insert("frameId", this->frameId); - - jsonObj.insert("channelNo", (i + 1)); - jsonObj.insert("ts", this->milisecond); - jsonObj.insert("data", dataObj); - - return jsonObj; -} diff --git a/protocol/dto/PhaseDataDto.h b/protocol/dto/PhaseDataDto.h index 37ec593..307f2c4 100644 --- a/protocol/dto/PhaseDataDto.h +++ b/protocol/dto/PhaseDataDto.h @@ -4,12 +4,13 @@ #include #include #include +#include class PhaseDataDto : public QObject { Q_OBJECT public: - explicit PhaseDataDto(QObject *parent = nullptr); + explicit PhaseDataDto(QObject *parent = nullptr) {} QString frameId; // 帧id QString timestamp; // 时间戳字符串 @@ -19,10 +20,11 @@ QString devCode; QString devStatus; QList channelActive; - QList channelData; - QList channelDataStr; - QVector> channelAllan; - QJsonObject toJSON(int i); + QList rawPhaseDiffData; // 原始相差数据 + QList channelBeforeDelay; // 补偿前的时差数据 + QList channelData; // 补偿后的时差数据 + QList channelDataStr; // 补偿后的时差数据格式化显示字符串 + QVector> channelAllan; // allan方差值 signals: diff --git a/ChannelItem.cpp b/ChannelItem.cpp index f3af9d8..cc5e006 100644 --- a/ChannelItem.cpp +++ b/ChannelItem.cpp @@ -30,28 +30,30 @@ index = value; } -double ChannelItem::updatePhaseMeasureData(double raw,QVector vec,int size) +void ChannelItem::updatePhaseMeasureData(PhaseDataDto * phaseData) { - double ps = raw * 1e-3; - ui->rawValue->setText(QString::number(ps, 'f', 15) + "ps"); - ui->channelValue->setText(QString::number(ps + channelDelay * 1e-12, 'f', 15) + "ps"); + int size = phaseVector.at(index).size() - SettingConfig::getInstance().SKIP_HEADER; + if (size < 0) size = 0; + double ps = phaseData->channelBeforeDelay.at(index) * 1e12; // 显示ps数据 + ui->rawValue->setText(QString::number(ps, 'f', 0) + "ps"); // 原始数据显示单位为ps + ui->channelValue->setText(QString::number(ps + channelDelay, 'f', 0) + "ps"); // 补偿值的单位也是ps, 补偿后也显示为ps ui->samplingOne->setText(QString::number(size)); ui->samplingTen->setText(QString::number((int)size/10)); ui->samplingHund->setText(QString::number((int)size/100)); ui->samplingThou->setText(QString::number((int)size/1000)); ui->samplingTT->setText(QString::number((int)size/10000)); - ui->stabilityOne->setText(QString::number(vec.at(0), 'f', 15)); - ui->stabilityTen->setText(QString::number(vec.at(1), 'f', 15)); - ui->stabilityHund->setText(QString::number(vec.at(2), 'f', 15)); - ui->stabilityThou->setText(QString::number(vec.at(3), 'f', 15)); - ui->stabilityTT->setText(QString::number(vec.at(4), 'f', 15)); - return raw + channelDelay * 1e-9; + + ui->stabilityOne->setText(QString::number(phaseData->channelAllan.at(index).at(0))); + ui->stabilityTen->setText(QString::number(phaseData->channelAllan.at(index).at(1))); + ui->stabilityHund->setText(QString::number(phaseData->channelAllan.at(index).at(2))); + ui->stabilityThou->setText(QString::number(phaseData->channelAllan.at(index).at(3))); + ui->stabilityTT->setText(QString::number(phaseData->channelAllan.at(index).at(4))); } -void ChannelItem::on_delay_valueChanged(double value) +void ChannelItem::on_delay_valueChanged(int value) { channelDelay = value; - SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); - QString str = SettingConfig::getInstance().DELAY_ARR.join(","); + SettingConfig::getInstance().DELAY_ARR.replace(index, QString("%1").arg(value)); + QString str = SettingConfig::getInstance().DELAY_ARR.join(","); SettingConfig::getInstance().setConProperty("delay", "delayArr", str); } diff --git a/ChannelItem.h b/ChannelItem.h index b3ac948..b1bc452 100644 --- a/ChannelItem.h +++ b/ChannelItem.h @@ -2,8 +2,11 @@ #define CHANNELITEM_H #include +#include "protocol/dto/PhaseDataDto.h" #include "common/utils/SettingConfig.h" +extern QVector> phaseVector; + namespace Ui { class ChannelItem; } @@ -18,10 +21,11 @@ double getChannelDelay(); void setIndex(int value); - double updatePhaseMeasureData(double channelValue,QVector vec,int size); + void updatePhaseMeasureData(PhaseDataDto * phaseData); void setChannelDelay(double value); + private slots: - void on_delay_valueChanged(double value); + void on_delay_valueChanged(int value); private: Ui::ChannelItem *ui; diff --git a/ChannelItem.ui b/ChannelItem.ui index 3236187..77b6a14 100644 --- a/ChannelItem.ui +++ b/ChannelItem.ui @@ -358,12 +358,57 @@ - 372 + 80 20 + + + + + 微软雅黑 + 12 + + + + + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + + + + + + 微软雅黑 + 12 + + + + + + + Qt::AlignCenter + + + @@ -491,23 +536,17 @@ - 0.00 s + 0 ps - + - ns + ps - - 3 - - - -99.000000000000000 - - - 0.001000000000000 + + 99999 @@ -520,7 +559,7 @@ - 0.00 s + 0 ps diff --git a/DataProcessAlgorithm.cpp b/DataProcessAlgorithm.cpp index 4a85549..d0e5c31 100644 --- a/DataProcessAlgorithm.cpp +++ b/DataProcessAlgorithm.cpp @@ -6,24 +6,21 @@ } -double DataProcessAlgorithm::allan(int index,int d, int aN, int ai) +double DataProcessAlgorithm::allan(int index, int d, int aN, int start) { - int j = 0; - int i = 0; + int i = start - 1; // 从start处开始取数进行计算,避免开始采集时的数据不稳定带来的影响 double tau0 = 1; //tau0是基本采样间隔,由计数器或比相仪的最小采样间隔决定,最小为1s double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN]; double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 - for (i = 0; i < aN - 2 * d; i = i+1) + for (; i < aN - 2 * d; i++) { y[i] = pow(phaseVector[index][i+2*d] - 2 * phaseVector[index][i+d] + phaseVector[index][i], 2); sum=sum+y[i]; - j+=1; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta - j = 0; - return allan[ai]; + return allan[1]; } diff --git a/DataProcessAlgorithm.h b/DataProcessAlgorithm.h index 138880f..16e5fcd 100644 --- a/DataProcessAlgorithm.h +++ b/DataProcessAlgorithm.h @@ -10,7 +10,7 @@ public: explicit DataProcessAlgorithm(QObject *parent = nullptr); - static double allan(int index,int d, int aN, int ai); //double x[], + static double allan(int index,int d, int aN, int start); //double x[], signals: diff --git a/PhaseDevice.cpp b/PhaseDevice.cpp index afe8d3e..7c5e8a9 100644 --- a/PhaseDevice.cpp +++ b/PhaseDevice.cpp @@ -75,27 +75,48 @@ QVector vectorZero(5); QVector vector(5); + // 3.存+allen for (int i = 0; i < phaseData->channelActive.size(); i++) { - if (phaseData->channelActive.at(i) == "1") { - phaseVector[i].append(phaseData->channelData.at(i)); // 存 - int size = phaseVector[i].size(); - if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, 1); else vector[0] = 0; - if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, 1); else vector[1] = 0; - if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, 1); else vector[2] = 0; - if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, 1); else vector[3] = 0; - if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, 1); else vector[4] = 0; + // 3.1 计算补偿的值 + double channelDelay = SettingConfig::getInstance().DELAY_ARR.at(i).toInt() * 1e-12; // 单位为ps + phaseData->channelData[i] = phaseData->channelBeforeDelay.at(i) + channelDelay; + phaseData->channelDataStr[i] = QString::number(phaseData->channelData.at(i), 'f', 15); + + // 3.2 将通道数据写日志 + QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); + QString channelDataStr = QString("%1 [%2] %3 %4 %5") + .arg(phaseData->timestamp) + .arg(phaseData->frameId) + .arg(phaseData->channelDataStr.at(i)) + .arg(QString::number(channelDelay)) + .arg(QString::number(phaseData->rawPhaseDiffData.at(i), 'f', 0)); + std::cout << channelDataStr.toStdString() << std::endl; + + QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + + // 3.3 将补偿后的时差数据存入数据栈 + phaseVector[i].append(phaseData->channelData.at(i)); + + // 3.4 分别计算不同时间维度的稳定度 + int size = phaseVector[i].size() - SettingConfig::getInstance().SKIP_HEADER; + if(size>=5) vector[0] = DataProcessAlgorithm::allan(i, 1, size, SettingConfig::getInstance().SKIP_HEADER); else vector[0] = 0; + if(size>=50) vector[1] = DataProcessAlgorithm::allan(i, 10, size, SettingConfig::getInstance().SKIP_HEADER); else vector[1] = 0; + if(size>=500) vector[2] = DataProcessAlgorithm::allan(i, 100, size, SettingConfig::getInstance().SKIP_HEADER); else vector[2] = 0; + if(size>=5000) vector[3] = DataProcessAlgorithm::allan(i, 1000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[3] = 0; + if(size>=50000) vector[4] = DataProcessAlgorithm::allan(i, 10000, size, SettingConfig::getInstance().SKIP_HEADER); else vector[4] = 0; + + // 3.5 将稳定度计算结果存入 phaseData->channelAllan.append(vector); - } - else + } else { phaseData->channelAllan.append(vectorZero); } - } + // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(phaseData); } diff --git a/PhaseMeasure.pro.user b/PhaseMeasure.pro.user index f111ef2..ad530f9 100644 --- a/PhaseMeasure.pro.user +++ b/PhaseMeasure.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/PhaseWindow.cpp b/PhaseWindow.cpp index 581cb7a..05273d7 100644 --- a/PhaseWindow.cpp +++ b/PhaseWindow.cpp @@ -73,22 +73,7 @@ if (phaseData->channelActive.at(i) == "1") { ChannelItem * channel = channelItemList.at(i); - // 存 - phaseVector[i].append(phaseData->channelData.at(i)); - int size = phaseVector.at(i).size(); - double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size); - - // 写日志 - QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3 %4 %5") - .arg(phaseData->timestamp) - .arg(phaseData->frameId) - .arg(phaseData->channelDataStr.at(i)) - .arg(QString::number(channel->getChannelDelay())) - .arg(QString::number(phaseValue, 'f', 15)); - std::cout << channelDataStr.toStdString() << std::endl; - - QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr); + channel->updatePhaseMeasureData(phaseData); } } } @@ -159,7 +144,10 @@ void PhaseWindow::on_exitButt_clicked() { - QApplication::exit(0); + // 发送结束指令 + device->stopWork(); + + QTimer::singleShot(500, qApp, SLOT(quit())); } void PhaseWindow::on_startButt_clicked() @@ -173,27 +161,34 @@ { QDir *folder = new QDir; bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH); - if(!exist) //生成base文件夹 + if(!exist) // 生成base文件夹 { bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH); } - //生成当前时间文件夹 + + // 生成当前时间文件夹 QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss"); - exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(!exist) { - bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName); + bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH + fileName); if(ok) { currentFileName = fileName; QMessageBox::warning(this, tr("开始"), tr("开始成功")); } } - } + void PhaseWindow::on_endButt_clicked() { currentFileName = ""; - //发送结束指令 + // 清空已经存储的数据 + for (int i = 0; i < phaseVector.size(); i++) + { + phaseVector[i].clear(); + } + + // 发送结束指令 device->stopWork(); } diff --git a/common/utils/QLogUtil.cpp b/common/utils/QLogUtil.cpp index add56a7..e8e9c4e 100644 --- a/common/utils/QLogUtil.cpp +++ b/common/utils/QLogUtil.cpp @@ -59,8 +59,10 @@ void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) { + if(currentFileName == "" ) return; QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; - QString datePath = basePath + date + "/"; + QString currentPath = basePath + currentFileName + "/"; + QString datePath = currentPath + date + "/"; QStringList pathList; pathList.append(basePath); diff --git a/common/utils/SettingConfig.cpp b/common/utils/SettingConfig.cpp index d68ad93..0fe0adf 100644 --- a/common/utils/SettingConfig.cpp +++ b/common/utils/SettingConfig.cpp @@ -24,6 +24,7 @@ LISTEN_PORT = getProperty("net", "listenPort").toUInt(); CHANNEL_COUNT = getProperty("dev", "channelCount").toUInt(); + SKIP_HEADER = getProperty("dev", "skipHeader").toUInt(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); DELAY_ARR = getProperty("delay", "delayArr").toString().split(","); diff --git a/common/utils/SettingConfig.h b/common/utils/SettingConfig.h index 3a3d92e..33502de 100644 --- a/common/utils/SettingConfig.h +++ b/common/utils/SettingConfig.h @@ -34,6 +34,7 @@ quint16 LISTEN_PORT; quint8 CHANNEL_COUNT; + quint8 SKIP_HEADER; QString BASE_LOG_PATH; diff --git a/common/utils/UDPClientUtil.cpp b/common/utils/UDPClientUtil.cpp index b7ebbe0..23244e9 100644 --- a/common/utils/UDPClientUtil.cpp +++ b/common/utils/UDPClientUtil.cpp @@ -7,7 +7,7 @@ { client = new QUdpSocket(this); - client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); +// client->bind(QHostAddress("192.168.0.201"), SettingConfig::getInstance().LISTEN_PORT); connect(client, &QUdpSocket::readyRead, this, &UDPClientUtil::readData); } diff --git a/conf/config.ini b/conf/config.ini index 6c43ea9..39ff360 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -5,6 +5,7 @@ [dev] channelCount=16 +skipHeader=5 [log] basePath="/home/admin/Qt/ZXSSCJ-Release/PhaseCompAcq/logs/" diff --git a/protocol/PhaseProtocolBM.cpp b/protocol/PhaseProtocolBM.cpp index 6b5ca73..ad930e1 100644 --- a/protocol/PhaseProtocolBM.cpp +++ b/protocol/PhaseProtocolBM.cpp @@ -37,13 +37,17 @@ if (channelRawData == CALCULATE_OFFSET) { dataObj->channelActive.append("0"); + dataObj->rawPhaseDiffData.append(0); + dataObj->channelBeforeDelay.append(0.00); dataObj->channelData.append(0.00); dataObj->channelDataStr.append("0.00"); } else { double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR; dataObj->channelActive.append("1"); - dataObj->channelData.append(phase); + dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); + dataObj->channelBeforeDelay.append(phase); + dataObj->channelData.append(phase); // 暂时不加补偿值 dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } } diff --git a/protocol/dto/PhaseDataDto.cpp b/protocol/dto/PhaseDataDto.cpp deleted file mode 100644 index 5163335..0000000 --- a/protocol/dto/PhaseDataDto.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "PhaseDataDto.h" - -PhaseDataDto::PhaseDataDto(QObject *parent) : QObject(parent) -{ - -} - -QJsonObject PhaseDataDto::toJSON(int i) -{ - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("dataValue", this->channelDataStr.at(i)); - dataObj.insert("frameId", this->frameId); - - jsonObj.insert("channelNo", (i + 1)); - jsonObj.insert("ts", this->milisecond); - jsonObj.insert("data", dataObj); - - return jsonObj; -} diff --git a/protocol/dto/PhaseDataDto.h b/protocol/dto/PhaseDataDto.h index 37ec593..307f2c4 100644 --- a/protocol/dto/PhaseDataDto.h +++ b/protocol/dto/PhaseDataDto.h @@ -4,12 +4,13 @@ #include #include #include +#include class PhaseDataDto : public QObject { Q_OBJECT public: - explicit PhaseDataDto(QObject *parent = nullptr); + explicit PhaseDataDto(QObject *parent = nullptr) {} QString frameId; // 帧id QString timestamp; // 时间戳字符串 @@ -19,10 +20,11 @@ QString devCode; QString devStatus; QList channelActive; - QList channelData; - QList channelDataStr; - QVector> channelAllan; - QJsonObject toJSON(int i); + QList rawPhaseDiffData; // 原始相差数据 + QList channelBeforeDelay; // 补偿前的时差数据 + QList channelData; // 补偿后的时差数据 + QList channelDataStr; // 补偿后的时差数据格式化显示字符串 + QVector> channelAllan; // allan方差值 signals: diff --git a/protocol/protocol.pri b/protocol/protocol.pri index d998e2e..183367e 100644 --- a/protocol/protocol.pri +++ b/protocol/protocol.pri @@ -1,6 +1,5 @@ SOURCES += $$PWD/PhaseProtocolBM.cpp -SOURCES += $$PWD/dto/PhaseDataDto.cpp HEADERS += $$PWD/PhaseProtocolBM.h HEADERS += $$PWD/dto/PhaseDataDto.h