noisemonitorparamdialog.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #include "noisemonitorparamdialog.h"
  2. #include "ui_noisemonitorparamwidget.h"
  3. #include <QFile>
  4. #include <QIntValidator>
  5. #include <QRegExpValidator>
  6. #include "UIStyleManager.h"
  7. #include "commonFunc.h"
  8. #include "tipwidget.h"
  9. NoiseMonitorParamDialog::NoiseMonitorParamDialog(QWidget *parent) :
  10. DialogBase(parent),
  11. ui(new Ui::NoiseMonitorParamWidget)
  12. {
  13. QWidget* content = new QWidget(this);
  14. ui->setupUi(content);
  15. m_logger = spdlog::get("ACASetting");
  16. if(m_logger == nullptr)
  17. {
  18. fmt::print("NoiseMonitorParamDialog: Logger ACASetting not found\n");
  19. return;
  20. }
  21. /* 设置弹窗内容 */
  22. setContentWidget(content);
  23. /* 设置弹窗标题 */
  24. setTitle("噪音监测参数");
  25. /* 设置lineEdit输入限制 */
  26. setLimitParamRange();
  27. /* 隐藏计算参数 */
  28. ui->label_computeParam->hide();
  29. ui->label_10->hide();
  30. ui->lineEdit_nperseg->hide();
  31. ui->label_11->hide();
  32. ui->lineEdit_noverlap->hide();
  33. ui->label_13->hide();
  34. ui->lineEdit_nfft->hide();
  35. /* 连接信号和槽 */
  36. connect(ui->pBtn_restoreDefault, &QPushButton::clicked, this, &NoiseMonitorParamDialog::do_pBtn_restoreDefault_clicked);
  37. /* 设置噪音检测参数默认值 */
  38. m_defaultNoiseDetectParam.nNoiseContinueCountIsWarn = 5; /* 连续监测次数是否预警 */
  39. m_defaultNoiseDetectParam.nNoiseDetectContinueCount = 10; /* 持续监测次数 */
  40. m_defaultNoiseDetectParam.nNoiseOneDetectDuration = 1; /* 单次噪音检测时长 */
  41. m_defaultNoiseDetectParam.nNoiseContinueCountPercent = 80; /* 连续监测次数百分比 */
  42. m_defaultNoiseDetectParam.dThresholdSlient = -60.0; /* 静音阈值 */
  43. m_defaultNoiseDetectParam.dThresholdDB = -70.0; /* 噪音分贝阈值 */
  44. m_defaultNoiseDetectParam.dThresholdCV = -70.0; /* 变异系数阈值 */
  45. m_defaultNoiseDetectParam.nPerseg = 256; /* 分段长度 */
  46. m_defaultNoiseDetectParam.nOverlap = 32; /* 重叠长度 */
  47. m_defaultNoiseDetectParam.nFFT = 256; /* FFT点数 */
  48. /* 设置默认参数 */
  49. m_noiseDetectParam = m_defaultNoiseDetectParam;
  50. setInitialParams(m_noiseDetectParam);
  51. /* 设置qss */
  52. setQss();
  53. }
  54. NoiseMonitorParamDialog::~NoiseMonitorParamDialog()
  55. {
  56. delete ui;
  57. }
  58. /* 设置初始参数 */
  59. void NoiseMonitorParamDialog::setInitialParams(NoiseDetectParam_t& noiseDetectParam)
  60. {
  61. m_noiseDetectParam = noiseDetectParam;
  62. /* 设置初始参数到界面 */
  63. ui->lineEdit_noiseOneDetectDuration->setText(QString::number(noiseDetectParam.nNoiseOneDetectDuration));
  64. ui->lineEdit_noiseDetectContinueCount->setText(QString::number(noiseDetectParam.nNoiseDetectContinueCount));
  65. ui->lineEdit_noiseContinueCountIsWarn->setText(QString::number(noiseDetectParam.nNoiseContinueCountIsWarn));
  66. ui->lineEdit_noiseContinueCountPercent->setText(QString::number(noiseDetectParam.nNoiseContinueCountPercent));
  67. ui->lineEdit_thresholdSlient->setText(QString::number(noiseDetectParam.dThresholdSlient));
  68. ui->lineEdit_thresholdDB->setText(QString::number(noiseDetectParam.dThresholdDB));
  69. ui->lineEdit_thresholdCV->setText(QString::number(noiseDetectParam.dThresholdCV));
  70. ui->lineEdit_nperseg->setText(QString::number(noiseDetectParam.nPerseg));
  71. ui->lineEdit_noverlap->setText(QString::number(noiseDetectParam.nOverlap));
  72. ui->lineEdit_nfft->setText(QString::number(noiseDetectParam.nFFT));
  73. }
  74. /* 恢复默认值 */
  75. void NoiseMonitorParamDialog::do_pBtn_restoreDefault_clicked()
  76. {
  77. m_noiseDetectParam = m_defaultNoiseDetectParam;
  78. setInitialParams(m_noiseDetectParam);
  79. }
  80. /* 设置qss */
  81. void NoiseMonitorParamDialog::setQss()
  82. {
  83. QString qssPath = UIStyle.getQSSPath() + "/noisemonitorparamwidget.qss";
  84. QFile file(qssPath);
  85. if(file.open(QFile::ReadOnly))
  86. {
  87. QString qss = file.readAll();
  88. this->setStyleSheet(qss);
  89. file.close();
  90. }else {
  91. SPDLOG_LOGGER_WARN(m_logger, "无法打开QSS文件: {}", qssPath.toStdString());
  92. }
  93. }
  94. /* 点击了OK */
  95. bool NoiseMonitorParamDialog::isOKClicked()
  96. {
  97. cancelAllWarn();
  98. if(!updateNoiseDetectParam())
  99. {
  100. return false;
  101. }
  102. return true;
  103. }
  104. /* 更新噪音检测参数 */
  105. bool NoiseMonitorParamDialog::updateNoiseDetectParam()
  106. {
  107. /* 获取所有的值 */
  108. int noiseOneDetectDuration = ui->lineEdit_noiseOneDetectDuration->text().toInt();
  109. int noiseDetectContinueCount = ui->lineEdit_noiseDetectContinueCount->text().toInt();
  110. int noiseContinueCountIsWarn = ui->lineEdit_noiseContinueCountIsWarn->text().toInt();
  111. int noiseContinueCountPercent = ui->lineEdit_noiseContinueCountPercent->text().toInt();
  112. double thresholdSlient = ui->lineEdit_thresholdSlient->text().toDouble();
  113. double thresholdDB = ui->lineEdit_thresholdDB->text().toDouble();
  114. double thresholdCV = ui->lineEdit_thresholdCV->text().toDouble();
  115. int nPerseg = ui->lineEdit_nperseg->text().toInt();
  116. int nOverlap = ui->lineEdit_noverlap->text().toInt();
  117. int nFFT = ui->lineEdit_nfft->text().toInt();
  118. /* 检查是否有超过范围的参数 */
  119. bool isOverRange = false;
  120. if(noiseOneDetectDuration < m_noiseOneDetectDurationLow || noiseOneDetectDuration > m_noiseOneDetectDurationHigh)
  121. {
  122. setWarn(ui->lineEdit_noiseOneDetectDuration, true);
  123. isOverRange = true;
  124. }
  125. if(noiseDetectContinueCount < m_noiseDetectContinueCountLow || noiseDetectContinueCount > m_noiseDetectContinueCountHigh)
  126. {
  127. setWarn(ui->lineEdit_noiseDetectContinueCount, true);
  128. isOverRange = true;
  129. }
  130. if(noiseContinueCountIsWarn < m_noiseContinueCountIsWarnLow || noiseContinueCountIsWarn > m_noiseContinueCountIsWarnHigh)
  131. {
  132. setWarn(ui->lineEdit_noiseContinueCountIsWarn, true);
  133. isOverRange = true;
  134. }
  135. if(noiseContinueCountPercent < m_noiseContinueCountPercentLow || noiseContinueCountPercent > m_noiseContinueCountPercentHigh)
  136. {
  137. setWarn(ui->lineEdit_noiseContinueCountPercent, true);
  138. isOverRange = true;
  139. }
  140. if(thresholdSlient < m_thresholdSlientLow || thresholdSlient > m_thresholdSlientHigh)
  141. {
  142. setWarn(ui->lineEdit_thresholdSlient, true);
  143. isOverRange = true;
  144. }
  145. if(thresholdDB < m_thresholdDBLow || thresholdDB > m_thresholdDBHigh)
  146. {
  147. setWarn(ui->lineEdit_thresholdDB, true);
  148. isOverRange = true;
  149. }
  150. if(thresholdCV < m_thresholdCVLow || thresholdCV > m_thresholdCVHigh)
  151. {
  152. setWarn(ui->lineEdit_thresholdCV, true);
  153. isOverRange = true;
  154. }
  155. if(nPerseg < m_npersegLow || nPerseg > m_npersegHigh)
  156. {
  157. setWarn(ui->lineEdit_nperseg, true);
  158. isOverRange = true;
  159. }
  160. if(nOverlap < m_noverlapLow || nOverlap > m_noverlapHigh)
  161. {
  162. setWarn(ui->lineEdit_noverlap, true);
  163. isOverRange = true;
  164. }
  165. if(nFFT < m_nfftLow || nFFT > m_nfftHigh)
  166. {
  167. setWarn(ui->lineEdit_nfft, true);
  168. isOverRange = true;
  169. }
  170. if(isOverRange)
  171. {
  172. TipWidget::display(TipWidget::OPERATOR_WARN, "参数输入超出范围,请检查", this);
  173. return false;
  174. }
  175. m_noiseDetectParam.nNoiseOneDetectDuration = noiseOneDetectDuration;
  176. m_noiseDetectParam.nNoiseDetectContinueCount = noiseDetectContinueCount;
  177. m_noiseDetectParam.nNoiseContinueCountIsWarn = noiseContinueCountIsWarn;
  178. m_noiseDetectParam.nNoiseContinueCountPercent = noiseContinueCountPercent;
  179. m_noiseDetectParam.dThresholdSlient = thresholdSlient;
  180. m_noiseDetectParam.dThresholdDB = thresholdDB;
  181. m_noiseDetectParam.dThresholdCV = thresholdCV;
  182. m_noiseDetectParam.nPerseg = nPerseg;
  183. m_noiseDetectParam.nOverlap = nOverlap;
  184. m_noiseDetectParam.nFFT = nFFT;
  185. return true;
  186. }
  187. /* 设置限制参数范围 */
  188. void NoiseMonitorParamDialog::setLimitParamRange()
  189. {
  190. ui->lineEdit_noiseOneDetectDuration->setValidator(new QIntValidator(m_noiseOneDetectDurationLow, m_noiseOneDetectDurationHigh, this));
  191. ui->lineEdit_noiseDetectContinueCount->setValidator(new QIntValidator(m_noiseDetectContinueCountLow, m_noiseDetectContinueCountHigh, this));
  192. ui->lineEdit_noiseContinueCountIsWarn->setValidator(new QIntValidator(m_noiseContinueCountIsWarnLow, m_noiseContinueCountIsWarnHigh, this));
  193. ui->lineEdit_noiseContinueCountPercent->setValidator(new QIntValidator(m_noiseContinueCountPercentLow, m_noiseContinueCountPercentHigh, this));
  194. ui->lineEdit_thresholdSlient->setValidator(new StrictDoubleValidator(m_thresholdSlientLow, m_thresholdSlientHigh, 2, this));
  195. ui->lineEdit_thresholdDB->setValidator(new StrictDoubleValidator(m_thresholdDBLow, m_thresholdDBHigh, 2, this));
  196. ui->lineEdit_thresholdCV->setValidator(new StrictDoubleValidator(m_thresholdCVLow, m_thresholdCVHigh, 2, this));
  197. ui->lineEdit_nperseg->setValidator(new QIntValidator(m_npersegLow, m_npersegHigh, this));
  198. ui->lineEdit_noverlap->setValidator(new QIntValidator(m_noverlapLow, m_noverlapHigh, this));
  199. ui->lineEdit_nfft->setValidator(new QIntValidator(m_nfftLow, m_nfftHigh, this));
  200. }
  201. /* 取消所有的报警红框 */
  202. void NoiseMonitorParamDialog::cancelAllWarn()
  203. {
  204. setWarn(ui->lineEdit_noiseOneDetectDuration, false);
  205. setWarn(ui->lineEdit_noiseDetectContinueCount, false);
  206. setWarn(ui->lineEdit_noiseContinueCountIsWarn, false);
  207. setWarn(ui->lineEdit_noiseContinueCountPercent, false);
  208. setWarn(ui->lineEdit_thresholdSlient, false);
  209. setWarn(ui->lineEdit_thresholdDB, false);
  210. setWarn(ui->lineEdit_thresholdCV, false);
  211. setWarn(ui->lineEdit_nperseg, false);
  212. setWarn(ui->lineEdit_noverlap, false);
  213. setWarn(ui->lineEdit_nfft, false);
  214. }