diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h deleted file mode 100644 index 068f0b1..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SIGNALGENERATORFRAMEDTO_H -#define SIGNALGENERATORFRAMEDTO_H - -#include -#include -#include - -class SignalGeneratorFrameDto : public QObject -{ - Q_OBJECT -public: - explicit SignalGeneratorFrameDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // SIGNALGENERATORFRAMEDTO_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h deleted file mode 100644 index 068f0b1..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SIGNALGENERATORFRAMEDTO_H -#define SIGNALGENERATORFRAMEDTO_H - -#include -#include -#include - -class SignalGeneratorFrameDto : public QObject -{ - Q_OBJECT -public: - explicit SignalGeneratorFrameDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // SIGNALGENERATORFRAMEDTO_H diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp new file mode 100644 index 0000000..67acc56 --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp @@ -0,0 +1,6 @@ +#include "SignalGeneratorSetting.h" + +SignalGeneratorSetting::SignalGeneratorSetting(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h deleted file mode 100644 index 068f0b1..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SIGNALGENERATORFRAMEDTO_H -#define SIGNALGENERATORFRAMEDTO_H - -#include -#include -#include - -class SignalGeneratorFrameDto : public QObject -{ - Q_OBJECT -public: - explicit SignalGeneratorFrameDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // SIGNALGENERATORFRAMEDTO_H diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp new file mode 100644 index 0000000..67acc56 --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp @@ -0,0 +1,6 @@ +#include "SignalGeneratorSetting.h" + +SignalGeneratorSetting::SignalGeneratorSetting(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h new file mode 100644 index 0000000..d66786e --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h @@ -0,0 +1,28 @@ +#ifndef SIGNALGENERATORSETTING_H +#define SIGNALGENERATORSETTING_H + +#include + +#include "DeviceFrameBaseDto.h" + +class SignalGeneratorSetting : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit SignalGeneratorSetting(QObject *parent = nullptr); + + qint8 leapSecondSet; + qint8 singleSynchSet; + QString dateSet; + qlonglong secondWidthSet; + qint8 bacRatioSet; + float bacRangeSet; + qlonglong oppsPhaseShiftSet; + QString leapTimestampSet; + QString mjdDateSet; + QString timeSet; + + void fromJSON(QJsonObject command); +}; + +#endif // SIGNALGENERATORSETTING_H diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h deleted file mode 100644 index 068f0b1..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SIGNALGENERATORFRAMEDTO_H -#define SIGNALGENERATORFRAMEDTO_H - -#include -#include -#include - -class SignalGeneratorFrameDto : public QObject -{ - Q_OBJECT -public: - explicit SignalGeneratorFrameDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // SIGNALGENERATORFRAMEDTO_H diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp new file mode 100644 index 0000000..67acc56 --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp @@ -0,0 +1,6 @@ +#include "SignalGeneratorSetting.h" + +SignalGeneratorSetting::SignalGeneratorSetting(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h new file mode 100644 index 0000000..d66786e --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h @@ -0,0 +1,28 @@ +#ifndef SIGNALGENERATORSETTING_H +#define SIGNALGENERATORSETTING_H + +#include + +#include "DeviceFrameBaseDto.h" + +class SignalGeneratorSetting : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit SignalGeneratorSetting(QObject *parent = nullptr); + + qint8 leapSecondSet; + qint8 singleSynchSet; + QString dateSet; + qlonglong secondWidthSet; + qint8 bacRatioSet; + float bacRangeSet; + qlonglong oppsPhaseShiftSet; + QString leapTimestampSet; + QString mjdDateSet; + QString timeSet; + + void fromJSON(QJsonObject command); +}; + +#endif // SIGNALGENERATORSETTING_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index f09b42f..8eb383f 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -1,18 +1,20 @@ -HEADERS += $$PWD/dto/DeviceFrameBaseDto.h \ - $$PWD/dto/BCodeTerminalStatusDto.h +HEADERS += $$PWD/dto/DeviceFrameBaseDto.h HEADERS += $$PWD/dto/SignalGeneratorStatusDto.h HEADERS += $$PWD/dto/SignalGeneratorInterfaceDto.h HEADERS += $$PWD/dto/SignalGeneratorZDATimeDto.h HEADERS += $$PWD/dto/SignalGeneratorMJDTimeDto.h +HEADERS += $$PWD/dto/SignalGeneratorSetting.h HEADERS += $$PWD/dto/FrequencyTuningStatusFreqDto.h HEADERS += $$PWD/dto/FrequencyTuningStatusPulseDto.h +HEADERS += $$PWD/dto/FrequencyTuningSettingDto.h HEADERS += $$PWD/dto/TimeSwitcherStatusDto.h HEADERS += $$PWD/dto/TimeSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherStatusDto.h HEADERS += $$PWD/dto/TimeReplicatorStatusDto.h HEADERS += $$PWD/dto/FreqReplicatorStatusDto.h +HEADERS += $$PWD/dto/BCodeTerminalStatusDto.h HEADERS += $$PWD/DeviceStatusProtocolBase.h HEADERS += $$PWD/SignalGeneratorProtocolBM.h HEADERS += $$PWD/FrequencyTuningProtocolBM.h @@ -22,13 +24,14 @@ HEADERS += $$PWD/FreqReplicatorProtocolTX.h HEADERS += $$PWD/BCodeTerminalProtocolBM.h -SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp \ - $$PWD/dto/BCodeTerminalStatusDto.cpp +SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp SOURCES += $$PWD/dto/SignalGeneratorInterfaceDto.cpp SOURCES += $$PWD/dto/SignalGeneratorZDATimeDto.cpp SOURCES += $$PWD/dto/SignalGeneratorMJDTimeDto.cpp +SOURCES += $$PWD/dto/SignalGeneratorSetting.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusFreqDto.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusPulseDto.cpp +SOURCES += $$PWD/dto/FrequencyTuningSettingDto.cpp SOURCES += $$PWD/dto/TimeSwitcherStatusDto.cpp SOURCES += $$PWD/dto/TimeSwitcherInterfaceDto.cpp SOURCES += $$PWD/dto/FreqSwitcherInterfaceDto.cpp @@ -36,6 +39,7 @@ SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp SOURCES += $$PWD/DeviceStatusProtocolBase.cpp SOURCES += $$PWD/dto/FreqReplicatorStatusDto.cpp +SOURCES += $$PWD/dto/BCodeTerminalStatusDto.cpp SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp diff --git a/DevStatusAcq/DevStatusWindow.cpp b/DevStatusAcq/DevStatusWindow.cpp index 59ca492..43b1c8b 100644 --- a/DevStatusAcq/DevStatusWindow.cpp +++ b/DevStatusAcq/DevStatusWindow.cpp @@ -1,11 +1,46 @@ -#include "DevStatusWindow.h" +#include "DevStatusWindow.h" #include "ui_DevStatusWindow.h" + +#include +#include +#include +#include + DevStatusWindow::DevStatusWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::DevStatusWindow) { ui->setupUi(this); + // 无边框 + this->setWindowFlags(Qt::FramelessWindowHint); + + // 窗口大小为占满一屏 + QRect screenRect = QApplication::desktop()->screenGeometry(); + resize(screenRect.width(), screenRect.height()); + + // 将窗口移动到左上角 + move(0, 0); + ui->exitButt->move(screenRect.width() - 80, 10); + ui->minButt->move(screenRect.width() - 140, 10); + ui->line->setGeometry(0, 59, screenRect.width(), 1); + + // 设置stackWidget的大小 + ui->stackedWidget->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); + + httpReq = new HttpRequestController(this); + + // 1. 获取访问接口需要的token + int retCode = this->initHttpToken(); + if (retCode != 200) + { + QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); + + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + // 2. 获取字典值:设备类型 + retCode = this->initDictDeviceTypes(); + sigGenDevice = new SignalGenerator(this); freqTunDevice = new FrequencyTuning(this); timeSwitDevice = new TimeSwitcher(this); @@ -14,16 +49,8 @@ freqRepDevice = new FreqReplicator(this); bCodeTermDevice = new BCodeTerminal(this); - // -// connect(device, &SignalGenerator::sendDataToDraw, -// this, &DevStatusWindow::drawCounterDataOnPage); - -// device->setComName("COM1"); -// device->setBaudRate(9600); - -// device->setDevCode("5001"); - -// device->initSerialPort(); + connect(freqTunDevice, &FrequencyTuning::sendDataToDraw, + this, &DevStatusWindow::drawFrameDataOnPage); } DevStatusWindow::~DevStatusWindow() @@ -31,6 +58,80 @@ delete ui; } +void DevStatusWindow::drawFrameDataOnPage(DeviceFrameBaseDto * frameData) +{ + // 当前显示的设备编号 + if (frameData->frameType == "0301") + { + FrequencyTuningStatusFreqDto * freqFrameDto = (FrequencyTuningStatusFreqDto *) frameData; + ui->ftDevStatus->setText(freqFrameDto->devStatus == "1" ? "正常" : "异常"); + ui->ftInputValid->setText(freqFrameDto->inputValid == "1" ? "有效" : "无效"); + ui->ftInputTimeType->setText(freqFrameDto->inputTimeType == "1" ? "5MHz" : "10MHz"); + ui->ftFreqAdjustAcc->setText(QString("%1 pHz").arg(freqFrameDto->freqAdjustAcc)); + ui->ftPulseAdjustAcc->setText(QString("%1 fs").arg((float) freqFrameDto->pulseAdjustAcc * 0.1)); + } else if (frameData->frameType == "0302") + { + FrequencyTuningStatusPulseDto * pulseFrameDto = (FrequencyTuningStatusPulseDto *) frameData; + ui->ftSynchStatus->setText(pulseFrameDto->synchStatus == "1" ? "正常" : "异常"); + ui->ftRefValid->setText(pulseFrameDto->refValid == "1" ? "有效" : "无效"); + ui->ftSecondDiff->setText(QString("%1 ns").arg(pulseFrameDto->secondDiff)); + ui->ftPhaseShiftAcc->setText(QString("%1 ps").arg(pulseFrameDto->phaseShiftAcc)); + ui->ftPulseWidth->setText(QString("%1 ns").arg(pulseFrameDto->pulseWidth)); + } +} + +int DevStatusWindow::initHttpToken() +{ + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + return response.find("code")->toInt(); +} +int DevStatusWindow::initDictDeviceTypes() +{ + QJsonObject response = httpReq->initDictDeviceType(); + QJsonArray typeArray = response.find("data")->toArray(); + for (int i = 3; i < typeArray.size(); i++) + { + QJsonObject typeItem = typeArray.at(i).toObject(); + ui->devTypeSelect->addItem(typeItem.find("name")->toString(), typeItem.find("value")->toString()); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devTypeSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response.find("code")->toInt(); +} +QJsonObject DevStatusWindow::initDeviceList() +{ + QString devType = ui->devTypeSelect->currentText(); + QJsonObject response = httpReq->initDeviceList(devType); + + qDebug() << response; + + ui->devSelect->clear(); + + QJsonArray devArray = response.find("data")->toArray(); + for (int i = 0; i < devArray.size(); i++) + { + QJsonObject devItem = devArray.at(i).toObject(); + ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem); + } + + // 5. 设置下拉框的样式 + QStandardItemModel * model = qobject_cast(ui->devSelect->model()); + for (int i = 0; i < model->rowCount(); ++i) + { + QStandardItem * item = model->item(i); + item->setSizeHint({ 0, 30 }); + } + + return response; +} void DevStatusWindow::on_sigGenButt_clicked() { @@ -42,8 +143,13 @@ void DevStatusWindow::on_freqTunButt_clicked() { + // 获取设备对象 + QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + freqTunDevice->setComName("FrequencyTuning"); - freqTunDevice->setDevCode("400001"); + freqRepDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); + freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); + freqRepDevice->setDeviceId(devItem.find("deviceId")->toString()); freqTunDevice->initSerialPort(); } @@ -87,3 +193,170 @@ bCodeTermDevice->initSerialPort(); } + +void DevStatusWindow::on_exitButt_clicked() +{ + QApplication::exit(0); +} + +void DevStatusWindow::on_minButt_clicked() +{ + setWindowState(Qt::WindowMinimized | windowState()); +} + +void DevStatusWindow::on_devTypeSelect_currentIndexChanged(int index) +{ + this->initDeviceList(); + + ui->stackedWidget->setCurrentIndex(index); +} + +void DevStatusWindow::on_ftSetFreqTurnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetFreqTurn->text().toLongLong(); + if (value < -2E12 || value > 2E12) + { + QMessageBox::information(this, "数据错误", "调整范围-2E-7 ~ 2E-7,(单位:1E-19)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateFreqTunSetCommand(value); + ui->ftSetFreqTurnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseTunnButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseTunn->text().toLongLong(); + if (value < -1E10 || value > 1E10) + { + QMessageBox::information(this, "数据错误", "调整范围-1us~+1us,(单位:0.1fs)"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseTunSetCommand(value); + ui->ftSetPhaseTunnRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPhaseShiftButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPhaseShift->text().toLongLong(); + if (value < -5E11 || value > 5E11) + { + QMessageBox::information(this, "数据错误", "取值范围-500ms - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generatePhaseShiftSetCommand(value); + ui->ftSetPhaseShiftRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetSynchButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->ftSetSynch->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSingleSynchSetCommand(value); + ui->ftSetSynchRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_ftSetPulseWidthButt_clicked() +{ + freqTunDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->ftSetPulseWidth->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((FrequencyTuningProtocolBM) freqTunDevice->protocol).generateSecondWidthSetCommand(value); + ui->ftSetPulseWidthRaw->setText(setBytes); + freqTunDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgLeapSecondSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgLeapSecondSet->text().toInt(); + if (value != 1 || value != 2 || value != 3) + { + QMessageBox::information(this, "数据错误", "取值范围0 / 1 / 2"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateLeapSecondSetCommand(value); + ui->sgLeapSecondSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSingleSynchSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgSingleSynchSet->text().toInt(); + if (value != 1) + { + QMessageBox::information(this, "数据错误", "1:有效;其他无效"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSingleSynchSetCommand(value); + ui->sgSingleSynchSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgDateSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + QString value = ui->sgDateSet->text(); + if (value.length() != 8) + { + QMessageBox::information(this, "数据错误", "年月日格式:YYYYMMDD"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateDateSetCommand(value); + ui->sgDateSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgSecondWidthSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qlonglong value = ui->sgSecondWidthSet->text().toLongLong(); + if (value < 10 * 1000 || value > 500 * 1000 * 1000) + { + QMessageBox::information(this, "数据错误", "取值范围10us - 500ms"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgSecondWidthSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} + +void DevStatusWindow::on_sgBacRatioSetButt_clicked() +{ + sigGenDevice->setDevCode(ui->devSelect->currentData().toJsonObject().find("deviceNo")->toString()); + qint8 value = ui->sgBacRatioSet->text().toInt(); + if (value < 2 || value > 6) + { + QMessageBox::information(this, "数据错误", "取值范围2 - 6"); + } else + { + QByteArray setBytes = ((SignalGeneratorProtocolBM) sigGenDevice->protocol).generateSecondWidthSetCommand(value); + ui->sgBacRatioSetRaw->setText(setBytes); + sigGenDevice->sendDataToSerial(setBytes); + } +} diff --git a/DevStatusAcq/DevStatusWindow.h b/DevStatusAcq/DevStatusWindow.h index 0112284..f3e7068 100644 --- a/DevStatusAcq/DevStatusWindow.h +++ b/DevStatusAcq/DevStatusWindow.h @@ -1,4 +1,4 @@ -#ifndef DEVSTATUSWINDOW_H +#ifndef DEVSTATUSWINDOW_H #define DEVSTATUSWINDOW_H #include @@ -10,6 +10,7 @@ #include "device/TimeReplicator.h" #include "device/FreqReplicator.h" #include "device/BCodeTerminal.h" +#include "common/HttpRequestController.h" QT_BEGIN_NAMESPACE namespace Ui { class DevStatusWindow; } @@ -23,7 +24,12 @@ DevStatusWindow(QWidget *parent = nullptr); ~DevStatusWindow(); +public slots: + void drawFrameDataOnPage(DeviceFrameBaseDto * frameData); + private slots: + void on_devTypeSelect_currentIndexChanged(int index); + void on_sigGenButt_clicked(); void on_freqTunButt_clicked(); @@ -38,9 +44,35 @@ void on_bctButt_clicked(); + void on_exitButt_clicked(); + + void on_minButt_clicked(); + + void on_ftSetFreqTurnButt_clicked(); + void on_ftSetPhaseTunnButt_clicked(); + void on_ftSetPhaseShiftButt_clicked(); + void on_ftSetSynchButt_clicked(); + void on_ftSetPulseWidthButt_clicked(); + + void on_sgLeapSecondSetButt_clicked(); + + void on_sgSingleSynchSetButt_clicked(); + + void on_sgDateSetButt_clicked(); + + void on_sgSecondWidthSetButt_clicked(); + + void on_sgBacRatioSetButt_clicked(); + private: + int initHttpToken(); + int initDictDeviceTypes(); + QJsonObject initDeviceList(); + Ui::DevStatusWindow *ui; + HttpRequestController * httpReq; + SignalGenerator * sigGenDevice; FrequencyTuning * freqTunDevice; TimeSwitcher * timeSwitDevice; diff --git a/DevStatusAcq/DevStatusWindow.ui b/DevStatusAcq/DevStatusWindow.ui index 4059230..07a560c 100644 --- a/DevStatusAcq/DevStatusWindow.ui +++ b/DevStatusAcq/DevStatusWindow.ui @@ -6,103 +6,2277 @@ 0 0 - 800 - 600 + 1300 + 700 - DevStatusWindow + 设备状态监控 - + - 50 - 50 - 180 - 40 + 20 + 0 + 200 + 60 + + + 微软雅黑 + 14 + + - Mock SignalGenerator + 设备状态监控 - + - 270 - 50 - 180 - 40 + 250 + 0 + 150 + 60 + + + 微软雅黑 + 12 + + + + Qt::LeftToRight + - Mock FrequencyTuning + 请选择设备 + + + Qt::AlignCenter - + - 490 - 50 - 180 + 400 + 10 + 250 40 - - Mock BCodeTerminal - - + - 50 - 120 - 180 + 700 + 10 + 250 40 - - Mock TimeSwitcher - - + - 270 - 120 - 180 + 990 + 10 + 40 40 + + + - Mock FreqSwitcher + 退出 - + - 50 - 190 - 180 + 940 + 10 + 40 40 + + + - Mock TimeReplicator + 最小化 - + - 270 - 190 - 180 - 40 + 0 + 59 + 1024 + 1 - - Mock FreqReplicator + + QFrame::Plain + + Qt::Horizontal + + + + + + 0 + 60 + 1300 + 640 + + + + + + + 50 + 20 + 180 + 40 + + + + + 微软雅黑 + 10 + + + + Mock FrequencyTuning + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率输出状态 + + + + + + 120 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 频率调整累积值 + + + + + + 370 + 120 + 100 + 30 + + + + + 微软雅黑 + 10 + + + + 相位调整累积值 + + + + + + 620 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 770 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 输入时钟类别 + + + + + + 920 + 120 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 输入有效性 + + + + + + 220 + 120 + 120 + 30 + + + + + + + 470 + 120 + 120 + 30 + + + + + + + 700 + 120 + 50 + 30 + + + + + + + 850 + 120 + 50 + 30 + + + + + + + 990 + 120 + 50 + 30 + + + + + + + 20 + 160 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉冲状态 + + + + + + 120 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 同步状态 + + + + + + 180 + 160 + 50 + 30 + + + + + + + 250 + 160 + 30 + 30 + + + + + 微软雅黑 + 10 + + + + 秒差 + + + + + + 280 + 160 + 120 + 30 + + + + + + + 420 + 160 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 参考有效 + + + + + + 480 + 160 + 50 + 30 + + + + + + + 550 + 160 + 70 + 30 + + + + + 微软雅黑 + 10 + + + + 移相累计值 + + + + + + 620 + 160 + 120 + 30 + + + + + + + 760 + 160 + 40 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽 + + + + + + 800 + 160 + 120 + 30 + + + + + + + 20 + 230 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率微调设置 + + + + + + 120 + 270 + 100 + 30 + + + + + + + 20 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 相位微调设置 + + + + + + 20 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 移相设置 + + + + + + 20 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步设置 + + + + + + 20 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 秒脉宽设置 + + + + + + 120 + 320 + 100 + 30 + + + + + + + 120 + 370 + 100 + 30 + + + + + + + 120 + 420 + 100 + 30 + + + + + + + 120 + 470 + 100 + 30 + + + + + + + 270 + 270 + 500 + 30 + + + + true + + + + + + 270 + 320 + 500 + 30 + + + + true + + + + + + 270 + 370 + 500 + 30 + + + + true + + + + + + 270 + 420 + 500 + 30 + + + + true + + + + + + 270 + 470 + 500 + 30 + + + + true + + + + + + 800 + 270 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 800 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock SignalGenerator + + + + + + 20 + 80 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 工作状态 + + + + + + 20 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 设备工作状态 + + + + + + 100 + 120 + 50 + 30 + + + + + + + 170 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 300 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻 + + + + + + 230 + 120 + 50 + 30 + + + + + + + 360 + 120 + 120 + 30 + + + + + + + 500 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号状态 + + + + + + 580 + 120 + 50 + 30 + + + + + + + 650 + 120 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 频率信号类别 + + + + + + 730 + 120 + 50 + 30 + + + + + + + 800 + 120 + 90 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS信号状态 + + + + + + 890 + 120 + 50 + 30 + + + + + + + 960 + 120 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS相差 + + + + + + 1020 + 120 + 100 + 30 + + + + + + + 20 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS脉宽 + + + + + + 80 + 170 + 120 + 30 + + + + + + + 220 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相量 + + + + + + 300 + 170 + 120 + 30 + + + + + + + 440 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC调制比 + + + + + + 520 + 170 + 50 + 30 + + + + + + + 590 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + B-AC幅度 + + + + + + 650 + 170 + 50 + 30 + + + + + + + 20 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA日期 + + + + + + 80 + 220 + 120 + 30 + + + + + + + 220 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + ZDA时刻 + + + + + + 280 + 220 + 120 + 30 + + + + + + + 420 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 480 + 220 + 50 + 30 + + + + + + + 550 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 640 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD日期 + + + + + + 700 + 220 + 120 + 30 + + + + + + + 840 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + MJD时刻 + + + + + + 900 + 220 + 120 + 30 + + + + + + + 1040 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒标志 + + + + + + 1100 + 220 + 50 + 30 + + + + + + + 1170 + 220 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 有效 + + + + + + 800 + 170 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 键盘控制 + + + + + + 860 + 170 + 50 + 30 + + + + + + + 930 + 170 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示类别 + + + + + + 1010 + 170 + 50 + 30 + + + + + + + 20 + 280 + 100 + 30 + + + + + 微软雅黑 + 12 + + + + 参数设置 + + + + + + 20 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒设置 + + + + + + 100 + 320 + 100 + 30 + + + + + + + 230 + 320 + 200 + 30 + + + + true + + + + + + 460 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 20 + 370 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 单次同步 + + + + + + 230 + 370 + 200 + 30 + + + + true + + + + + + 460 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 370 + 100 + 30 + + + + + + + 20 + 420 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 年月日 + + + + + + 230 + 420 + 200 + 30 + + + + true + + + + + + 460 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 420 + 100 + 30 + + + + + + + 460 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 470 + 100 + 30 + + + + + + + 20 + 470 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 脉宽设置 + + + + + + 230 + 470 + 200 + 30 + + + + true + + + + + + 460 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 100 + 520 + 100 + 30 + + + + + + + 20 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + AC码调制比 + + + + + + 230 + 520 + 200 + 30 + + + + true + + + + + + 20 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 控制状态 + + + + + + 100 + 590 + 100 + 30 + + + + + + + 230 + 590 + 200 + 30 + + + + true + + + + + + 460 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 时分秒设置 + + + + + + 610 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 1PPS移相 + + + + + + 1050 + 590 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 420 + 100 + 30 + + + + + + + 820 + 590 + 200 + 30 + + + + true + + + + + + 690 + 590 + 100 + 30 + + + + + + + 1050 + 320 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 1050 + 370 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 690 + 320 + 100 + 30 + + + + + + + 820 + 520 + 200 + 30 + + + + true + + + + + + 690 + 520 + 100 + 30 + + + + + + + 820 + 370 + 200 + 30 + + + + true + + + + + + 820 + 420 + 200 + 30 + + + + true + + + + + + 1050 + 520 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 320 + 200 + 30 + + + + true + + + + + + 610 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 儒略日设置 + + + + + + 1050 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 820 + 470 + 200 + 30 + + + + true + + + + + + 1050 + 470 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + send + + + + + + 610 + 320 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + AC码幅度 + + + + + + 690 + 370 + 100 + 30 + + + + + + + 610 + 420 + 80 + 30 + + + + + 微软雅黑 + 10 + + + + 闰秒时刻设置 + + + + + + 610 + 590 + 60 + 30 + + + + + 微软雅黑 + 10 + + + + 时间显示 + + + + + + 690 + 470 + 100 + 30 + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqSwitcher + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock BCodeTerminal + + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock TimeReplicator + + + + + + + + 50 + 20 + 180 + 40 + + + + Mock FreqReplicator + + + + diff --git a/DevStatusAcq/common/ConstCache.h b/DevStatusAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/DevStatusAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/DevStatusAcq/common/HttpRequestController.cpp b/DevStatusAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..7b905b7 --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.cpp @@ -0,0 +1,155 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply * reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList(QString devType) +{ + QJsonObject resultObj; + + QString counterDevType = ""; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(devType) == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", ""); + + qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if(jsonDocument.isNull() == false) { + resultObj = jsonDocument.object(); + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + } else + { + resultObj.insert("code", -1); + } + + return resultObj; +} diff --git a/DevStatusAcq/common/HttpRequestController.h b/DevStatusAcq/common/HttpRequestController.h new file mode 100644 index 0000000..77fc3db --- /dev/null +++ b/DevStatusAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(QString devType); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 27ec57d..84f57ae 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -4,9 +4,17 @@ SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp #SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h #HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/DevStatusAcq/common/utils/DefHead.h b/DevStatusAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/DevStatusAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.cpp b/DevStatusAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/DevStatusAcq/common/utils/HttpRequestUtil.h b/DevStatusAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/DevStatusAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/DevStatusAcq/common/utils/MD5.cpp b/DevStatusAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/DevStatusAcq/common/utils/MD5.h b/DevStatusAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/DevStatusAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/DevStatusAcq/common/utils/QLogUtil.cpp b/DevStatusAcq/common/utils/QLogUtil.cpp index 458ac15..43d8655 100644 --- a/DevStatusAcq/common/utils/QLogUtil.cpp +++ b/DevStatusAcq/common/utils/QLogUtil.cpp @@ -34,3 +34,59 @@ } +void QLogUtil::writeRawDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile rawLogFile(datePath + filename); + rawLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + rawLogFile.write(content.toUtf8()); + rawLogFile.close(); +} + +void QLogUtil::writeChannelDataLogByDate(QString date, QString filename, QString content) +{ + QString basePath = SettingConfig::getInstance().BASE_LOG_PATH; + QString datePath = basePath + date + "/"; + + QStringList pathList; + pathList.append(basePath); + pathList.append(datePath); + + // 检查并创建目录 + QLogUtil::checkLogPath(pathList); + + // 输出内容到日志中 + content.append("\n"); + QFile chLogFile(datePath + filename); + chLogFile.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text); + chLogFile.write(content.toUtf8()); + chLogFile.close(); +} + +void QLogUtil::checkLogPath(QStringList path) +{ + QDir dir; + bool exist = false; + + for (int i = 0; i < path.size(); i++) + { + // 判断是否存在日志根目录 + exist = dir.exists(path.at(i)); + if (exist == false) + { + // 不存在则创建目录 + dir.mkdir(path.at(i)); + } + } +} diff --git a/DevStatusAcq/common/utils/QLogUtil.h b/DevStatusAcq/common/utils/QLogUtil.h index 8da0fcd..1d1ef0f 100644 --- a/DevStatusAcq/common/utils/QLogUtil.h +++ b/DevStatusAcq/common/utils/QLogUtil.h @@ -3,7 +3,9 @@ #include #include +#include #include +#include "SettingConfig.h" class QLogUtil : public QObject { @@ -16,6 +18,11 @@ static void writeInfoLog(QString message); static void writeDebugLog(QString message); + static void writeRawDataLogByDate(QString date, QString filename, QString content); + static void writeChannelDataLogByDate(QString date, QString filename, QString content); + +private: + static void checkLogPath(QStringList path); signals: }; diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.cpp b/DevStatusAcq/common/utils/QSerialPortUtil.cpp index 325d590..df48453 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.cpp +++ b/DevStatusAcq/common/utils/QSerialPortUtil.cpp @@ -40,9 +40,9 @@ void QSerialPortUtil::sendData(QByteArray data) { + std::cout << data.toStdString() << std::endl; if (this->open == true) { - std::cout << data.toStdString() << std::endl; serial.write(data); } } @@ -77,8 +77,8 @@ { // frequency tuning buffer.append("$GLN,0,192.168.1.126,255.255.255.0,192.168.1.1,255.255.255.255,3000,2000,2001*71").append("\r\n"); - buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1*4C").append("\r\n"); - buffer.append("$GLP,0,0,0,0,20000*45").append("\r\n"); + buffer.append("$GLF,0,0,0,0,00000,0,0,0,0,0,0,0,0,0,0,0,1900,2355,0,0,0,0,0,1,1,1*4C").append("\r\n"); + buffer.append("$GLP,0,1000,0,100,20000*45").append("\r\n"); } else if (portName == "TimeSwitcher") { // time switcher diff --git a/DevStatusAcq/common/utils/QSerialPortUtil.h b/DevStatusAcq/common/utils/QSerialPortUtil.h index d018557..eccc370 100644 --- a/DevStatusAcq/common/utils/QSerialPortUtil.h +++ b/DevStatusAcq/common/utils/QSerialPortUtil.h @@ -19,7 +19,7 @@ private: QSerialPort serial; - bool open; + bool open = false; void mockReceivData(QString portName); diff --git a/DevStatusAcq/common/utils/SettingConfig.cpp b/DevStatusAcq/common/utils/SettingConfig.cpp index 67a8dd0..8768fbc 100644 --- a/DevStatusAcq/common/utils/SettingConfig.cpp +++ b/DevStatusAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,11 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); + + BASE_LOG_PATH = getProperty("log", "basePath").toString(); } diff --git a/DevStatusAcq/common/utils/SettingConfig.h b/DevStatusAcq/common/utils/SettingConfig.h index 2d10a4d..a49191b 100644 --- a/DevStatusAcq/common/utils/SettingConfig.h +++ b/DevStatusAcq/common/utils/SettingConfig.h @@ -36,6 +36,11 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; + + QString BASE_LOG_PATH; private: SettingConfig(); diff --git a/DevStatusAcq/conf/config.ini b/DevStatusAcq/conf/config.ini index 4f2968b..0b568d6 100644 --- a/DevStatusAcq/conf/config.ini +++ b/DevStatusAcq/conf/config.ini @@ -1,6 +1,4 @@ -[com] -portNames="COM3" -devCodes="9103" +[com] baudRate=115200 [kafka] @@ -9,4 +7,11 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="phase" +appKey="bd593bdd20943d2db8af217c3712a460" + +[http] +baseUrl="http://111.198.10.15:11410" + +[log] +basePath="D:/Workspace Qt/ZXSSCJ-Release/DevStatus/logs/" diff --git a/DevStatusAcq/device/DeviceBase.cpp b/DevStatusAcq/device/DeviceBase.cpp index 97a7f25..573401c 100644 --- a/DevStatusAcq/device/DeviceBase.cpp +++ b/DevStatusAcq/device/DeviceBase.cpp @@ -1,4 +1,5 @@ -#include "DeviceBase.h" +#include "DeviceBase.h" +#include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) { @@ -21,6 +22,10 @@ { this->devCode = devCode; } +void DeviceBase::setDeviceId(QString deviceId) +{ + this->deviceId = deviceId; +} bool DeviceBase::isSerialOpen() { @@ -31,3 +36,9 @@ { this->serialUtil.openSerialPort(this->comName, this->baudRate); } + +void DeviceBase::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); +} diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index a41b884..cba1ace 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -21,13 +21,17 @@ void setBaudRate(int baudRate); QString getDevCode(); void setDevCode(QString devCode); + void setDeviceId(QString deviceId); void initSerialPort(); bool isSerialOpen(); - + virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; + DeviceStatusProtocolBase * protocol; + protected: + QString deviceId; QString devCode; QString comName; int baudRate; @@ -35,10 +39,6 @@ QSerialPortUtil serialUtil; // QKafkaUtil kafkaUtil; QByteArray dataBuff; - - DeviceStatusProtocolBase * protocol; -signals: - }; #endif // DEVICEBASE_H diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index a8ecb8b..3812fd8 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -51,6 +51,8 @@ ftFrameDto->milisecond = now.toMSecsSinceEpoch(); ftFrameDto->rawFrame = frameByte; + ftFrameDto->devCode = devCode; + this->afterFramePhase(ftFrameDto); } @@ -68,12 +70,44 @@ std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; + // 0. 输出到日志文件中 + QString date = frameDto->timestamp.mid(0, 10); + + // 1. 原始字节数组数据 + QString filename = "raw_" + devCode + ".log"; + QString content = frameDto->timestamp + " [recv] " + frameDto->rawFrame.left(frameDto->rawFrame.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); + + // 2. 解析后的json数据 + QString frameFilename = "frame_" + devCode + ".log"; + QString frameContent = frameDto->timestamp + " [recv] " + QJsonDocument(frameDto->toJSON()).toJson(QJsonDocument::Compact); + QLogUtil::writeChannelDataLogByDate(date, frameFilename, frameContent); + // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("deviceId", devCode); + jsonObj.insert("deviceId", deviceId); // kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + + // 4. 在界面上简单显示相差数据结果 + emit this->sendDataToDraw(frameDto); +} + +void FrequencyTuning::sendDataToSerial(QByteArray data) +{ + data.append(FRAME_TAIL); + this->serialUtil.sendData(data); + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "raw_" + getDevCode() + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size()); + QLogUtil::writeRawDataLogByDate(date, filename, content); } diff --git a/DevStatusAcq/device/FrequencyTuning.h b/DevStatusAcq/device/FrequencyTuning.h index 033a924..50e171a 100644 --- a/DevStatusAcq/device/FrequencyTuning.h +++ b/DevStatusAcq/device/FrequencyTuning.h @@ -1,4 +1,4 @@ -#ifndef FREQUENCYTUNING_H +#ifndef FREQUENCYTUNING_H #define FREQUENCYTUNING_H #include @@ -13,7 +13,8 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); - void afterFramePhase(DeviceFrameBaseDto * frameDto); + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; + void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp index a170ee3..0a86047 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.cpp @@ -1,4 +1,4 @@ -#include "DeviceStatusProtocolBase.h" +#include "DeviceStatusProtocolBase.h" #include "SignalGeneratorProtocolBM.h" #include "FrequencyTuningProtocolBM.h" #include "TimeSwitcherProtocolBM.h" @@ -42,3 +42,17 @@ return nullptr; } + +QString DeviceStatusProtocolBase::calculateXOR(QByteArray byteArray) +{ + quint8 xorValue = 0; + + for (int i =0; i < byteArray.size(); i++) + { + xorValue = xorValue ^ byteArray.at(i); + } + + QString str; + str.sprintf("%02X", xorValue); + return str; +} diff --git a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h index 6750c3d..667c30c 100644 --- a/DevStatusAcq/protocol/DeviceStatusProtocolBase.h +++ b/DevStatusAcq/protocol/DeviceStatusProtocolBase.h @@ -1,4 +1,4 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H +#ifndef DEVICESTATUSPROTOCOLBASE_H #define DEVICESTATUSPROTOCOLBASE_H #include @@ -109,6 +109,8 @@ static DeviceStatusProtocolBase * deviceStatusProtocolFactory(QString deviceType); + QString calculateXOR(QByteArray byteArray); + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; virtual int checkFrame(QByteArray rawData) = 0; virtual QList extractFrameList(QByteArray rawData) = 0; diff --git a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp index 8539214..3277e17 100644 --- a/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp +++ b/DevStatusAcq/protocol/FreqReplicatorProtocolTX.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicatorProtocolTX.h" +#include "FreqReplicatorProtocolTX.h" FreqReplicatorProtocolTX::FreqReplicatorProtocolTX(QObject *parent) : DeviceStatusProtocolBase(parent) { @@ -28,8 +28,8 @@ QByteArray outputACByte = content.mid(5, 8); QByteArray outputBDByte = content.mid(13, 8); - QString inputAC = ""; - QString inputBD = ""; + QString inputAC = QString("%1,%2"); + QString inputBD = QString("%1,%2"); QString outputAC = ""; QString outputBD = ""; @@ -37,26 +37,11 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "AB"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } - - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); @@ -74,29 +59,13 @@ { ((FreqReplicatorStatusDto *) frameData)->abOrCd = "CD"; - if (inputACByte.at(0) == 0x01) - { - inputAC += "10MHz,"; - } - if (inputACByte.at(1) == 0x01) - { - inputAC += "5MHz,"; - } - - if (inputBDByte.at(0) == 0x01) - { - inputBD += "10MHz,"; - } - if (inputBDByte.at(1) == 0x01) - { - inputBD += "5MHz,"; - } + inputAC.arg(inputACByte.at(1)).arg(inputACByte.at(0)); + inputBD.arg(inputBDByte.at(1)).arg(inputBDByte.at(0)); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); ((FreqReplicatorStatusDto *) frameData)->inValid.append(""); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC.mid(0, inputAC.size() - 1)); - ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD.mid(0, inputBD.size() - 1)); - + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputAC); + ((FreqReplicatorStatusDto *) frameData)->inValid.append(inputBD); for (int i = 0; i < 8; i++) { diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp index 51b6542..9d8f261 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.cpp @@ -30,6 +30,86 @@ return frameData; } +// 生成频率微调设置指令 +QByteArray FrequencyTuningProtocolBM::generateFreqTunSetCommand(qlonglong freqTunSet) +{ + QByteArray command; + command.append("GLF,20,"); + command.append(QString("%1").arg(freqTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成相位微调设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseTunSetCommand(qlonglong phaseTunSet) +{ + QByteArray command; + command.append("GLF,21,"); + command.append(QString("%1").arg(phaseTunSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成移相设置指令 +QByteArray FrequencyTuningProtocolBM::generatePhaseShiftSetCommand(qlonglong phaseShiftSet) +{ + QByteArray command; + command.append("GLP,01,"); + command.append(QString("%1").arg(phaseShiftSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray FrequencyTuningProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLP,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray FrequencyTuningProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLP,03,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) { // get the raw data between ',' and '*' diff --git a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h index 1937f92..9fd65aa 100644 --- a/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h +++ b/DevStatusAcq/protocol/FrequencyTuningProtocolBM.h @@ -19,6 +19,21 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成频率微调设置指令 + QByteArray generateFreqTunSetCommand(qlonglong freqTunSet); + + // 生成相位微调设置指令 + QByteArray generatePhaseTunSetCommand(qlonglong phaseTunSet); + + // 生成移相设置指令 + QByteArray generatePhaseShiftSetCommand(qlonglong phaseShiftSet); + + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp index 6fc9ed8..db30632 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.cpp @@ -98,6 +98,70 @@ return true; } +// 生成闰秒设置指令 +QByteArray SignalGeneratorProtocolBM::generateLeapSecondSetCommand(qint8 leapSecondSet) +{ + QByteArray command; + command.append("GLF,01,"); + command.append(QString("%1").arg(leapSecondSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成单次同步设置指令 +QByteArray SignalGeneratorProtocolBM::generateSingleSynchSetCommand(qint8 singleSynchSet) +{ + QByteArray command; + command.append("GLF,02,"); + command.append(QString("%1").arg(singleSynchSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成年月日设置指令 +QByteArray SignalGeneratorProtocolBM::generateDateSetCommand(QString dateSet) +{ + QByteArray command; + command.append("GLF,03,"); + command.append(dateSet); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + +// 生成秒脉宽设置指令 +QByteArray SignalGeneratorProtocolBM::generateSecondWidthSetCommand(qlonglong secondWidthSet) +{ + QByteArray command; + command.append("GLF,04,"); + command.append(QString("%1").arg(secondWidthSet)); + + QString xorValue = this->calculateXOR(command); + + command.prepend("$"); + command.append("*"); + command.append(xorValue); + + return command; +} + QList SignalGeneratorProtocolBM::extractFrameList(QByteArray rawData) { QList resultList; diff --git a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h index 475e3ec..55e9378 100644 --- a/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h +++ b/DevStatusAcq/protocol/SignalGeneratorProtocolBM.h @@ -20,6 +20,28 @@ bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * sgFrameData, int frameType); DeviceFrameBaseDto * frameFactory(int frameType); + // 生成闰秒设置指令 + QByteArray generateLeapSecondSetCommand(qint8 leapSecondSet); + // 生成单次同步设置指令 + QByteArray generateSingleSynchSetCommand(qint8 singleSynchSet); + // 生成年月日设置指令 + QByteArray generateDateSetCommand(QString dateSet); + // 生成秒脉宽设置指令 + QByteArray generateSecondWidthSetCommand(qlonglong secondWidthSet); + // 生成AC码调制比设置指令 + QByteArray generateBacRatioSetCommand(qint8 bacRatioSet); + // 生成AC码幅度设置指令 + QByteArray generateBacRangeSetCommand(float bacRangeSet); + // 生成1PPS相位移相设置指令 + QByteArray generateOppsPhaseShiftSetCommand(qlonglong oppsPhaseShiftSet); + // 生成闰秒时刻设置指令 + QByteArray generateLeapTimestampSetSetCommand(QString leapTimestampSet); + // 生成儒略日设置指令 + QByteArray generateMJDDateSetSetCommand(QString mjdDateSet); + // 生成时分秒设置指令 + QByteArray generateTimeSetSetCommand(QString timeSet); + + // QList extractFrameList(QByteArray rawData); diff --git a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h index 5c63915..f14808f 100644 --- a/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h +++ b/DevStatusAcq/protocol/dto/DeviceFrameBaseDto.h @@ -1,4 +1,4 @@ -#ifndef DEVICEFRAMEBASEDTO_H +#ifndef DEVICEFRAMEBASEDTO_H #define DEVICEFRAMEBASEDTO_H #include diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..df40c04 --- /dev/null +++ b/DevStatusAcq/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,23 @@ +#ifndef FREQUENCYTUNINGSETTINGDTO_H +#define FREQUENCYTUNINGSETTINGDTO_H + +#include + +#include "DeviceFrameBaseDto.h" + +class FrequencyTuningSettingDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningSettingDto(QObject *parent = nullptr); + + qlonglong freqTunSet; + qlonglong phaseTunSet; + qlonglong phaseShiftSet; + qint8 singleSynchSet; + qlonglong secondWidthSet; + + void fromJSON(QJsonObject command); +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp index 0b0813d..9de0d94 100644 --- a/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp +++ b/DevStatusAcq/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -14,7 +14,7 @@ dataObj.insert("inputTimeType", inputTimeType); dataObj.insert("inputValid", inputValid); dataObj.insert("freqAdjustAcc", freqAdjustAcc); - dataObj.insert("pulseAdjustAcc", pulseAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", this->frameType); diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp deleted file mode 100644 index b228e4d..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "SignalGeneratorFrameDto.h" - -SignalGeneratorFrameDto::SignalGeneratorFrameDto(QObject *parent) : QObject(parent) -{ - -} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h b/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h deleted file mode 100644 index 068f0b1..0000000 --- a/DevStatusAcq/protocol/dto/SignalGeneratorFrameDto.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SIGNALGENERATORFRAMEDTO_H -#define SIGNALGENERATORFRAMEDTO_H - -#include -#include -#include - -class SignalGeneratorFrameDto : public QObject -{ - Q_OBJECT -public: - explicit SignalGeneratorFrameDto(QObject *parent = nullptr); - - QByteArray rawFrame; // 原始帧字节数组 - - QString timestamp; // 时间戳字符串 - qlonglong milisecond; // 毫秒计数 - QString devCode; - QString frameType; // 帧类型 - - virtual QJsonObject toJSON() = 0; - -signals: - -}; - -#endif // SIGNALGENERATORFRAMEDTO_H diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp new file mode 100644 index 0000000..67acc56 --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.cpp @@ -0,0 +1,6 @@ +#include "SignalGeneratorSetting.h" + +SignalGeneratorSetting::SignalGeneratorSetting(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h new file mode 100644 index 0000000..d66786e --- /dev/null +++ b/DevStatusAcq/protocol/dto/SignalGeneratorSetting.h @@ -0,0 +1,28 @@ +#ifndef SIGNALGENERATORSETTING_H +#define SIGNALGENERATORSETTING_H + +#include + +#include "DeviceFrameBaseDto.h" + +class SignalGeneratorSetting : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit SignalGeneratorSetting(QObject *parent = nullptr); + + qint8 leapSecondSet; + qint8 singleSynchSet; + QString dateSet; + qlonglong secondWidthSet; + qint8 bacRatioSet; + float bacRangeSet; + qlonglong oppsPhaseShiftSet; + QString leapTimestampSet; + QString mjdDateSet; + QString timeSet; + + void fromJSON(QJsonObject command); +}; + +#endif // SIGNALGENERATORSETTING_H diff --git a/DevStatusAcq/protocol/protocol.pri b/DevStatusAcq/protocol/protocol.pri index f09b42f..8eb383f 100644 --- a/DevStatusAcq/protocol/protocol.pri +++ b/DevStatusAcq/protocol/protocol.pri @@ -1,18 +1,20 @@ -HEADERS += $$PWD/dto/DeviceFrameBaseDto.h \ - $$PWD/dto/BCodeTerminalStatusDto.h +HEADERS += $$PWD/dto/DeviceFrameBaseDto.h HEADERS += $$PWD/dto/SignalGeneratorStatusDto.h HEADERS += $$PWD/dto/SignalGeneratorInterfaceDto.h HEADERS += $$PWD/dto/SignalGeneratorZDATimeDto.h HEADERS += $$PWD/dto/SignalGeneratorMJDTimeDto.h +HEADERS += $$PWD/dto/SignalGeneratorSetting.h HEADERS += $$PWD/dto/FrequencyTuningStatusFreqDto.h HEADERS += $$PWD/dto/FrequencyTuningStatusPulseDto.h +HEADERS += $$PWD/dto/FrequencyTuningSettingDto.h HEADERS += $$PWD/dto/TimeSwitcherStatusDto.h HEADERS += $$PWD/dto/TimeSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherInterfaceDto.h HEADERS += $$PWD/dto/FreqSwitcherStatusDto.h HEADERS += $$PWD/dto/TimeReplicatorStatusDto.h HEADERS += $$PWD/dto/FreqReplicatorStatusDto.h +HEADERS += $$PWD/dto/BCodeTerminalStatusDto.h HEADERS += $$PWD/DeviceStatusProtocolBase.h HEADERS += $$PWD/SignalGeneratorProtocolBM.h HEADERS += $$PWD/FrequencyTuningProtocolBM.h @@ -22,13 +24,14 @@ HEADERS += $$PWD/FreqReplicatorProtocolTX.h HEADERS += $$PWD/BCodeTerminalProtocolBM.h -SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp \ - $$PWD/dto/BCodeTerminalStatusDto.cpp +SOURCES += $$PWD/dto/SignalGeneratorStatusDto.cpp SOURCES += $$PWD/dto/SignalGeneratorInterfaceDto.cpp SOURCES += $$PWD/dto/SignalGeneratorZDATimeDto.cpp SOURCES += $$PWD/dto/SignalGeneratorMJDTimeDto.cpp +SOURCES += $$PWD/dto/SignalGeneratorSetting.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusFreqDto.cpp SOURCES += $$PWD/dto/FrequencyTuningStatusPulseDto.cpp +SOURCES += $$PWD/dto/FrequencyTuningSettingDto.cpp SOURCES += $$PWD/dto/TimeSwitcherStatusDto.cpp SOURCES += $$PWD/dto/TimeSwitcherInterfaceDto.cpp SOURCES += $$PWD/dto/FreqSwitcherInterfaceDto.cpp @@ -36,6 +39,7 @@ SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp SOURCES += $$PWD/DeviceStatusProtocolBase.cpp SOURCES += $$PWD/dto/FreqReplicatorStatusDto.cpp +SOURCES += $$PWD/dto/BCodeTerminalStatusDto.cpp SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index 87b1bd3..ec3c2e5 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -3,7 +3,7 @@ #定义了ordered表示子项目按照添加的顺序来编译 #CONFIG += ordered -SUBDIRS += CounterAcq #计数器数据采集 -SUBDIRS += PhaseCompAcq #比相仪数据采集 -#SUBDIRS += DevStatusAcq +#SUBDIRS += CounterAcq #计数器数据采集 +#SUBDIRS += PhaseCompAcq #比相仪数据采集 +SUBDIRS += DevStatusAcq #SUBDIRS += HClockAcq #氢钟状态数据采集