#include "noisemonitorparamdialog.h" #include "ui_noisemonitorparamwidget.h" #include #include #include #include "UIStyleManager.h" #include "commonFunc.h" #include "tipwidget.h" NoiseMonitorParamDialog::NoiseMonitorParamDialog(QWidget *parent) : DialogBase(parent), ui(new Ui::NoiseMonitorParamWidget) { QWidget* content = new QWidget(this); ui->setupUi(content); m_logger = spdlog::get("ACASetting"); if(m_logger == nullptr) { fmt::print("NoiseMonitorParamDialog: Logger ACASetting not found\n"); return; } /* 设置弹窗内容 */ setContentWidget(content); /* 设置弹窗标题 */ setTitle("噪音监测参数"); /* 设置lineEdit输入限制 */ setLimitParamRange(); /* 隐藏计算参数 */ ui->label_computeParam->hide(); ui->label_10->hide(); ui->lineEdit_nperseg->hide(); ui->label_11->hide(); ui->lineEdit_noverlap->hide(); ui->label_13->hide(); ui->lineEdit_nfft->hide(); /* 连接信号和槽 */ connect(ui->pBtn_restoreDefault, &QPushButton::clicked, this, &NoiseMonitorParamDialog::do_pBtn_restoreDefault_clicked); /* 设置噪音检测参数默认值 */ m_defaultNoiseDetectParam.nNoiseContinueCountIsWarn = 5; /* 连续监测次数是否预警 */ m_defaultNoiseDetectParam.nNoiseDetectContinueCount = 10; /* 持续监测次数 */ m_defaultNoiseDetectParam.nNoiseOneDetectDuration = 1; /* 单次噪音检测时长 */ m_defaultNoiseDetectParam.nNoiseContinueCountPercent = 80; /* 连续监测次数百分比 */ m_defaultNoiseDetectParam.dThresholdSlient = -60.0; /* 静音阈值 */ m_defaultNoiseDetectParam.dThresholdDB = -70.0; /* 噪音分贝阈值 */ m_defaultNoiseDetectParam.dThresholdCV = -70.0; /* 变异系数阈值 */ m_defaultNoiseDetectParam.nPerseg = 256; /* 分段长度 */ m_defaultNoiseDetectParam.nOverlap = 32; /* 重叠长度 */ m_defaultNoiseDetectParam.nFFT = 256; /* FFT点数 */ /* 设置默认参数 */ m_noiseDetectParam = m_defaultNoiseDetectParam; setInitialParams(m_noiseDetectParam); /* 设置qss */ setQss(); } NoiseMonitorParamDialog::~NoiseMonitorParamDialog() { delete ui; } /* 设置初始参数 */ void NoiseMonitorParamDialog::setInitialParams(NoiseDetectParam_t& noiseDetectParam) { m_noiseDetectParam = noiseDetectParam; /* 设置初始参数到界面 */ ui->lineEdit_noiseOneDetectDuration->setText(QString::number(noiseDetectParam.nNoiseOneDetectDuration)); ui->lineEdit_noiseDetectContinueCount->setText(QString::number(noiseDetectParam.nNoiseDetectContinueCount)); ui->lineEdit_noiseContinueCountIsWarn->setText(QString::number(noiseDetectParam.nNoiseContinueCountIsWarn)); ui->lineEdit_noiseContinueCountPercent->setText(QString::number(noiseDetectParam.nNoiseContinueCountPercent)); ui->lineEdit_thresholdSlient->setText(QString::number(noiseDetectParam.dThresholdSlient)); ui->lineEdit_thresholdDB->setText(QString::number(noiseDetectParam.dThresholdDB)); ui->lineEdit_thresholdCV->setText(QString::number(noiseDetectParam.dThresholdCV)); ui->lineEdit_nperseg->setText(QString::number(noiseDetectParam.nPerseg)); ui->lineEdit_noverlap->setText(QString::number(noiseDetectParam.nOverlap)); ui->lineEdit_nfft->setText(QString::number(noiseDetectParam.nFFT)); } /* 恢复默认值 */ void NoiseMonitorParamDialog::do_pBtn_restoreDefault_clicked() { m_noiseDetectParam = m_defaultNoiseDetectParam; setInitialParams(m_noiseDetectParam); } /* 设置qss */ void NoiseMonitorParamDialog::setQss() { QString qssPath = UIStyle.getQSSPath() + "/noisemonitorparamwidget.qss"; QFile file(qssPath); if(file.open(QFile::ReadOnly)) { QString qss = file.readAll(); this->setStyleSheet(qss); file.close(); }else { SPDLOG_LOGGER_WARN(m_logger, "无法打开QSS文件: {}", qssPath.toStdString()); } } /* 点击了OK */ bool NoiseMonitorParamDialog::isOKClicked() { cancelAllWarn(); if(!updateNoiseDetectParam()) { return false; } return true; } /* 更新噪音检测参数 */ bool NoiseMonitorParamDialog::updateNoiseDetectParam() { /* 获取所有的值 */ int noiseOneDetectDuration = ui->lineEdit_noiseOneDetectDuration->text().toInt(); int noiseDetectContinueCount = ui->lineEdit_noiseDetectContinueCount->text().toInt(); int noiseContinueCountIsWarn = ui->lineEdit_noiseContinueCountIsWarn->text().toInt(); int noiseContinueCountPercent = ui->lineEdit_noiseContinueCountPercent->text().toInt(); double thresholdSlient = ui->lineEdit_thresholdSlient->text().toDouble(); double thresholdDB = ui->lineEdit_thresholdDB->text().toDouble(); double thresholdCV = ui->lineEdit_thresholdCV->text().toDouble(); int nPerseg = ui->lineEdit_nperseg->text().toInt(); int nOverlap = ui->lineEdit_noverlap->text().toInt(); int nFFT = ui->lineEdit_nfft->text().toInt(); /* 检查是否有超过范围的参数 */ bool isOverRange = false; if(noiseOneDetectDuration < m_noiseOneDetectDurationLow || noiseOneDetectDuration > m_noiseOneDetectDurationHigh) { setWarn(ui->lineEdit_noiseOneDetectDuration, true); isOverRange = true; } if(noiseDetectContinueCount < m_noiseDetectContinueCountLow || noiseDetectContinueCount > m_noiseDetectContinueCountHigh) { setWarn(ui->lineEdit_noiseDetectContinueCount, true); isOverRange = true; } if(noiseContinueCountIsWarn < m_noiseContinueCountIsWarnLow || noiseContinueCountIsWarn > m_noiseContinueCountIsWarnHigh) { setWarn(ui->lineEdit_noiseContinueCountIsWarn, true); isOverRange = true; } if(noiseContinueCountPercent < m_noiseContinueCountPercentLow || noiseContinueCountPercent > m_noiseContinueCountPercentHigh) { setWarn(ui->lineEdit_noiseContinueCountPercent, true); isOverRange = true; } if(thresholdSlient < m_thresholdSlientLow || thresholdSlient > m_thresholdSlientHigh) { setWarn(ui->lineEdit_thresholdSlient, true); isOverRange = true; } if(thresholdDB < m_thresholdDBLow || thresholdDB > m_thresholdDBHigh) { setWarn(ui->lineEdit_thresholdDB, true); isOverRange = true; } if(thresholdCV < m_thresholdCVLow || thresholdCV > m_thresholdCVHigh) { setWarn(ui->lineEdit_thresholdCV, true); isOverRange = true; } if(nPerseg < m_npersegLow || nPerseg > m_npersegHigh) { setWarn(ui->lineEdit_nperseg, true); isOverRange = true; } if(nOverlap < m_noverlapLow || nOverlap > m_noverlapHigh) { setWarn(ui->lineEdit_noverlap, true); isOverRange = true; } if(nFFT < m_nfftLow || nFFT > m_nfftHigh) { setWarn(ui->lineEdit_nfft, true); isOverRange = true; } if(isOverRange) { TipWidget::display(TipWidget::OPERATOR_WARN, "参数输入超出范围,请检查", this); return false; } m_noiseDetectParam.nNoiseOneDetectDuration = noiseOneDetectDuration; m_noiseDetectParam.nNoiseDetectContinueCount = noiseDetectContinueCount; m_noiseDetectParam.nNoiseContinueCountIsWarn = noiseContinueCountIsWarn; m_noiseDetectParam.nNoiseContinueCountPercent = noiseContinueCountPercent; m_noiseDetectParam.dThresholdSlient = thresholdSlient; m_noiseDetectParam.dThresholdDB = thresholdDB; m_noiseDetectParam.dThresholdCV = thresholdCV; m_noiseDetectParam.nPerseg = nPerseg; m_noiseDetectParam.nOverlap = nOverlap; m_noiseDetectParam.nFFT = nFFT; return true; } /* 设置限制参数范围 */ void NoiseMonitorParamDialog::setLimitParamRange() { ui->lineEdit_noiseOneDetectDuration->setValidator(new QIntValidator(m_noiseOneDetectDurationLow, m_noiseOneDetectDurationHigh, this)); ui->lineEdit_noiseDetectContinueCount->setValidator(new QIntValidator(m_noiseDetectContinueCountLow, m_noiseDetectContinueCountHigh, this)); ui->lineEdit_noiseContinueCountIsWarn->setValidator(new QIntValidator(m_noiseContinueCountIsWarnLow, m_noiseContinueCountIsWarnHigh, this)); ui->lineEdit_noiseContinueCountPercent->setValidator(new QIntValidator(m_noiseContinueCountPercentLow, m_noiseContinueCountPercentHigh, this)); ui->lineEdit_thresholdSlient->setValidator(new StrictDoubleValidator(m_thresholdSlientLow, m_thresholdSlientHigh, 2, this)); ui->lineEdit_thresholdDB->setValidator(new StrictDoubleValidator(m_thresholdDBLow, m_thresholdDBHigh, 2, this)); ui->lineEdit_thresholdCV->setValidator(new StrictDoubleValidator(m_thresholdCVLow, m_thresholdCVHigh, 2, this)); ui->lineEdit_nperseg->setValidator(new QIntValidator(m_npersegLow, m_npersegHigh, this)); ui->lineEdit_noverlap->setValidator(new QIntValidator(m_noverlapLow, m_noverlapHigh, this)); ui->lineEdit_nfft->setValidator(new QIntValidator(m_nfftLow, m_nfftHigh, this)); } /* 取消所有的报警红框 */ void NoiseMonitorParamDialog::cancelAllWarn() { setWarn(ui->lineEdit_noiseOneDetectDuration, false); setWarn(ui->lineEdit_noiseDetectContinueCount, false); setWarn(ui->lineEdit_noiseContinueCountIsWarn, false); setWarn(ui->lineEdit_noiseContinueCountPercent, false); setWarn(ui->lineEdit_thresholdSlient, false); setWarn(ui->lineEdit_thresholdDB, false); setWarn(ui->lineEdit_thresholdCV, false); setWarn(ui->lineEdit_nperseg, false); setWarn(ui->lineEdit_noverlap, false); setWarn(ui->lineEdit_nfft, false); }