diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index 6b57aab..e3b3a9a 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -33,6 +33,7 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); KAFKA_MSG_TOPIC = getProperty("kafka", "msgTopic").toString(); KAFKA_STATUS_TOPIC = getProperty("kafka", "statusTopic").toString(); + KAFKA_ALARM_TOPIC = getProperty("kafka", "alarmTopic").toString(); NEED_SASL = getProperty("kafka", "needSasl").toInt(); SASL_USERNAME = getProperty("kafka", "saslUsername").toString(); SASL_PASSWORD = getProperty("kafka", "saslPassword").toString(); @@ -47,6 +48,11 @@ SERVER_PORT = getProperty("client", "serverPort").toInt(); RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); + CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); + + HARD_CODE_QSS = getProperty("qss", "hardCodeNames").toString().split(","); + BASE_URL = getProperty("http", "baseUrl").toString(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index 6b57aab..e3b3a9a 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -33,6 +33,7 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); KAFKA_MSG_TOPIC = getProperty("kafka", "msgTopic").toString(); KAFKA_STATUS_TOPIC = getProperty("kafka", "statusTopic").toString(); + KAFKA_ALARM_TOPIC = getProperty("kafka", "alarmTopic").toString(); NEED_SASL = getProperty("kafka", "needSasl").toInt(); SASL_USERNAME = getProperty("kafka", "saslUsername").toString(); SASL_PASSWORD = getProperty("kafka", "saslPassword").toString(); @@ -47,6 +48,11 @@ SERVER_PORT = getProperty("client", "serverPort").toInt(); RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); + CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); + + HARD_CODE_QSS = getProperty("qss", "hardCodeNames").toString().split(","); + BASE_URL = getProperty("http", "baseUrl").toString(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index ae345ff..5a0fbda 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -40,6 +40,7 @@ QString KAFKA_DATA_TOPIC; QString KAFKA_MSG_TOPIC; QString KAFKA_STATUS_TOPIC; + QString KAFKA_ALARM_TOPIC; qint8 NEED_SASL; QString SASL_USERNAME; QString SASL_PASSWORD; @@ -54,6 +55,11 @@ quint16 SERVER_PORT; qint8 RESIDUAL_CALC_SEC; + QStringList DEVICE_ALARM_CODES; + QStringList CHANNEL_ALARM_CODES; + + QStringList HARD_CODE_QSS; + QString BASE_URL; QString BASE_LOG_PATH; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index 6b57aab..e3b3a9a 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -33,6 +33,7 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); KAFKA_MSG_TOPIC = getProperty("kafka", "msgTopic").toString(); KAFKA_STATUS_TOPIC = getProperty("kafka", "statusTopic").toString(); + KAFKA_ALARM_TOPIC = getProperty("kafka", "alarmTopic").toString(); NEED_SASL = getProperty("kafka", "needSasl").toInt(); SASL_USERNAME = getProperty("kafka", "saslUsername").toString(); SASL_PASSWORD = getProperty("kafka", "saslPassword").toString(); @@ -47,6 +48,11 @@ SERVER_PORT = getProperty("client", "serverPort").toInt(); RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); + CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); + + HARD_CODE_QSS = getProperty("qss", "hardCodeNames").toString().split(","); + BASE_URL = getProperty("http", "baseUrl").toString(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index ae345ff..5a0fbda 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -40,6 +40,7 @@ QString KAFKA_DATA_TOPIC; QString KAFKA_MSG_TOPIC; QString KAFKA_STATUS_TOPIC; + QString KAFKA_ALARM_TOPIC; qint8 NEED_SASL; QString SASL_USERNAME; QString SASL_PASSWORD; @@ -54,6 +55,11 @@ quint16 SERVER_PORT; qint8 RESIDUAL_CALC_SEC; + QStringList DEVICE_ALARM_CODES; + QStringList CHANNEL_ALARM_CODES; + + QStringList HARD_CODE_QSS; + QString BASE_URL; QString BASE_LOG_PATH; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index d06d45b..e8867aa 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -11,7 +11,7 @@ dataTopic="clock-data" statusTopic="dev-status" msgTopic="clock-message" -alarmTopic="alarm-message" +alarmTopic="alarm-msg" needSasl=1 saslUsername="admin" saslPassword="casicss" @@ -27,6 +27,13 @@ serverPort=5905 residualCalcSec=30 +[alarm] +deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" +channelAlarmCodes="FREQUENCY_HOPPING,PHASE_HOPPING,BAD_DATA,DATA_EXCEPTION,COUNTER_NO_DATA" + +[qss] +hardCodeNames="devTitle,devRef,channelNameEven,channelValueEven,channelNameOdd,channelValueOdd" + [http] baseUrl="http://192.168.20.135:11410" diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index 6b57aab..e3b3a9a 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -33,6 +33,7 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); KAFKA_MSG_TOPIC = getProperty("kafka", "msgTopic").toString(); KAFKA_STATUS_TOPIC = getProperty("kafka", "statusTopic").toString(); + KAFKA_ALARM_TOPIC = getProperty("kafka", "alarmTopic").toString(); NEED_SASL = getProperty("kafka", "needSasl").toInt(); SASL_USERNAME = getProperty("kafka", "saslUsername").toString(); SASL_PASSWORD = getProperty("kafka", "saslPassword").toString(); @@ -47,6 +48,11 @@ SERVER_PORT = getProperty("client", "serverPort").toInt(); RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); + CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); + + HARD_CODE_QSS = getProperty("qss", "hardCodeNames").toString().split(","); + BASE_URL = getProperty("http", "baseUrl").toString(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index ae345ff..5a0fbda 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -40,6 +40,7 @@ QString KAFKA_DATA_TOPIC; QString KAFKA_MSG_TOPIC; QString KAFKA_STATUS_TOPIC; + QString KAFKA_ALARM_TOPIC; qint8 NEED_SASL; QString SASL_USERNAME; QString SASL_PASSWORD; @@ -54,6 +55,11 @@ quint16 SERVER_PORT; qint8 RESIDUAL_CALC_SEC; + QStringList DEVICE_ALARM_CODES; + QStringList CHANNEL_ALARM_CODES; + + QStringList HARD_CODE_QSS; + QString BASE_URL; QString BASE_LOG_PATH; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index d06d45b..e8867aa 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -11,7 +11,7 @@ dataTopic="clock-data" statusTopic="dev-status" msgTopic="clock-message" -alarmTopic="alarm-message" +alarmTopic="alarm-msg" needSasl=1 saslUsername="admin" saslPassword="casicss" @@ -27,6 +27,13 @@ serverPort=5905 residualCalcSec=30 +[alarm] +deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" +channelAlarmCodes="FREQUENCY_HOPPING,PHASE_HOPPING,BAD_DATA,DATA_EXCEPTION,COUNTER_NO_DATA" + +[qss] +hardCodeNames="devTitle,devRef,channelNameEven,channelValueEven,channelNameOdd,channelValueOdd" + [http] baseUrl="http://192.168.20.135:11410" diff --git a/CounterRealTime/qss/mainClock.css b/CounterRealTime/qss/mainClock.css index f9ec3e2..146c5a0 100644 --- a/CounterRealTime/qss/mainClock.css +++ b/CounterRealTime/qss/mainClock.css @@ -35,15 +35,6 @@ /* widgetTitle */ /* widgetContent */ -QWidget[form="dev"] { - border: 3px solid #0BB2E9; - border-radius: 12px; -} -QWidget[form="devAlarm"] { - border: 3px solid #FF0000; - border-radius: 12px; -} - QWidget#widgetContent QLabel { font-weight: bold; } @@ -51,16 +42,38 @@ font-size: 28px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; } QLabel[labType='devTitle6'] { font-size: 24px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; } QLabel[labType='devTitle8'] { font-size: 18px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; +} + +QLabel[labType='devRef4'] { + font-size: 28px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; +} +QLabel[labType='devRef6'] { + font-size: 24px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; +} +QLabel[labType='devRef8'] { + font-size: 18px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; } QLabel[labType='channelNameEven4'] { @@ -127,15 +140,34 @@ background-color: #123553; } -QLabel[labType='channelNameAlarm'] { - font-size: 28px; +QLabel[labType='channelAlarm'] { color: #FFF000; background-color: #9F1919; } -QLabel[labType='channelValueAlarm'] { - font-size: 28px; +QLabel[labType='channelOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; +} + +QLabel[labType='devTitleAlarm'] { color: #FFF000; background-color: #9F1919; + border-top-left-radius: 10px; +} +QLabel[labType='devRefAlarm'] { + color: #FFF000; + background-color: #9F1919; + border-top-right-radius: 10px; +} +QLabel[labType='devTitleOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; + border-top-left-radius: 10px; +} +QLabel[labType='devRefOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; + border-top-right-radius: 10px; } /* widgetContent */ diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 4940039..c069623 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,10 +117,12 @@ } // 到达拟合计算时间点时 触发 + /* if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) { this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); } + */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 13b18ef..6583638 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -20,6 +20,48 @@ QString paletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(paletteColor))); qApp->setStyleSheet(qss); + + int n[3] = {4, 6, 8}; + for (int i = 0; i < SettingConfig::getInstance().HARD_CODE_QSS.size(); i++) + { + for (int j = 0; j < 3; j++) { + QString name = QString("%1%2").arg(SettingConfig::getInstance().HARD_CODE_QSS.at(i)).arg(n[j]); + int nameIdx = qss.indexOf(name); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert(name, qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + } + } + int nameIdx = qss.indexOf("channelAlarm"); + int start = qss.indexOf("{", nameIdx) + 1; + int end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("channelOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("channelOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefAlarm"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefAlarm", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devTitleOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devTitleOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + + nameIdx = qss.indexOf("devRefOffline"); + start = qss.indexOf("{", nameIdx) + 1; + end = qss.indexOf("}", nameIdx); + ConstCache::getInstance().qssConstMap.insert("devRefOffline", qss.mid(start, end - start).replace("\n", "").replace(" ", "")); + file.close(); } @@ -33,6 +75,14 @@ kafkaConsumer->start(); connect(kafkaConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onKafkaMessageReceived); + // kafka consumer + alarmMsgConsumer = new QKafkaConsumer(this); + alarmMsgConsumer->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); + alarmMsgConsumer->setTopic(SettingConfig::getInstance().KAFKA_ALARM_TOPIC); + alarmMsgConsumer->createConsumer(); + alarmMsgConsumer->start(); + connect(alarmMsgConsumer, &QKafkaConsumer::messageRecieved, this, &CounterWindowRT::onAlarmMessageReceived); + // 绘制界面上的表格 initChannelForm(); @@ -91,7 +141,7 @@ { switch (event->key()) { case Qt::Key_Escape: - QTimer::singleShot(100, qApp, SLOT(quit())); +// QTimer::singleShot(100, qApp, SLOT(quit())); default: QWidget::keyPressEvent(event); @@ -198,7 +248,6 @@ { // 计数器对应的wideget QWidget * widgetDev = new QWidget(ui->widgetContent); - widgetDev->setProperty("form", "dev"); // 添加属性,用于css样式选择 layoutConter->addWidget(widgetDev); // 每个计数器框内为左右布局 @@ -218,15 +267,13 @@ labDevTitle->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 labDevTitle->setText(QString("计数器-%1").arg(i + 1)); labDevTitle->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevTitle->setStyleSheet("border-top-left-radius: 10px;"); // 左上角的圆角 devTitleList.append(labDevTitle); // 设备参考通道的Label QLabel * labDevRef = new QLabel(widgetDev); - labDevRef->setProperty("labType", QString("devTitle%1").arg(count)); // 样式表属性 + labDevRef->setProperty("labType", QString("devRef%1").arg(count)); // 样式表属性 labDevRef->setText(QString("REF: %1").arg("1000")); labDevRef->setAlignment(Qt::AlignCenter); // 文字居中显示 - labDevRef->setStyleSheet("border-top-right-radius: 10px;"); // 右上角的圆角 devRefList.append(labDevRef); if (count == 4) { @@ -309,6 +356,19 @@ // 参考通道的显示 QString refText = devRefList.at(devIdx)->text(); channelNameList.at(devIdx * 16 + refChNo - 1)->setText(QString("CH%1:%2").arg(refChNo, 2, 10, QLatin1Char('0')).arg(refText.right(refText.length() - 4))); + + if (alarmDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleAlarm")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefAlarm")); + } else if (offlineDev.contains(deviceId) == true) + { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devTitleOffline")); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("devRefOffline")); + } else { + devTitleList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devTitleList.at(devIdx)->property("labType").toString())); + devRefList.at(devIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(devRefList.at(devIdx)->property("labType").toString())); + } } QMap channelDataJsonMap; @@ -342,7 +402,20 @@ CounterChannel * channel = ConstCache::getInstance().channelMap.value(deviceId + "-" + channelNo); // 从map中找到对应的通道 // 通道Label的序号 - int chanelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + int channelIdx = devIdx * 16 + channelDataItem.value("channelNo").toInt() - 1; + + if (alarmChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelAlarm")); + } else if (offlineChannel.contains(channel->getChannelId()) == true) + { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value("channelOffline")); + } else { + channelNameList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelNameList.at(channelIdx)->property("labType").toString())); + channelValueList.at(channelIdx)->setStyleSheet(ConstCache::getInstance().qssConstMap.value(channelValueList.at(channelIdx)->property("labType").toString())); + } if (channel != nullptr && channel->isActive() == true) { @@ -351,108 +424,66 @@ double valueMinusDelay = channelDataItem.value("data").toObject().value("dataValue").toString().toDouble() - delay * 1E-9 + refDelay * 1E-9; // 设置通道名和测量值的QLabel - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); - channelValueList.at(chanelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg(channel->getChannelCode())); + channelValueList.at(channelIdx)->setText(QString::number(valueMinusDelay, 'f', 12)); - channelNameList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelNameList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelNameList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelNameList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelNameList.at(channelIdx)->setProperty("deviceId", deviceId); + channelNameList.at(channelIdx)->setProperty("channelNo", channelNo); - channelValueList.at(chanelIdx)->setProperty("channelId", channel->getChannelId()); - channelValueList.at(chanelIdx)->setProperty("deviceId", deviceId); - channelValueList.at(chanelIdx)->setProperty("channelNo", channelNo); + channelValueList.at(channelIdx)->setProperty("channelId", channel->getChannelId()); + channelValueList.at(channelIdx)->setProperty("deviceId", deviceId); + channelValueList.at(channelIdx)->setProperty("channelNo", channelNo); } else { - channelNameList.at(chanelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); - channelValueList.at(chanelIdx)->setText(""); + channelNameList.at(channelIdx)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); + channelValueList.at(channelIdx)->setText(""); } } else { // 没有测量值的通道清空 channelNameList.at(devIdx * 16 + i)->setText(QString("CH%1:%2").arg(channelNoStr).arg("-")); channelValueList.at(devIdx * 16 + i)->setText(""); - - channelNameList.at(devIdx * 16 + i)->setProperty("labType", "channelNameAlarm"); - channelValueList.at(devIdx * 16 + i)->setProperty("labType", "channelValueAlarm"); } } } void CounterWindowRT::updateDeviceAlarm(QJsonArray alarmList) { - QVector alarmDev; - QVector alarmChannel; for (int i = 0; i < alarmList.size(); i++) { QJsonObject alarmData = alarmList.at(i).toObject(); QString deviceId = alarmData.value("deviceId").toString(); QString channelId = alarmData.value("channelId").toString(); - QString level = alarmData.value("level").toString(); + QString alarmCode = alarmData.value("alarmCode").toString(); QString status = alarmData.value("status").toString(); - if (alarmDev.contains(deviceId) == false) { - alarmDev.append(deviceId); - } -// CounterChannel * - } - - for (int i = 0; i < alarmDev.size(); i++) - { - CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(alarmDev.at(i)); - if (devicePtr != nullptr) + // 如果报警状态不是正在报警 status==0 或者报警设备不是计数器 则不处理 + if (status != "0" || ConstCache::getInstance().deviceMap.contains(deviceId) == false) { - if (settingForm->getDisplayGroupFlag() == 1) - { - if (ConstCache::getInstance().deviceIdLoopA.contains(alarmDev.at(i))) - { - ((QWidget *)ui->widgetContent->children().at(devicePtr->getFormColIndex() + 1))->setProperty("form", "devAlarm"); - this->setDevAndChannelAlarm(devicePtr->getFormColIndex(), 0, 0); - } - } else if (settingForm->getDisplayGroupFlag() == 0) - { - if (ConstCache::getInstance().deviceIdLoopB.contains(alarmDev.at(i))) - { - qDebug() << "B: " << devicePtr->getFormColIndex() << ui->widgetContent->children().size(); + continue; + } - } + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); } } - } -} -CounterChannel * CounterWindowRT::getChannelByDevAndId(QString deviceId, QString channelId) -{ - if (deviceId.isEmpty() == true || channelId.isEmpty() == true) - return nullptr; - - for (int i = 1; i <= 16; i++) - { - QString key = QString("%1-%2").arg(deviceId).arg(i); - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(key); - if (channelPtr != nullptr) { - if (channelPtr->getChannelId() == channelId) - { - return channelPtr; + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true && alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); } } } - return nullptr; -} - -void CounterWindowRT::setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm) -{ - // TODO - ((QWidget *) ui->widgetContent->children().at(devIndex + 1))->setStyleSheet("border: 3px solid #FF0000"); - - for (int i = 1; i < ui->widgetContent->children().at(devIndex + 1)->children().size(); i++) - { - ((QWidget *) ui->widgetContent->children().at(devIndex + 1)->children().at(i))->setStyleSheet("border: 0px;"); - } - - devTitleList.at(devIndex)->setStyleSheet("border-top-left-radius: 10px; border: 3px solid #1E5A7C;"); - devRefList.at(devIndex)->setStyleSheet("border-top-right-radius: 10px; border: 3px solid #1E5A7C;"); - - channelNameList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-left-radius: 10px; border: 3px solid #123553;"); - channelValueList.at(devIndex * 16 + 15)->setStyleSheet("border-bottom-right-radius: 10px; border: 3px solid #123553;"); + qDebug() << alarmDev; + qDebug() << offlineDev; + qDebug() << alarmChannel; + qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() @@ -605,3 +636,61 @@ this->getDeviceList(); } } + +void CounterWindowRT::onAlarmMessageReceived(QJsonObject alarmMsg) +{ + qDebug() << alarmMsg; + std::cout << QString(QJsonDocument(alarmMsg).toJson(QJsonDocument::Compact)).toStdString() << std::endl; + + QString deviceId = alarmMsg.value("deviceId").toString(); + QString channelId = alarmMsg.value("channelId").toString(); + QString alarmCode = alarmMsg.value("alarmCode").toString(); + QString status = alarmMsg.value("status").toString(); + + if (ConstCache::getInstance().deviceMap.contains(deviceId) == false) { + return; + } + + // 是设备级的报警 + if (SettingConfig::getInstance().DEVICE_ALARM_CODES.contains(alarmCode) == true && alarmDev.contains(deviceId) == false) { + if (status == "0") + { + if (alarmDev.contains(deviceId) == false) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.append(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.append(deviceId); + } + } + } else { + if (alarmDev.contains(deviceId) == true) { + if (alarmCode == "DEVICE_OFFLINE") { + offlineDev.removeOne(deviceId); + } else if (alarmCode == "DEVICE_ALARM") { + alarmDev.removeOne(deviceId); + } + } + } + } + + if (channelId.isEmpty() == false && SettingConfig::getInstance().CHANNEL_ALARM_CODES.contains(alarmCode) == true) { + if (status == "0") + { + if (alarmChannel.contains(channelId) == false) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.append(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.append(channelId); + } + } + } else { + if (alarmChannel.contains(channelId) == true) { + if (alarmCode == "COUNTER_NO_DATA") { + offlineChannel.removeOne(channelId); + } else if (alarmCode == "FREQUENCY_HOPPING" || alarmCode == "PHASE_HOPPING" || alarmCode == "BAD_DATA" || alarmCode == "DATA_EXCEPTION") { + alarmChannel.removeOne(channelId); + } + } + } + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index a0208e7..245d1fc 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -49,6 +49,12 @@ HttpRequestController * httpReq; QKafkaConsumer * kafkaConsumer; + QKafkaConsumer * alarmMsgConsumer; + + QVector alarmDev; + QVector offlineDev; + QVector alarmChannel; + QVector offlineChannel; int initHttpToken(); void getDeviceList(); @@ -58,10 +64,6 @@ void updateChannelDataForm(QJsonArray messageArray); void updateDeviceAlarm(QJsonArray alarmList); - CounterChannel * getChannelByDevAndId(QString deviceId, QString channelId); - - void setDevAndChannelAlarm(int devIndex, int channelIndex, bool alarm); - private slots: void updateDateAndTime(); @@ -75,8 +77,6 @@ void drawCounterDataOnPage(QJsonArray messageArray); void onKafkaMessageReceived(QJsonObject message); - -// void queryClockAlarmOnTime(); -// void onAlarmChanged(); + void onAlarmMessageReceived(QJsonObject alarmMsg); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 9b193f3..0f542dd 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -31,6 +31,11 @@ QList deviceIdLoopB; // B路计数器对象集合 key=deviceId QMap channelMap; // 通道对象集合 key=deviceId-channelNo + QMap alarmDeviceMap; // 报警设备 + QMap alarmChannelMap; // 报警通道 + + QMap qssConstMap; + private: ConstCache() {}; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index 6b57aab..e3b3a9a 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -33,6 +33,7 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); KAFKA_MSG_TOPIC = getProperty("kafka", "msgTopic").toString(); KAFKA_STATUS_TOPIC = getProperty("kafka", "statusTopic").toString(); + KAFKA_ALARM_TOPIC = getProperty("kafka", "alarmTopic").toString(); NEED_SASL = getProperty("kafka", "needSasl").toInt(); SASL_USERNAME = getProperty("kafka", "saslUsername").toString(); SASL_PASSWORD = getProperty("kafka", "saslPassword").toString(); @@ -47,6 +48,11 @@ SERVER_PORT = getProperty("client", "serverPort").toInt(); RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); + CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); + + HARD_CODE_QSS = getProperty("qss", "hardCodeNames").toString().split(","); + BASE_URL = getProperty("http", "baseUrl").toString(); BASE_LOG_PATH = getProperty("log", "basePath").toString(); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index ae345ff..5a0fbda 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -40,6 +40,7 @@ QString KAFKA_DATA_TOPIC; QString KAFKA_MSG_TOPIC; QString KAFKA_STATUS_TOPIC; + QString KAFKA_ALARM_TOPIC; qint8 NEED_SASL; QString SASL_USERNAME; QString SASL_PASSWORD; @@ -54,6 +55,11 @@ quint16 SERVER_PORT; qint8 RESIDUAL_CALC_SEC; + QStringList DEVICE_ALARM_CODES; + QStringList CHANNEL_ALARM_CODES; + + QStringList HARD_CODE_QSS; + QString BASE_URL; QString BASE_LOG_PATH; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index d06d45b..e8867aa 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -11,7 +11,7 @@ dataTopic="clock-data" statusTopic="dev-status" msgTopic="clock-message" -alarmTopic="alarm-message" +alarmTopic="alarm-msg" needSasl=1 saslUsername="admin" saslPassword="casicss" @@ -27,6 +27,13 @@ serverPort=5905 residualCalcSec=30 +[alarm] +deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" +channelAlarmCodes="FREQUENCY_HOPPING,PHASE_HOPPING,BAD_DATA,DATA_EXCEPTION,COUNTER_NO_DATA" + +[qss] +hardCodeNames="devTitle,devRef,channelNameEven,channelValueEven,channelNameOdd,channelValueOdd" + [http] baseUrl="http://192.168.20.135:11410" diff --git a/CounterRealTime/qss/mainClock.css b/CounterRealTime/qss/mainClock.css index f9ec3e2..146c5a0 100644 --- a/CounterRealTime/qss/mainClock.css +++ b/CounterRealTime/qss/mainClock.css @@ -35,15 +35,6 @@ /* widgetTitle */ /* widgetContent */ -QWidget[form="dev"] { - border: 3px solid #0BB2E9; - border-radius: 12px; -} -QWidget[form="devAlarm"] { - border: 3px solid #FF0000; - border-radius: 12px; -} - QWidget#widgetContent QLabel { font-weight: bold; } @@ -51,16 +42,38 @@ font-size: 28px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; } QLabel[labType='devTitle6'] { font-size: 24px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; } QLabel[labType='devTitle8'] { font-size: 18px; color: #62D8FF; background-color: #1E5A7C; + border-top-left-radius: 10px; +} + +QLabel[labType='devRef4'] { + font-size: 28px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; +} +QLabel[labType='devRef6'] { + font-size: 24px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; +} +QLabel[labType='devRef8'] { + font-size: 18px; + color: #62D8FF; + background-color: #1E5A7C; + border-top-right-radius: 10px; } QLabel[labType='channelNameEven4'] { @@ -127,15 +140,34 @@ background-color: #123553; } -QLabel[labType='channelNameAlarm'] { - font-size: 28px; +QLabel[labType='channelAlarm'] { color: #FFF000; background-color: #9F1919; } -QLabel[labType='channelValueAlarm'] { - font-size: 28px; +QLabel[labType='channelOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; +} + +QLabel[labType='devTitleAlarm'] { color: #FFF000; background-color: #9F1919; + border-top-left-radius: 10px; +} +QLabel[labType='devRefAlarm'] { + color: #FFF000; + background-color: #9F1919; + border-top-right-radius: 10px; +} +QLabel[labType='devTitleOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; + border-top-left-radius: 10px; +} +QLabel[labType='devRefOffline'] { + color: #FFFFFF; + background-color: #BDC3C7; + border-top-right-radius: 10px; } /* widgetContent */ diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index 0d3e27f..56718ba 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -3,7 +3,7 @@ #定义了ordered表示子项目按照添加的顺序来编译 #CONFIG += ordered -#SUBDIRS += CounterAcq #计数器数据采集 +SUBDIRS += CounterAcq #计数器数据采集 #SUBDIRS += CounterAcqBM #6906计数器数据采集 SUBDIRS += CounterRealTime SUBDIRS += PhaseCompAcq #比相仪数据采集