diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9de0d94 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9de0d94 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..83eb103 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusFreqDto class + * 频率微调设备工作状态:频率输出状态 + */ +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> 设备工作状态:1=正常;0=异常 + QString inputTimeType; // <25> 输入时钟类别:1=5MHz;0=10MHz + QString inputValid; // <26> 输入有效性:1=有效;0=无效 + qlonglong freqAdjustAcc; // <17> 频率调整累计值,单位1pHz + qlonglong pulseAdjustAcc; // <18> 相位调整累计值,单位0.1fs + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9de0d94 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..83eb103 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusFreqDto class + * 频率微调设备工作状态:频率输出状态 + */ +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> 设备工作状态:1=正常;0=异常 + QString inputTimeType; // <25> 输入时钟类别:1=5MHz;0=10MHz + QString inputValid; // <26> 输入有效性:1=有效;0=无效 + qlonglong freqAdjustAcc; // <17> 频率调整累计值,单位1pHz + qlonglong pulseAdjustAcc; // <18> 相位调整累计值,单位0.1fs + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..aefae50 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9de0d94 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..83eb103 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusFreqDto class + * 频率微调设备工作状态:频率输出状态 + */ +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> 设备工作状态:1=正常;0=异常 + QString inputTimeType; // <25> 输入时钟类别:1=5MHz;0=10MHz + QString inputValid; // <26> 输入有效性:1=有效;0=无效 + qlonglong freqAdjustAcc; // <17> 频率调整累计值,单位1pHz + qlonglong pulseAdjustAcc; // <18> 相位调整累计值,单位0.1fs + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..aefae50 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h new file mode 100644 index 0000000..2745f8d --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSPULSEDTO_H +#define FREQUENCYTUNINGSTATUSPULSEDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusPulseDto class + * 频率微调设备工作状态:秒脉冲状态 + */ +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusPulseDto(QObject *parent = nullptr); + + QString synchStatus; // <1> 同步状态:1=正常;0=异常 + qlonglong secondDiff; // <2> 秒差,单位1ns,范围-500ms~500ms + QString refValid; // <3> 参考有效:1=有效;0=无效 + qlonglong phaseShiftAcc; // <4> 移相累计值,单位1ps,范围-500ms~500ms + qlonglong pulseWidth; // <5> 移脉宽,单位1ns,范围10us~500ms + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSPULSEDTO_H diff --git a/DeviceHub/DeviceHubWindow.cpp b/DeviceHub/DeviceHubWindow.cpp index a9a51a7..56291ba 100644 --- a/DeviceHub/DeviceHubWindow.cpp +++ b/DeviceHub/DeviceHubWindow.cpp @@ -35,6 +35,11 @@ signGenForm = new SignalGeneratorForm(this); ui->stackedWidget->addWidget(signGenForm); + kafkaConsumer = new QKafkaConsumer(this); + kafkaConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + kafkaConsumer->setTopic(SettingConfig::getInstance().KAFKA_CMD_TOPIC); + kafkaConsumer->createConsumer(); + kafkaConsumer->start(); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token @@ -55,6 +60,14 @@ delete ui; } +QComboBox * DeviceHubWindow::getDevTypeSelect() +{ + return ui->devTypeSelect; +} +QComboBox * DeviceHubWindow::getDevSelect() +{ + return ui->devSelect; +} void DeviceHubWindow::on_minButt_clicked() { @@ -69,22 +82,28 @@ void DeviceHubWindow::on_devTypeSelect_currentIndexChanged(int index) { ui->stackedWidget->setCurrentIndex(index); + currentDevType = ui->devTypeSelect->currentData().toString(); // - QList typeDevList = ConstCache::getInstance().deviceList.value(ui->devTypeSelect->currentData().toString()); + QList typeDevList = ConstCache::getInstance().deviceList.value(currentDevType); ui->devSelect->clear(); for (int var = 0; var < typeDevList.size(); ++var) { QJsonObject devItem = typeDevList.at(var); 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 }); - } +// // 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 }); +// } +} + +void DeviceHubWindow::on_devSelect_currentIndexChanged(int index) +{ + currentDevIndex = index; } int DeviceHubWindow::initHttpToken() @@ -97,22 +116,28 @@ int DeviceHubWindow::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()); - ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + if (response.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + 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()); + + ConstCache::getInstance().deviceTypes.insert(typeItem.find("value")->toString(), typeItem.find("name")->toString()); + } } - // 5. 设置下拉框的样式 +// // 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 }); - } +// for (int i = 0; i < model->rowCount(); ++i) +// { +// QStandardItem * item = model->item(i); +// item->setSizeHint({ 0, 30 }); +// } // ui->devTypeSelect->setCurrentIndex(model->rowCount() - 1); @@ -127,11 +152,36 @@ { it.next(); QString devType = it.key(); - if (devType == "00" || devType == "01" || devType == "02") + QJsonObject resultObj = httpReq->initDeviceList(devType); + if (resultObj.find("code")->toInt() == 200) { - continue; + QList typeDevList; + QJsonArray data = resultObj.find("data")->toArray(); + QList singleTypeDevList; + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + typeDevList.append(item); + qDebug() << item; + + DeviceBase * devicePtr = DeviceBase::deviceFactory(devType, this); + std::cout << typeid (devicePtr).name() << std::endl; + if (devicePtr != 0) + { + devicePtr->setDevCode(item.find("deviceNo")->toString()); + devicePtr->setDeviceId(item.find("deviceId")->toString()); + devicePtr->setComName(item.find("linkComName")->toString()); + devicePtr->setBaudRate(item.find("baudRate")->toString().toInt()); + + singleTypeDevList.append(devicePtr); + + devicePtr->initSerialPort(); + } + } + this->allTypeDevList.insert(devType, singleTypeDevList); + + ConstCache::getInstance().deviceList.insert(devType, typeDevList); } - httpReq->initDeviceList(devType); } ui->devTypeSelect->setCurrentIndex(0); diff --git a/DeviceHub/DeviceHubWindow.h b/DeviceHub/DeviceHubWindow.h index 8a31cbb..9b9cd91 100644 --- a/DeviceHub/DeviceHubWindow.h +++ b/DeviceHub/DeviceHubWindow.h @@ -2,8 +2,11 @@ #define DEVICEHUBWINDOW_H #include +#include #include "common/HttpRequestController.h" +#include "common/utils/QKafkaConsumer.h" +#include "device/DeviceBase.h" #include "FrequencyTuningForm.h" #include "SignalGeneratorForm.h" @@ -19,21 +22,32 @@ DeviceHubWindow(QWidget *parent = nullptr); ~DeviceHubWindow(); + QString currentDevType; + int currentDevIndex; + QMap> allTypeDevList; + + QKafkaConsumer * kafkaConsumer; + + QComboBox * getDevTypeSelect(); + QComboBox * getDevSelect(); + + // forms + FrequencyTuningForm * freqTunForm; + SignalGeneratorForm * signGenForm; + private slots: void on_minButt_clicked(); void on_exitButt_clicked(); void on_devTypeSelect_currentIndexChanged(int index); + void on_devSelect_currentIndexChanged(int index); + private: Ui::DeviceHubWindow *ui; // private objects HttpRequestController * httpReq; - // forms - FrequencyTuningForm * freqTunForm; - SignalGeneratorForm * signGenForm; - int initHttpToken(); int initDictDeviceTypes(); void initAllDeviceList(); diff --git a/DeviceHub/FrequencyTuningForm.cpp b/DeviceHub/FrequencyTuningForm.cpp index ee7538a..8e04da6 100644 --- a/DeviceHub/FrequencyTuningForm.cpp +++ b/DeviceHub/FrequencyTuningForm.cpp @@ -1,5 +1,6 @@ #include "FrequencyTuningForm.h" #include "ui_FrequencyTuningForm.h" +#include "DeviceHubWindow.h" FrequencyTuningForm::FrequencyTuningForm(QWidget *parent) : QWidget(parent), @@ -16,12 +17,72 @@ void FrequencyTuningForm::on_freqTunButt_clicked() { // 获取设备对象 -// QJsonObject devItem = ui->devSelect->currentData().toJsonObject(); + int devIndex = ((DeviceHubWindow *) this->parent()->parent())->currentDevIndex; + FrequencyTuning * device = (FrequencyTuning *) ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03").at(devIndex); + device->mockReceivData(); +} -// freqTunDevice->setComName("FrequencyTuning"); -// freqTunDevice->setBaudRate(devItem.find("baudRate")->toString().toInt()); -// freqTunDevice->setDevCode(devItem.find("deviceNo")->toString()); -// freqTunDevice->setDeviceId(devItem.find("deviceId")->toString()); +void FrequencyTuningForm::drawDeviceFrameOnForm(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)); + } +} -// freqTunDevice->initSerialPort(); +void FrequencyTuningForm::displayDeviceCommandOnForm(QJsonObject command) +{ + QString deviceId = command.value("deviceId").toString(); + QList typeDevList = ((DeviceHubWindow *) this->parent()->parent())->allTypeDevList.value("03"); + for (int i = 0; i < ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->count(); i++) + { + if (((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->itemData(i) == "03") + { + ((DeviceHubWindow *)this->parent()->parent())->getDevTypeSelect()->setCurrentIndex(i); + } + } + for (int i = 0; i < typeDevList.size(); i++) + { + if (typeDevList.at(i)->getDeviceId() == command.value("deviceId").toString()) + { + ((DeviceHubWindow *)this->parent()->parent())->getDevSelect()->setCurrentIndex(i); + } + } + + QString commandType = command.value("command").toString(); + if (commandType == "GLF,20") + { + ui->ftSetFreqTurn->setText(command.value("params").toString()); + ui->ftSetFreqTurnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLF,21") + { + ui->ftSetPhaseTunn->setText(command.value("params").toString()); + ui->ftSetPhaseTunnRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,01") + { + ui->ftSetPhaseShift->setText(command.value("params").toString()); + ui->ftSetPhaseShiftRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,02") + { + ui->ftSetSynch->setText(command.value("params").toString()); + ui->ftSetSynchRaw->setText(command.value("rawCommand").toString()); + } else if (commandType == "GLP,03") + { + ui->ftSetPulseWidth->setText(command.value("params").toString()); + ui->ftSetPulseWidthRaw->setText(command.value("rawCommand").toString()); + } } diff --git a/DeviceHub/FrequencyTuningForm.h b/DeviceHub/FrequencyTuningForm.h index 70fd205..14cfad8 100644 --- a/DeviceHub/FrequencyTuningForm.h +++ b/DeviceHub/FrequencyTuningForm.h @@ -2,6 +2,7 @@ #define FREQUENCYTUNINGFORM_H #include +#include "device/FrequencyTuning.h" namespace Ui { class FrequencyTuningForm; @@ -15,6 +16,10 @@ explicit FrequencyTuningForm(QWidget *parent = nullptr); ~FrequencyTuningForm(); +public slots: + void drawDeviceFrameOnForm(DeviceFrameBaseDto * frameData); + void displayDeviceCommandOnForm(QJsonObject command); + private slots: void on_freqTunButt_clicked(); diff --git a/DeviceHub/common/HttpRequestController.cpp b/DeviceHub/common/HttpRequestController.cpp index d821a33..dc4e380 100644 --- a/DeviceHub/common/HttpRequestController.cpp +++ b/DeviceHub/common/HttpRequestController.cpp @@ -47,8 +47,7 @@ if (resultObj.find("code")->toInt() == 200) { - QString token = resultObj.find("data")->toString(); - this->token = token; + this->token = resultObj.find("data")->toString(); } } else { @@ -75,21 +74,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + 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); @@ -119,23 +106,9 @@ QNetworkReply * reply = httpUtil->sendGetRequest(request); const QByteArray reply_data = reply->readAll(); QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); - if(jsonDocument.isNull() == false) { + if(jsonDocument.isNull() == false) + { resultObj = jsonDocument.object(); - - if (resultObj.find("code")->toInt() == 200) - { - QList typeDevList; - - QJsonArray data = resultObj.find("data")->toArray(); - for (int i = 0; i < data.size(); i++) - { - QJsonObject item = data.at(i).toObject(); - - typeDevList.append(item); - } - - ConstCache::getInstance().deviceList.insert(devType, typeDevList); - } } else { resultObj.insert("code", -1); diff --git a/DeviceHub/common/utils/QKafkaConsumer.cpp b/DeviceHub/common/utils/QKafkaConsumer.cpp index 2ce6d03..b3cb9fd 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.cpp +++ b/DeviceHub/common/utils/QKafkaConsumer.cpp @@ -1,5 +1,6 @@ #include "QKafkaConsumer.h" #include +#include static volatile int runFlag = 1; static bool exit_eof = false; @@ -73,7 +74,14 @@ // printf("%.*s\n", static_cast(message->len()), static_cast(message->payload())); QString messageStr = static_cast(message->payload()); - emit messageRecieved(messageStr); + QJsonParseError jsonErr; + QJsonDocument doc = QJsonDocument::fromJson(messageStr.toUtf8(), &jsonErr); + if (jsonErr.error == QJsonParseError::NoError) + { + QJsonObject obj = doc.object(); + obj.insert("cmdStr", messageStr); + emit messageRecieved(obj); + } if (message->key()) { std::cout << "Key: " << *message->key() << std::endl; diff --git a/DeviceHub/common/utils/QKafkaConsumer.h b/DeviceHub/common/utils/QKafkaConsumer.h index f278676..5d40f37 100644 --- a/DeviceHub/common/utils/QKafkaConsumer.h +++ b/DeviceHub/common/utils/QKafkaConsumer.h @@ -2,6 +2,7 @@ #define QKAFKACONSUMER_H #include +#include #include "include/librdkafka/rdkafkacpp.h" @@ -31,7 +32,7 @@ RdKafka::Consumer * consumer = 0; signals: - void messageRecieved(QString message); + void messageRecieved(QJsonObject command); }; diff --git a/DeviceHub/common/utils/QSerialPortUtil.cpp b/DeviceHub/common/utils/QSerialPortUtil.cpp index 0138158..9de0047 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.cpp +++ b/DeviceHub/common/utils/QSerialPortUtil.cpp @@ -25,16 +25,14 @@ open = serial.open(QIODevice::ReadWrite); -// if (open == true) -// { + if (open == true) + { // mock data received per second // QTimer * timer = new QTimer(this); // connect(timer, &QTimer::timeout, // this, &QSerialPortUtil::mockReceivData); // timer->start(1000 * 10); -// } - - this->mockReceivData(portName); + } } @@ -58,7 +56,7 @@ { return this->open; } - +/* void QSerialPortUtil::mockReceivData(QString portName) { QByteArray buffer; @@ -115,3 +113,4 @@ emit dataRecieved(buffer); } +*/ diff --git a/DeviceHub/common/utils/QSerialPortUtil.h b/DeviceHub/common/utils/QSerialPortUtil.h index eccc370..48803e8 100644 --- a/DeviceHub/common/utils/QSerialPortUtil.h +++ b/DeviceHub/common/utils/QSerialPortUtil.h @@ -21,8 +21,6 @@ bool open = false; - void mockReceivData(QString portName); - signals: void dataRecieved(QByteArray data); // 收到数据的信号 }; diff --git a/DeviceHub/common/utils/SettingConfig.cpp b/DeviceHub/common/utils/SettingConfig.cpp index 8768fbc..eeed12e 100644 --- a/DeviceHub/common/utils/SettingConfig.cpp +++ b/DeviceHub/common/utils/SettingConfig.cpp @@ -12,6 +12,8 @@ NEED_KAFKA = getProperty("kafka", "needKafka").toUInt(); KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + KAFKA_CMD_TOPIC = getProperty("kafka", "cmdTopic").toString(); + KAFKA_CMDCB_TOPIC = getProperty("kafka", "cmdcbTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); APP_KEY = getProperty("client", "appKey").toString(); diff --git a/DeviceHub/common/utils/SettingConfig.h b/DeviceHub/common/utils/SettingConfig.h index a49191b..2f0c31f 100644 --- a/DeviceHub/common/utils/SettingConfig.h +++ b/DeviceHub/common/utils/SettingConfig.h @@ -34,6 +34,8 @@ int NEED_KAFKA; QString KAFKA_BROKERS; QString KAFKA_DATA_TOPIC; + QString KAFKA_CMD_TOPIC; + QString KAFKA_CMDCB_TOPIC; QString CLIENT_ID; QString APP_KEY; diff --git a/DeviceHub/conf/config.ini b/DeviceHub/conf/config.ini index c37ba1c..e26b49f 100644 --- a/DeviceHub/conf/config.ini +++ b/DeviceHub/conf/config.ini @@ -5,6 +5,8 @@ needKafka=1 brokers="111.198.10.15:12502" dataTopic="cppTest" +cmdTopic="cppTest" +cmdcbTopic="cppTest" [client] clientId="dev-status" diff --git a/DeviceHub/device/DeviceBase.cpp b/DeviceHub/device/DeviceBase.cpp index 573401c..ede187f 100644 --- a/DeviceHub/device/DeviceBase.cpp +++ b/DeviceHub/device/DeviceBase.cpp @@ -1,4 +1,5 @@ #include "DeviceBase.h" +#include "FrequencyTuning.h" #include DeviceBase::DeviceBase(QObject *parent) : QObject(parent) @@ -6,6 +7,14 @@ } +QString DeviceBase::getDevCode() +{ + return this->devCode; +} +QString DeviceBase::getDeviceId() +{ + return this->deviceId; +} void DeviceBase::setComName(QString comName) { this->comName = comName; @@ -14,10 +23,6 @@ { this->baudRate = baudRate; } -QString DeviceBase::getDevCode() -{ - return this->devCode; -} void DeviceBase::setDevCode(QString devCode) { this->devCode = devCode; @@ -27,6 +32,18 @@ this->deviceId = deviceId; } +DeviceBase * DeviceBase::deviceFactory(QString deviceType, QObject * parent) +{ + DeviceBase * base = 0; + if (deviceType == "03") + { + base = new FrequencyTuning(parent); + base->devType = "03"; + } + + return base; +} + bool DeviceBase::isSerialOpen() { return this->serialUtil.isOpen(); diff --git a/DeviceHub/device/DeviceBase.h b/DeviceHub/device/DeviceBase.h index 3d52a3d..8341091 100644 --- a/DeviceHub/device/DeviceBase.h +++ b/DeviceHub/device/DeviceBase.h @@ -2,6 +2,7 @@ #define DEVICEBASE_H #include +//#include "FrequencyTuning.h" #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaProducer.h" #include "common/utils/QByteUtil.h" @@ -9,7 +10,7 @@ #include "common/utils/SettingConfig.h" #include "protocol/dto/DeviceFrameBaseDto.h" -#include "protocol/DeviceStatusProtocolBase.h" +#include "protocol/DeviceProtocolBase.h" class DeviceBase : public QObject { @@ -17,24 +18,30 @@ public: explicit DeviceBase(QObject *parent = nullptr); + QString getDevCode(); + QString getDeviceId(); void setComName(QString comName); void setBaudRate(int baudRate); - QString getDevCode(); void setDevCode(QString devCode); void setDeviceId(QString deviceId); + static DeviceBase * deviceFactory(QString deviceType, QObject * parent); + void initSerialPort(); bool isSerialOpen(); virtual void sendDataToSerial(QByteArray data); virtual void afterFramePhase(DeviceFrameBaseDto * frameDto) = 0; - DeviceStatusProtocolBase * protocol; + virtual void mockReceivData() = 0; + + DeviceProtocolBase * protocol; protected: QString deviceId; QString devCode; QString comName; int baudRate; + QString devType; QSerialPortUtil serialUtil; QKafkaProducer kafkaProducer; diff --git a/DeviceHub/device/FrequencyTuning.cpp b/DeviceHub/device/FrequencyTuning.cpp index e605b15..ffce052 100644 --- a/DeviceHub/device/FrequencyTuning.cpp +++ b/DeviceHub/device/FrequencyTuning.cpp @@ -1,17 +1,27 @@ #include "FrequencyTuning.h" #include #include +#include "DeviceHubWindow.h" FrequencyTuning::FrequencyTuning(QObject *parent) : DeviceBase(parent) { + this->devType = "03"; connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); + connect(this, &FrequencyTuning::sendDataToDraw, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::drawDeviceFrameOnForm); + connect(this, &FrequencyTuning::sendCommandToDisplay, + ((DeviceHubWindow *)this->parent())->freqTunForm, &FrequencyTuningForm::displayDeviceCommandOnForm); + + connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved, + this, &FrequencyTuning::commandReceivedHandler); + kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaProducer.createProducer(); - this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); + this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType); } FrequencyTuning::~FrequencyTuning() @@ -20,7 +30,17 @@ this, &FrequencyTuning::dataReceivedHandler); } +void FrequencyTuning::mockReceivData() +{ + QByteArray buffer; + // 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,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"); + + this->dataReceivedHandler(buffer); +} void FrequencyTuning::dataReceivedHandler(QByteArray data) { @@ -30,6 +50,8 @@ QList frameList = protocol->extractFrameList(this->dataBuff); + this->dataBuff.clear(); + if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) @@ -37,29 +59,29 @@ QByteArray frameByte = frameList.at(i); int frameType = protocol->checkFrame(frameByte); - DeviceFrameBaseDto * ftFrameDto = protocol->frameFactory(frameType); - if (ftFrameDto != nullptr) + DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType); + if (frameDto != nullptr) { // ★解析成数据对象 - bool parse = protocol->parseDeviceFrameData(frameByte, ftFrameDto, frameType); + bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); - ftFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); - ftFrameDto->milisecond = now.toMSecsSinceEpoch(); - ftFrameDto->rawFrame = frameByte; + frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); + frameDto->milisecond = now.toMSecsSinceEpoch(); + frameDto->rawFrame = frameByte; - ftFrameDto->devCode = devCode; + frameDto->devCode = devCode; - this->afterFramePhase(ftFrameDto); + this->afterFramePhase(frameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 - delete ftFrameDto; + delete frameDto; } } } @@ -107,7 +129,45 @@ QString date = now.toString("yyyy-MM-dd"); // 1. 原始字节数组数据 - QString filename = "raw_" + getDevCode() + ".log"; + QString filename = "raw_" + devCode + ".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); } + +void FrequencyTuning::commandReceivedHandler(QJsonObject command) +{ + if (command.contains("deviceType") == false || command.value("deviceType").toString() != "03") + { + std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId) + { + std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl; + return; + } + + // 记录日志 + // 0. 输出到日志文件中 + QDateTime now = QDateTime::currentDateTime(); + QString date = now.toString("yyyy-MM-dd"); + + // 1. 原始字节数组数据 + QString filename = "command_" + devCode + ".log"; + QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString(); + QLogUtil::writeChannelDataLogByDate(date, filename, content); + + QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString()); + this->sendDataToSerial(commandBytes); + command.insert("rawCommand", QString::fromUtf8(commandBytes)); + + QJsonObject cmdcb; + cmdcb.insert("commandId", command.value("commandId").toString()); + cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes)); + cmdcb.insert("status", "1"); + this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact))); + + // display on page + emit sendCommandToDisplay(command); +} diff --git a/DeviceHub/device/FrequencyTuning.h b/DeviceHub/device/FrequencyTuning.h index 606a985..af49041 100644 --- a/DeviceHub/device/FrequencyTuning.h +++ b/DeviceHub/device/FrequencyTuning.h @@ -4,7 +4,8 @@ #include #include "device/DeviceBase.h" -//#include "protocol/FrequencyTuningProtocolBM.h" +#include "protocol/dto/FrequencyTuningStatusFreqDto.h" +#include "protocol/dto/FrequencyTuningStatusPulseDto.h" class FrequencyTuning : public DeviceBase { @@ -13,14 +14,18 @@ explicit FrequencyTuning(QObject *parent = nullptr); ~FrequencyTuning(); + void mockReceivData() override; + void afterFramePhase(DeviceFrameBaseDto * frameDto) override; void sendDataToSerial(QByteArray data) override; signals: void sendDataToDraw(DeviceFrameBaseDto * frameData); + void sendCommandToDisplay(QJsonObject command); public slots: void dataReceivedHandler(QByteArray data); + void commandReceivedHandler(QJsonObject command); }; diff --git a/DeviceHub/protocol/DeviceProtocolBase.cpp b/DeviceHub/protocol/DeviceProtocolBase.cpp new file mode 100644 index 0000000..ca44773 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.cpp @@ -0,0 +1,78 @@ +#include "DeviceProtocolBase.h" +#include "FrequencyTuningProtocolBM.h" +//#include "SignalGeneratorProtocolBM.h" + +//#include "TimeSwitcherProtocolBM.h" +//#include "FreqSwitcherProtocolBM.h" +//#include "TimeReplicatorProtocolBM.h" +//#include "FreqReplicatorProtocolTX.h" +//#include "BCodeTerminalProtocolBM.h" + +#include + +DeviceProtocolBase::DeviceProtocolBase(QObject *parent) : QObject(parent) +{ + +} + +DeviceProtocolBase * DeviceProtocolBase::deviceProtocolFactory(QString deviceType) +{ + if (deviceType == "03") + { + return new FrequencyTuningProtocolBM(); + } + +// if (deviceType.contains("SignalGenerator") == true) +// { +// return new SignalGeneratorProtocolBM(); +// } else if (deviceType.contains("FrequencyTuning") == true) +// { +// return new FrequencyTuningProtocolBM(); +// } else if (deviceType.contains("TimeSwitcher") == true) +// { +// return new TimeSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqSwitcher") == true) +// { +// return new FreqSwitcherProtocolBM(); +// } else if (deviceType.contains("FreqReplicator") == true) +// { +// return new FreqReplicatorProtocolTX(); +// } else if (deviceType.contains("TimeReplicator") == true) +// { +// return new TimeReplicatorProtocolBM(); +// } else if (deviceType.contains("BCodeTerminal") == true) +// { +// return new BCodeTerminalProtocolBM(); +// } + + return nullptr; +} + +QByteArray DeviceProtocolBase::generateSettingCommand(QString commandType, QString valueSet) +{ + QByteArray commandBytes; + commandBytes.append(commandType).append(","); + commandBytes.append(valueSet); + + QString xorValue = this->calculateXOR(commandBytes); + + commandBytes.prepend("$"); + commandBytes.append("*"); + commandBytes.append(xorValue); + + return commandBytes; +} + +QString DeviceProtocolBase::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/DeviceHub/protocol/DeviceProtocolBase.h b/DeviceHub/protocol/DeviceProtocolBase.h new file mode 100644 index 0000000..8946995 --- /dev/null +++ b/DeviceHub/protocol/DeviceProtocolBase.h @@ -0,0 +1,124 @@ +#ifndef DEVICEPROTOCOLBASE_H +#define DEVICEPROTOCOLBASE_H + +#include +#include "dto/DeviceFrameBaseDto.h" + +static const QString FRAME_TAIL = "\r\n"; // 帧尾 +static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 +static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 +static const int FRAME_SUM_LENGTH = 2; +static const int FRAME_SUB_MIN_SIZE = 2; + +static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 +static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 +static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 +static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 + +static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 +static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 + +static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; +static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; +static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; +static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; +static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; +static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; + +static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; +static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; + + +static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + +static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; +static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + + FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + + FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; + + +static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; +static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; + +static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; +static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; +static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; +static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; + +static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; +static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; + +static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; +static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; + +static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; + +static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; + +static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; + + +class DeviceProtocolBase : public QObject +{ + Q_OBJECT +public: + explicit DeviceProtocolBase(QObject *parent = nullptr); + + static DeviceProtocolBase * deviceProtocolFactory(QString deviceType); + + QString calculateXOR(QByteArray byteArray); + + virtual DeviceFrameBaseDto * frameFactory(int frameType) = 0; + virtual int checkFrame(QByteArray rawData) = 0; + virtual QList extractFrameList(QByteArray rawData) = 0; + virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * frameData, int frameType) = 0; + virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); + +signals: + +}; + +#endif // DEVICEPROTOCOLBASE_H diff --git a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp b/DeviceHub/protocol/DeviceStatusProtocolBase.cpp deleted file mode 100644 index f7353ec..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "DeviceStatusProtocolBase.h" -//#include "SignalGeneratorProtocolBM.h" -//#include "FrequencyTuningProtocolBM.h" -//#include "TimeSwitcherProtocolBM.h" -//#include "FreqSwitcherProtocolBM.h" -//#include "TimeReplicatorProtocolBM.h" -//#include "FreqReplicatorProtocolTX.h" -//#include "BCodeTerminalProtocolBM.h" - -#include - -DeviceStatusProtocolBase::DeviceStatusProtocolBase(QObject *parent) : QObject(parent) -{ - -} - -DeviceStatusProtocolBase * DeviceStatusProtocolBase::deviceStatusProtocolFactory(QString deviceType) -{ - std::cout << deviceType.toStdString() << std::endl; -// if (deviceType.contains("SignalGenerator") == true) -// { -// return new SignalGeneratorProtocolBM(); -// } else if (deviceType.contains("FrequencyTuning") == true) -// { -// return new FrequencyTuningProtocolBM(); -// } else if (deviceType.contains("TimeSwitcher") == true) -// { -// return new TimeSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqSwitcher") == true) -// { -// return new FreqSwitcherProtocolBM(); -// } else if (deviceType.contains("FreqReplicator") == true) -// { -// return new FreqReplicatorProtocolTX(); -// } else if (deviceType.contains("TimeReplicator") == true) -// { -// return new TimeReplicatorProtocolBM(); -// } else if (deviceType.contains("BCodeTerminal") == true) -// { -// return new BCodeTerminalProtocolBM(); -// } - - return nullptr; -} - -QByteArray DeviceStatusProtocolBase::generateSettingCommand(QString commandType, QString valueSet) -{ - QByteArray commandBytes; - commandBytes.append(commandType).append(","); - commandBytes.append(valueSet); - - QString xorValue = this->calculateXOR(commandBytes); - - commandBytes.prepend("$"); - commandBytes.append("*"); - commandBytes.append(xorValue); - - return commandBytes; -} - -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/DeviceHub/protocol/DeviceStatusProtocolBase.h b/DeviceHub/protocol/DeviceStatusProtocolBase.h deleted file mode 100644 index ae3d4cb..0000000 --- a/DeviceHub/protocol/DeviceStatusProtocolBase.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef DEVICESTATUSPROTOCOLBASE_H -#define DEVICESTATUSPROTOCOLBASE_H - -#include -#include "dto/DeviceFrameBaseDto.h" - -static const QString FRAME_TAIL = "\r\n"; // 帧尾 -static const QString FRAME_CONTENT_SEP = ","; // 帧内分隔符 -static const QString FRAME_SUM_SEP = "*"; // 异或和字段的分隔符 -static const int FRAME_SUM_LENGTH = 2; -static const int FRAME_SUB_MIN_SIZE = 2; - -static const QString FREQUENCY_TUNING_FREQ_FRAME_HEAD = "$GLF"; // 帧头 -static const QString FREQUENCY_TUNING_PULSE_FRAME_HEAD = "$GLP"; // 帧头 - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString SIGNAL_GENERATOR_STATUS_FRAME_HEAD = "$GLF"; // 帧头 -static const QString SIGNAL_GENERATOR_MJD_FRAME_HEAD = "$GPMJD"; // 帧头 -static const QString SIGNAL_GENERATOR_ZDA_FRAME_HEAD = "$GPZDA"; // 帧头 - -static const QString TIME_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString TIME_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_SWITCHER_INTERFACE_FRAME_HEAD = "$GLC"; // 帧头 -static const QString FREQ_SWITCHER_STATUS_FRAME_HEAD = "$GLF"; // 帧头 - -static const QString FREQ_REPLICATOR_STAUTS_FRAME_HEAD = "AA55"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_HEAD = "$"; -static const QString TIME_REPLICATOR_STATUS_FRAME_TAIL = "*"; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT = 26; -static const int FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT = 5; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT = 2; -static const int SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT = 11; -static const int SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT = 6; -static const int SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT = 4; - -static const int TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int TIME_SWITCHER_STATUS_FRAME_SUB_COUNT = 24; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT = 1; -static const int FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT = 21; - - -static const int FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH = FREQUENCY_TUNING_FREQ_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_FREQ_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH = FREQUENCY_TUNING_PULSE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQUENCY_TUNING_PULSE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int SIGNAL_GENERATOR_INTERFACE_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_STATUS_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_ZDA_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_ZDA_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_ZDA_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int SIGNAL_GENERATOR_MJD_FRAME_MIN_LENGTH = SIGNAL_GENERATOR_MJD_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - SIGNAL_GENERATOR_MJD_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int TIME_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = TIME_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int TIME_SWITCHER_STATUS_FRAME_MIN_LENGTH = TIME_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - TIME_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - -static const int FREQ_SWITCHER_INTERFACE_FRAME_MIN_LENGTH = FREQ_SWITCHER_INTERFACE_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_INTERFACE_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; -static const int FREQ_SWITCHER_STATUS_FRAME_MIN_LENGTH = FREQ_SWITCHER_STATUS_FRAME_HEAD.length() + - FRAME_TAIL.length() + 1 + FRAME_SUB_MIN_SIZE + - FREQ_SWITCHER_STATUS_FRAME_SUB_COUNT * FRAME_SUB_MIN_SIZE; - - -static const QString FREQUENCY_TUNING_FREQ_FRAME_TYPE = "0301"; -static const QString FREQUENCY_TUNING_PULSE_FRAME_TYPE = "0302"; - -static const QString SIGNAL_GENERATOR_INTERFACE_FRAME_TYPE = "0401"; -static const QString SIGNAL_GENERATOR_STATUS_FRAME_TYPE = "0402"; -static const QString SIGNAL_GENERATOR_MJD_FRAME_TYPE = "0403"; -static const QString SIGNAL_GENERATOR_ZDA_FRAME_TYPE = "0404"; - -static const QString TIME_SWITCHER_STATUS_FRAME_TYPE = "0501"; -static const QString TIME_SWITCHER_INTERFACE_FRAME_TYPE = "0502"; - -static const QString FREQ_SWITCHER_STATUS_FRAME_TYPE = "0601"; -static const QString FREQ_SWITCHER_INTERFACE_FRAME_TYPE = "0602"; - -static const QString B_CODE_TERMINAL_STATUS_FRAME_TYPE = "0701"; - -static const QString TIME_REPLICATOR_STATUS_FRAME_TYPE = "0901"; - -static const QString FREQ_REPLICATOR_STATUS_FRAME_TYPE = "1001"; - - -class DeviceStatusProtocolBase : public QObject -{ - Q_OBJECT -public: - explicit DeviceStatusProtocolBase(QObject *parent = nullptr); - - 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; - virtual bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) = 0; - virtual QByteArray generateSettingCommand(QString commandType, QString valueSet); - -signals: - -}; - -#endif // DEVICESTATUSPROTOCOLBASE_H diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp new file mode 100644 index 0000000..2f7fa69 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.cpp @@ -0,0 +1,131 @@ +#include "FrequencyTuningProtocolBM.h" + +FrequencyTuningProtocolBM::FrequencyTuningProtocolBM(QObject *parent) : DeviceProtocolBase(parent) +{ + +} + +FrequencyTuningProtocolBM::~FrequencyTuningProtocolBM() +{ + +} + +DeviceFrameBaseDto * FrequencyTuningProtocolBM::frameFactory(int frameType) +{ + DeviceFrameBaseDto * frameData = 0; + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + frameData = new FrequencyTuningStatusFreqDto(); + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + frameData = new FrequencyTuningStatusPulseDto(); + break; + + default: + frameData = nullptr; + break; + } + + return frameData; +} + +bool FrequencyTuningProtocolBM::parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType) +{ + // get the raw data between ',' and '*' + int start = rawData.indexOf(FRAME_CONTENT_SEP); + int end = rawData.indexOf(FRAME_SUM_SEP); + + QByteArray content = rawData.mid(start + 1, end - start - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(","); + + switch (frameType) { + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME : + + ((FrequencyTuningStatusFreqDto *)ftFrameData)->freqAdjustAcc = subList.at(16).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->pulseAdjustAcc = subList.at(17).toLongLong(); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->devStatus = subList.at(23); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputTimeType = subList.at(24); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->inputValid = subList.at(25); + ((FrequencyTuningStatusFreqDto *)ftFrameData)->frameType = FREQUENCY_TUNING_FREQ_FRAME_TYPE; + break; + + case FrequencyTuningProtocolBM::FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME : + + ((FrequencyTuningStatusPulseDto *)ftFrameData)->synchStatus = subList.at(0); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->secondDiff = subList.at(1).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->refValid = subList.at(2); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->phaseShiftAcc = subList.at(3).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->pulseWidth = subList.at(4).toLongLong(); + ((FrequencyTuningStatusPulseDto *)ftFrameData)->frameType = FREQUENCY_TUNING_PULSE_FRAME_TYPE; + break; + } + + return true; +} + +QList FrequencyTuningProtocolBM::extractFrameList(QByteArray rawData) +{ + QList resultList; + if (rawData.endsWith(QByteArray("\r\n")) == true && rawData.startsWith("$") == true) + { + QByteArray ba; + for (int i = 0; i < rawData.size() - 1; i++) + { + if (rawData.at(i) != '\r') + { + ba.append(rawData.at(i)); + } else + { + if (rawData.at(i + 1) == '\n') + { + ba.append("\r\n"); + resultList.append(ba); + ba.clear(); + i++; + } else + { + ba.append(rawData.at(i)); + } + } + } + } + + return resultList; +} + +int FrequencyTuningProtocolBM::checkFrame(QByteArray rawData) +{ + // 帧尾不是\r\n + if (FRAME_TAIL.toLocal8Bit() != rawData.mid(rawData.size() - FRAME_TAIL.size())) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } + + // 帧头不是$GL + if (FREQUENCY_TUNING_FREQ_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_FREQ_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_FREQ_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::FREQ_FRAME; + } + } else if (FREQUENCY_TUNING_PULSE_FRAME_HEAD.toLocal8Bit() == rawData.mid(0, FREQUENCY_TUNING_PULSE_FRAME_HEAD.size())) + { + // 帧长度小于最小的长度 + if (rawData.size() < FREQUENCY_TUNING_PULSE_FRAME_MIN_LENGTH) + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::PULSE_FRAME; + } + } else + { + return FREQUENCY_TUNING_FRAME_TYPE::UNKNOW_FRAME; + } +} diff --git a/DeviceHub/protocol/FrequencyTuningProtocolBM.h b/DeviceHub/protocol/FrequencyTuningProtocolBM.h new file mode 100644 index 0000000..8c7f259 --- /dev/null +++ b/DeviceHub/protocol/FrequencyTuningProtocolBM.h @@ -0,0 +1,37 @@ +#ifndef FREQUENCYTUNINGPROTOCOLBM_H +#define FREQUENCYTUNINGPROTOCOLBM_H + +#include +#include + +#include "protocol/DeviceProtocolBase.h" +#include "dto/FrequencyTuningStatusFreqDto.h" +#include "dto/FrequencyTuningStatusPulseDto.h" + +class FrequencyTuningProtocolBM : public DeviceProtocolBase +{ + Q_OBJECT +public: + explicit FrequencyTuningProtocolBM(QObject *parent = nullptr); + ~FrequencyTuningProtocolBM(); + + // 解析数据 + bool parseDeviceFrameData(QByteArray rawData, DeviceFrameBaseDto * ftFrameData, int frameType); + DeviceFrameBaseDto * frameFactory(int frameType); + + // + QList extractFrameList(QByteArray rawData); + + // 检测帧格式,帧头帧尾 + int checkFrame(QByteArray rawData); + + enum FREQUENCY_TUNING_FRAME_TYPE + { + UNKNOW_FRAME = 0, + FREQ_FRAME = 1, + PULSE_FRAME = 2, + NETWORK_FRAME = 3 + }; +}; + +#endif // FREQUENCYTUNINGPROTOCOLBM_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp new file mode 100644 index 0000000..33749fa --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.cpp @@ -0,0 +1,6 @@ +#include "FrequencyTuningSettingDto.h" + +FrequencyTuningSettingDto::FrequencyTuningSettingDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h new file mode 100644 index 0000000..17c9ba9 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningSettingDto.h @@ -0,0 +1,21 @@ +#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; +}; + +#endif // FREQUENCYTUNINGSETTINGDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp new file mode 100644 index 0000000..9de0d94 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusFreqDto.h" + +FrequencyTuningStatusFreqDto::FrequencyTuningStatusFreqDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusFreqDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("devStatus", devStatus); + dataObj.insert("inputTimeType", inputTimeType); + dataObj.insert("inputValid", inputValid); + dataObj.insert("freqAdjustAcc", freqAdjustAcc); + dataObj.insert("pulseAdjustAcc", (float) pulseAdjustAcc * 0.1); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h new file mode 100644 index 0000000..83eb103 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusFreqDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSFREQDTO_H +#define FREQUENCYTUNINGSTATUSFREQDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusFreqDto class + * 频率微调设备工作状态:频率输出状态 + */ +class FrequencyTuningStatusFreqDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusFreqDto(QObject *parent = nullptr); + + QString devStatus; // <24> 设备工作状态:1=正常;0=异常 + QString inputTimeType; // <25> 输入时钟类别:1=5MHz;0=10MHz + QString inputValid; // <26> 输入有效性:1=有效;0=无效 + qlonglong freqAdjustAcc; // <17> 频率调整累计值,单位1pHz + qlonglong pulseAdjustAcc; // <18> 相位调整累计值,单位0.1fs + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSFREQDTO_H diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp new file mode 100644 index 0000000..aefae50 --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.cpp @@ -0,0 +1,24 @@ +#include "FrequencyTuningStatusPulseDto.h" + +FrequencyTuningStatusPulseDto::FrequencyTuningStatusPulseDto(QObject *parent) : DeviceFrameBaseDto(parent) +{ + +} + +QJsonObject FrequencyTuningStatusPulseDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("synchStatus", synchStatus); + dataObj.insert("secondDiff", secondDiff); + dataObj.insert("refValid", refValid); + dataObj.insert("phaseShiftAcc", phaseShiftAcc); + dataObj.insert("pulseWidth", pulseWidth); + + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("frameType", this->frameType); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h new file mode 100644 index 0000000..2745f8d --- /dev/null +++ b/DeviceHub/protocol/dto/FrequencyTuningStatusPulseDto.h @@ -0,0 +1,26 @@ +#ifndef FREQUENCYTUNINGSTATUSPULSEDTO_H +#define FREQUENCYTUNINGSTATUSPULSEDTO_H + +#include +#include "protocol/dto/DeviceFrameBaseDto.h" + +/** + * @brief The FrequencyTuningStatusPulseDto class + * 频率微调设备工作状态:秒脉冲状态 + */ +class FrequencyTuningStatusPulseDto : public DeviceFrameBaseDto +{ + Q_OBJECT +public: + explicit FrequencyTuningStatusPulseDto(QObject *parent = nullptr); + + QString synchStatus; // <1> 同步状态:1=正常;0=异常 + qlonglong secondDiff; // <2> 秒差,单位1ns,范围-500ms~500ms + QString refValid; // <3> 参考有效:1=有效;0=无效 + qlonglong phaseShiftAcc; // <4> 移相累计值,单位1ps,范围-500ms~500ms + qlonglong pulseWidth; // <5> 移脉宽,单位1ns,范围10us~500ms + + QJsonObject toJSON(); +}; + +#endif // FREQUENCYTUNINGSTATUSPULSEDTO_H diff --git a/DeviceHub/protocol/protocol.pri b/DeviceHub/protocol/protocol.pri index 671d58c..01d3e1a 100644 --- a/DeviceHub/protocol/protocol.pri +++ b/DeviceHub/protocol/protocol.pri @@ -1,13 +1,17 @@ HEADERS += $$PWD/dto/DeviceFrameBaseDto.h +HEADERS += $$PWD/dto/FrequencyTuningStatusFreqDto.h +HEADERS += $$PWD/dto/FrequencyTuningStatusPulseDto.h +HEADERS += $$PWD/dto/FrequencyTuningSettingDto.h + +HEADERS += $$PWD/DeviceProtocolBase.h +HEADERS += $$PWD/FrequencyTuningProtocolBM.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 @@ -15,9 +19,8 @@ #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 + #HEADERS += $$PWD/TimeSwitcherProtocolBM.h #HEADERS += $$PWD/FreqSwitcherProtocolBM.h #HEADERS += $$PWD/TimeReplicatorProtocolBM.h @@ -29,19 +32,19 @@ #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/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 #SOURCES += $$PWD/dto/TimeReplicatorStatusDto.cpp #SOURCES += $$PWD/dto/FreqSwitcherStatusDto.cpp -SOURCES += $$PWD/DeviceStatusProtocolBase.cpp +SOURCES += $$PWD/DeviceProtocolBase.cpp +SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp #SOURCES += $$PWD/dto/FreqReplicatorStatusDto.cpp #SOURCES += $$PWD/dto/BCodeTerminalStatusDto.cpp #SOURCES += $$PWD/SignalGeneratorProtocolBM.cpp -#SOURCES += $$PWD/FrequencyTuningProtocolBM.cpp #SOURCES += $$PWD/TimeSwitcherProtocolBM.cpp #SOURCES += $$PWD/FreqSwitcherProtocolBM.cpp #SOURCES += $$PWD/TimeReplicatorProtocolBM.cpp