noisemonitorparamdialog.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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::isAnyValueEmpty()
  106. {
  107. bool isNoEmpty = true;
  108. if(ui->lineEdit_noiseOneDetectDuration->text().isEmpty())
  109. {
  110. setWarn(ui->lineEdit_noiseOneDetectDuration, true);
  111. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  112. isNoEmpty = false;
  113. }
  114. if(ui->lineEdit_noiseDetectContinueCount->text().isEmpty())
  115. {
  116. setWarn(ui->lineEdit_noiseDetectContinueCount, true);
  117. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  118. isNoEmpty = false;
  119. }
  120. if(ui->lineEdit_noiseContinueCountIsWarn->text().isEmpty())
  121. {
  122. setWarn(ui->lineEdit_noiseContinueCountIsWarn, true);
  123. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  124. isNoEmpty = false;
  125. }
  126. if(ui->lineEdit_noiseContinueCountPercent->text().isEmpty())
  127. {
  128. setWarn(ui->lineEdit_noiseContinueCountPercent, true);
  129. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  130. isNoEmpty = false;
  131. }
  132. if(ui->lineEdit_thresholdSlient->text().isEmpty())
  133. {
  134. setWarn(ui->lineEdit_thresholdSlient, true);
  135. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  136. isNoEmpty = false;
  137. }
  138. if(ui->lineEdit_thresholdDB->text().isEmpty())
  139. {
  140. setWarn(ui->lineEdit_thresholdDB, true);
  141. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  142. isNoEmpty = false;
  143. }
  144. if(ui->lineEdit_thresholdCV->text().isEmpty())
  145. {
  146. setWarn(ui->lineEdit_thresholdCV, true);
  147. TipWidget::display(TipWidget::OPERATOR_WARN, "请输入必填项", this);
  148. isNoEmpty = false;
  149. }
  150. return isNoEmpty;
  151. }
  152. /* 更新噪音检测参数 */
  153. bool NoiseMonitorParamDialog::updateNoiseDetectParam()
  154. {
  155. /* 先判断是否有空的值 */
  156. if(isAnyValueEmpty() == false)
  157. {
  158. return false;
  159. }
  160. /* 获取所有的值 */
  161. int noiseOneDetectDuration = ui->lineEdit_noiseOneDetectDuration->text().toInt();
  162. int noiseDetectContinueCount = ui->lineEdit_noiseDetectContinueCount->text().toInt();
  163. int noiseContinueCountIsWarn = ui->lineEdit_noiseContinueCountIsWarn->text().toInt();
  164. int noiseContinueCountPercent = ui->lineEdit_noiseContinueCountPercent->text().toInt();
  165. double thresholdSlient = ui->lineEdit_thresholdSlient->text().toDouble();
  166. double thresholdDB = ui->lineEdit_thresholdDB->text().toDouble();
  167. double thresholdCV = ui->lineEdit_thresholdCV->text().toDouble();
  168. int nPerseg = ui->lineEdit_nperseg->text().toInt();
  169. int nOverlap = ui->lineEdit_noverlap->text().toInt();
  170. int nFFT = ui->lineEdit_nfft->text().toInt();
  171. /* 检查是否有超过范围的参数 */
  172. bool isOverRange = false;
  173. if(noiseOneDetectDuration < m_noiseOneDetectDurationLow || noiseOneDetectDuration > m_noiseOneDetectDurationHigh)
  174. {
  175. setWarn(ui->lineEdit_noiseOneDetectDuration, true);
  176. isOverRange = true;
  177. }
  178. if(noiseDetectContinueCount < m_noiseDetectContinueCountLow || noiseDetectContinueCount > m_noiseDetectContinueCountHigh)
  179. {
  180. setWarn(ui->lineEdit_noiseDetectContinueCount, true);
  181. isOverRange = true;
  182. }
  183. // if(noiseContinueCountIsWarn < m_noiseContinueCountIsWarnLow || noiseContinueCountIsWarn > m_noiseContinueCountIsWarnHigh)
  184. // {
  185. // setWarn(ui->lineEdit_noiseContinueCountIsWarn, true);
  186. // isOverRange = true;
  187. // }
  188. if(noiseContinueCountPercent < m_noiseContinueCountPercentLow || noiseContinueCountPercent > m_noiseContinueCountPercentHigh)
  189. {
  190. setWarn(ui->lineEdit_noiseContinueCountPercent, true);
  191. isOverRange = true;
  192. }
  193. if(thresholdSlient < m_thresholdSlientLow || thresholdSlient > m_thresholdSlientHigh)
  194. {
  195. setWarn(ui->lineEdit_thresholdSlient, true);
  196. isOverRange = true;
  197. }
  198. if(thresholdDB < m_thresholdDBLow || thresholdDB > m_thresholdDBHigh)
  199. {
  200. setWarn(ui->lineEdit_thresholdDB, true);
  201. isOverRange = true;
  202. }
  203. if(thresholdCV < m_thresholdCVLow || thresholdCV > m_thresholdCVHigh)
  204. {
  205. setWarn(ui->lineEdit_thresholdCV, true);
  206. isOverRange = true;
  207. }
  208. if(nPerseg < m_npersegLow || nPerseg > m_npersegHigh)
  209. {
  210. setWarn(ui->lineEdit_nperseg, true);
  211. isOverRange = true;
  212. }
  213. if(nOverlap < m_noverlapLow || nOverlap > m_noverlapHigh)
  214. {
  215. setWarn(ui->lineEdit_noverlap, true);
  216. isOverRange = true;
  217. }
  218. if(nFFT < m_nfftLow || nFFT > m_nfftHigh)
  219. {
  220. setWarn(ui->lineEdit_nfft, true);
  221. isOverRange = true;
  222. }
  223. if(isOverRange)
  224. {
  225. TipWidget::display(TipWidget::OPERATOR_WARN, "参数输入超出范围,请检查", this);
  226. return false;
  227. }
  228. /* 判断条件是否满足,主要是噪音预警次数不能大于持续检测次数 */
  229. if(noiseContinueCountIsWarn > noiseDetectContinueCount)
  230. {
  231. setWarn(ui->lineEdit_noiseContinueCountIsWarn, true);
  232. TipWidget::display(TipWidget::OPERATOR_WARN, "噪音预警次数不能大于持续检测次数", this);
  233. return false;
  234. }
  235. m_noiseDetectParam.nNoiseOneDetectDuration = noiseOneDetectDuration;
  236. m_noiseDetectParam.nNoiseDetectContinueCount = noiseDetectContinueCount;
  237. m_noiseDetectParam.nNoiseContinueCountIsWarn = noiseContinueCountIsWarn;
  238. m_noiseDetectParam.nNoiseContinueCountPercent = noiseContinueCountPercent;
  239. m_noiseDetectParam.dThresholdSlient = thresholdSlient;
  240. m_noiseDetectParam.dThresholdDB = thresholdDB;
  241. m_noiseDetectParam.dThresholdCV = thresholdCV;
  242. m_noiseDetectParam.nPerseg = nPerseg;
  243. m_noiseDetectParam.nOverlap = nOverlap;
  244. m_noiseDetectParam.nFFT = nFFT;
  245. return true;
  246. }
  247. /* 设置限制参数范围 */
  248. void NoiseMonitorParamDialog::setLimitParamRange()
  249. {
  250. ui->lineEdit_noiseOneDetectDuration->setValidator(new QIntValidator(m_noiseOneDetectDurationLow, m_noiseOneDetectDurationHigh, this));
  251. ui->lineEdit_noiseDetectContinueCount->setValidator(new QIntValidator(m_noiseDetectContinueCountLow, m_noiseDetectContinueCountHigh, this));
  252. ui->lineEdit_noiseContinueCountIsWarn->setValidator(new QIntValidator(m_noiseContinueCountIsWarnLow, m_noiseContinueCountIsWarnHigh, this));
  253. ui->lineEdit_noiseContinueCountPercent->setValidator(new QIntValidator(m_noiseContinueCountPercentLow, m_noiseContinueCountPercentHigh, this));
  254. ui->lineEdit_thresholdSlient->setValidator(new StrictDoubleValidator(m_thresholdSlientLow, m_thresholdSlientHigh, 2, this));
  255. ui->lineEdit_thresholdDB->setValidator(new StrictDoubleValidator(m_thresholdDBLow, m_thresholdDBHigh, 2, this));
  256. ui->lineEdit_thresholdCV->setValidator(new StrictDoubleValidator(m_thresholdCVLow, m_thresholdCVHigh, 2, this));
  257. ui->lineEdit_nperseg->setValidator(new QIntValidator(m_npersegLow, m_npersegHigh, this));
  258. ui->lineEdit_noverlap->setValidator(new QIntValidator(m_noverlapLow, m_noverlapHigh, this));
  259. ui->lineEdit_nfft->setValidator(new QIntValidator(m_nfftLow, m_nfftHigh, this));
  260. }
  261. /* 取消所有的报警红框 */
  262. void NoiseMonitorParamDialog::cancelAllWarn()
  263. {
  264. setWarn(ui->lineEdit_noiseOneDetectDuration, false);
  265. setWarn(ui->lineEdit_noiseDetectContinueCount, false);
  266. setWarn(ui->lineEdit_noiseContinueCountIsWarn, false);
  267. setWarn(ui->lineEdit_noiseContinueCountPercent, false);
  268. setWarn(ui->lineEdit_thresholdSlient, false);
  269. setWarn(ui->lineEdit_thresholdDB, false);
  270. setWarn(ui->lineEdit_thresholdCV, false);
  271. setWarn(ui->lineEdit_nperseg, false);
  272. setWarn(ui->lineEdit_noverlap, false);
  273. setWarn(ui->lineEdit_nfft, false);
  274. }