NoiseDetectThread.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "NoiseDetectThread.h"
  2. #include <random>
  3. #include "CreateWAVThread.h"
  4. #include "CreateLongFileThread.h"
  5. #include "ThreadAlarmManager.h"
  6. #include "ThreadManager.h"
  7. #include "commonDefine.h"
  8. #include "GlobalInfo.h"
  9. #include "signalstats.h"
  10. #include "spdlog.h"
  11. NoiseDetectThread::NoiseDetectThread(CalculateThreadInfo_t& threadInfo)
  12. : BaseCalculateThread(threadInfo),
  13. m_leftRightData(0)
  14. {
  15. m_logger = spdlog::get("ACAServer");
  16. if(m_logger == nullptr)
  17. {
  18. fmt::print("NoiseDetectThread: ACAServer Logger not found.\n");
  19. return;
  20. }
  21. }
  22. NoiseDetectThread::~NoiseDetectThread()
  23. {
  24. }
  25. /* 开启对比项通道的噪音报警功能 */
  26. // void NoiseDetectThread::startCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo)
  27. // {
  28. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  29. // /* 如果已经存在这个对比项的报警信息,就不需要重复添加了 */
  30. // if(m_mapAlarmInfo.find(itemID) != m_mapAlarmInfo.end())
  31. // {
  32. // SPDLOG_LOGGER_INFO(m_logger, "{} 对比项 {} 的噪音报警功能已经开启", m_logBase, strName.toStdString());
  33. // return;
  34. // }
  35. // /* 添加对比项的噪音报警信息 */
  36. // AlarmInfo_t alarmInfo;
  37. // alarmInfo.CompareItemID = itemID;
  38. // alarmInfo.strCompareItemName = strName.toStdString();
  39. // alarmInfo.isAlarm = false; // 初始状态没有报警
  40. // alarmInfo.RoadInfo = compareItemRoadInfo;
  41. // alarmInfo.AlarmType = EAlarmType::EAT_Noise;
  42. // m_mapAlarmInfo[itemID] = alarmInfo;
  43. // }
  44. /* 关闭对比项通道的噪音报警功能 */
  45. // void NoiseDetectThread::stopCompareItemNoiseAlarm(const int itemID, const QString strName, const CompareItemRoadInfo_t& compareItemRoadInfo)
  46. // {
  47. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  48. // auto it = m_mapAlarmInfo.find(itemID);
  49. // if(it != m_mapAlarmInfo.end())
  50. // {
  51. // SPDLOG_LOGGER_INFO(m_logger, "{} 对比项 {} 的噪音报警功能已关闭", m_logBase, strName.toStdString());
  52. // m_mapAlarmInfo.erase(it); // 移除对比项的噪音报警信息
  53. // }else {
  54. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项 {} 的噪音报警功能未开启,无法关闭", m_logBase, strName.toStdString());
  55. // }
  56. // }
  57. /* 线程功能函数 */
  58. void NoiseDetectThread::task()
  59. {
  60. /* 初始化数据 */
  61. if(!initData())
  62. {
  63. SPDLOG_LOGGER_ERROR(m_logger, "{} 初始化数据失败", m_logBase);
  64. return;
  65. }
  66. /* 计算检测间隔,转换为毫秒 */
  67. int detectInterval = m_baseNoiseDetectConfig.nNoiseDetectInterval * 1000;
  68. if(detectInterval <= 0)
  69. {
  70. SPDLOG_LOGGER_WARN(m_logger, "{} 噪音检测间隔配置错误: {}秒,设置为默认1秒", m_logBase, m_baseNoiseDetectConfig.nNoiseDetectInterval);
  71. detectInterval = 1000; // 默认1秒
  72. }
  73. SPDLOG_LOGGER_INFO(m_logger, " ★ {} 噪音检测线程开始运行 ", m_logBase);
  74. // std::chrono::system_clock::time_point startTime = std::chrono::system_clock::now();
  75. while(m_isRunning)
  76. {
  77. std::this_thread::sleep_for(std::chrono::milliseconds(detectInterval));
  78. /* 判断是否还在噪音检测时间段内,如果还在噪音报警中,
  79. 则继续保存数据 */
  80. if(m_isInDetectPeriod.load() == false)
  81. {
  82. m_currentIsNoise = false;
  83. if(m_currentAlarmInfo.isAlarm)
  84. {
  85. saveResultOnlyOneItem();
  86. }else {
  87. m_isNoise.store(false);
  88. m_isNoiseWarning.store(false);
  89. }
  90. continue;
  91. }
  92. /*------------------------------------------------------------------------
  93. * 获取最新的左右声道数据
  94. *------------------------------------------------------------------------*/
  95. if(!m_pThreadWav->getLatestLeftRightData(m_leftRightData))
  96. {
  97. continue;
  98. }
  99. // SPDLOG_LOGGER_ERROR(m_logger, "{} 获取最新的左右声道数据成功,开始调用动态库计算噪音------------------------------------------ ", m_logBase);
  100. /*------------------------------------------------------------------------
  101. * 计算数据
  102. *------------------------------------------------------------------------*/
  103. if(!detectNoise())
  104. {
  105. continue;
  106. }
  107. /* 这里模拟报警 */
  108. // auto now = std::chrono::system_clock::now();
  109. // if(now - startTime > std::chrono::seconds(10) && now - startTime < std::chrono::seconds(20))
  110. // {
  111. // SPDLOG_LOGGER_WARN(m_logger, "{} 模拟噪音开始", m_logBase);
  112. // m_currentIsNoise = true; // 模拟噪音检测到
  113. // }else
  114. // {
  115. // m_currentIsNoise = false;
  116. // }
  117. /*------------------------------------------------------------------------
  118. * 处理结果,写噪音报警信息到数据库(这里不写数据库,只计算结果返回给对比项)
  119. * 上面那个函数已经把结果保存了
  120. *------------------------------------------------------------------------*/
  121. // saveResult();
  122. saveResultOnlyOneItem();
  123. }
  124. clearData(); // 清理数据
  125. SPDLOG_LOGGER_INFO(m_logger, " ★ {} 噪音检测线程结束 ", m_logBase);
  126. }
  127. /* 初始化数据 */
  128. bool NoiseDetectThread::initData()
  129. {
  130. auto begin = m_threadInfo.compareItemInfo.mapRoad.begin(); // 获取第一个通道的信息
  131. m_roadInfo = begin->scRoadInfo; // 录音通道信息
  132. m_roadName = fmt::format("{}:{}", m_roadInfo.strSoundCardID.toStdString(), m_roadInfo.roadInfo.nRoadNum);
  133. m_logBase = fmt::format("噪音检测通道 {}:", m_roadName);
  134. /* 获取线程 */
  135. auto now = std::chrono::steady_clock::now();
  136. while(true)
  137. {
  138. if(m_pThreadWav == nullptr)
  139. {
  140. m_pThreadWav = ThreadMan.getCreateWAVThread(m_roadInfo.nSoundCardNum, m_roadInfo.roadInfo.nRoadNum);
  141. }
  142. if(m_pThreadCreateAlarm == nullptr)
  143. {
  144. m_pThreadCreateAlarm = ThreadMan.getCreateLongFileThread(m_roadInfo.nSoundCardNum, m_roadInfo.roadInfo.nRoadNum);
  145. }
  146. if(m_pThreadWav != nullptr && m_pThreadCreateAlarm != nullptr)
  147. {
  148. break; // 获取到线程了
  149. }
  150. if(std::chrono::steady_clock::now() - now > std::chrono::seconds(10))
  151. {
  152. SPDLOG_LOGGER_ERROR(m_logger, "{} 获取数据线程超时", m_logBase);
  153. return false; // 超时了,获取线程失败
  154. }
  155. }
  156. auto sampleRate = GInfo.sampleRate();
  157. m_sample_rate = static_cast<double>(sampleRate);
  158. /* 获取噪音检测参数 */
  159. m_noiseDetectParam = SysConfig.getNoiseDetectParam();
  160. m_baseNoiseDetectConfig = SysConfig.getNoiseDetectBaseConfig();
  161. /* 设置噪音检测参数 */
  162. m_ringQueueIsNoise.setQueueCapacity(m_noiseDetectParam.nNoiseDetectContinueCount);
  163. return true;
  164. }
  165. /* 清理数据 */
  166. void NoiseDetectThread::clearData()
  167. {
  168. /* 判断是否还在报警中,如果是,则结束报警 */
  169. endAlarm();
  170. }
  171. /* 调用动态库检测噪音 */
  172. bool NoiseDetectThread::detectNoise()
  173. {
  174. // SPDLOG_LOGGER_TRACE(m_logger, "{} 开始调用动态库计算噪音", m_logBase);
  175. // SPDLOG_LOGGER_INFO(m_logger, "{} 左声道数据大小: {}, 右声道数据大小: {}",
  176. // m_logBase, m_leftRightData.vecLeftData.size(), m_leftRightData.vecRightData.size());
  177. auto startTime = std::chrono::steady_clock::now();
  178. bool isNoiseLeft = false; /* 是否检测到左声道噪音 */
  179. bool isNoiseRight = false; /* 是否检测到右声道噪音 */
  180. try
  181. {
  182. /*-------------------------- 先检测左声道 --------------------------*/
  183. nJson jsonOutput;
  184. auto ret = signalstats::detect_signal(
  185. jsonOutput, /* 返回结果,和jsonResult是一样的 */
  186. m_leftRightData.vecLeftData, /* 左声道数据 */
  187. m_sample_rate, /* 采样率(HZ) */
  188. m_silence_threshold, /* 静音阈值 */
  189. m_db_threshold, /* 分贝阈值 */
  190. m_cv_threshold, /* 变异系数阈值 */
  191. m_window_params, /* 窗函数参数 */
  192. m_nperseg, /* 每段样本数 */
  193. m_noverlap, /* 重叠样本数 */
  194. m_nfft /* FFT点数 */
  195. );
  196. isNoiseLeft = jsonOutput["noise"].is_null() ? false : jsonOutput["noise"].get<bool>();
  197. // std::chrono::duration<double> duration = std::chrono::steady_clock::now() - startTime;
  198. // std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
  199. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 计算左声道噪音耗时: {}ms", m_logBase, ms.count());
  200. // startTime = std::chrono::steady_clock::now(); /* 重置开始时间 */
  201. /*-------------------------- 再检测右声道 --------------------------*/
  202. jsonOutput.clear(); /* 清空输出结果 */
  203. signalstats::detect_signal(
  204. jsonOutput, /* 返回结果,和jsonResult是一样的 */
  205. m_leftRightData.vecRightData, /* 右声道数据 */
  206. m_sample_rate, /* 采样率(HZ) */
  207. m_silence_threshold, /* 静音阈值 */
  208. m_db_threshold, /* 分贝阈值 */
  209. m_cv_threshold, /* 变异系数阈值 */
  210. m_window_params, /* 窗函数参数 */
  211. m_nperseg, /* 每段样本数 */
  212. m_noverlap, /* 重叠样本数 */
  213. m_nfft /* FFT点数 */
  214. );
  215. isNoiseRight = jsonOutput["noise"].is_null() ? false : jsonOutput["noise"].get<bool>();
  216. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 右声道噪音检测结果: {}", m_logBase, jsonOutput["silence_state"].dump(4));
  217. // SPDLOG_LOGGER_DEBUG(m_logger, "{} 右声道噪音检测结果: {}", m_logBase, jsonOutput.dump(4));
  218. }
  219. catch (const std::exception& e)
  220. {
  221. SPDLOG_LOGGER_ERROR(m_logger, "{} 调用动态库检测噪音失败: {}", m_logBase, e.what());
  222. return false;
  223. }
  224. std::chrono::duration<double> duration = std::chrono::steady_clock::now() - startTime;
  225. std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
  226. SPDLOG_LOGGER_DEBUG(m_logger, "{} 计算噪音耗时: {}ms", m_logBase, ms.count());
  227. SPDLOG_LOGGER_DEBUG(m_logger, "{} 左声道噪音检测结果: {}, 右声道噪音检测结果: {}", m_logBase, isNoiseLeft, isNoiseRight);
  228. /* -------------------------- 和以往的结果对比 --------------------------*/
  229. m_currentIsNoise = (isNoiseLeft || isNoiseRight); /* 是否检测到噪音 */
  230. return true;
  231. }
  232. /* 保存结果 */
  233. // void NoiseDetectThread::saveResult()
  234. // {
  235. // /* 将当前噪音检测结果保存到环形队列中 */
  236. // m_ringQueueIsNoise.push(m_currentIsNoise);
  237. // /* 计算出噪音个数和噪音所占百分比 */
  238. // const int size = m_ringQueueIsNoise.QueueSize();
  239. // int numNoise = 0; // 噪音的个数
  240. // int numCountinueNoise = 0; // 连续噪音的个数
  241. // double percentNoise = 0.0; // 噪音所占百分比
  242. // for(int i = 0; i < size; ++i)
  243. // {
  244. // if(m_ringQueueIsNoise.at(i))
  245. // {
  246. // numNoise++;
  247. // numCountinueNoise++;
  248. // }else {
  249. // numCountinueNoise = 0; // 如果不是噪音,连续噪音计数清零
  250. // }
  251. // }
  252. // /* 判断是否是噪音预警 */
  253. // if(numCountinueNoise >= m_noiseDetectParam.nNoiseContinueCountIsWarn)
  254. // {
  255. // m_isNoiseWarning.store(true);
  256. // }
  257. // percentNoise = numNoise * 100.0 / m_noiseDetectParam.nNoiseDetectContinueCount;
  258. // /* 根据噪音所占的百分比判断是否是噪音 */
  259. // if(percentNoise >= m_noiseDetectParam.nNoiseContinueCountPercent)
  260. // {
  261. // m_isNoise.store(true);
  262. // }else {
  263. // m_isNoise.store(false);
  264. // }
  265. // // SPDLOG_LOGGER_INFO(m_logger, "{} 当前噪音检测结果: {}, 噪音预警: {}, 连续噪音个数: {}, 噪音所占百分比: {:.2f}%",
  266. // // m_logBase, m_currentIsNoise, m_isNoiseWarning.load(), numCountinueNoise, percentNoise);
  267. // /* 噪音报警信息 */
  268. // if(m_isNoise.load())
  269. // {
  270. // /* 判断上次是否是噪音 */
  271. // if(!m_isNoiseLast)
  272. // {
  273. // /* 开始噪音报警 */
  274. // m_isNoiseWarning = true;
  275. // /* 通知对比项线程,开始噪音报警 */
  276. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  277. // for(auto& pair : m_mapAlarmInfo)
  278. // {
  279. // AlarmInfo_t& alarmInfo = pair.second;
  280. // if(!alarmInfo.isAlarm) // 如果没有报警
  281. // {
  282. // alarmInfo.isAlarm = true; // 设置为报警状态
  283. // /* 向前推算噪音开始时间,开始时间需要向前推 n次噪音检测的时间 x 单次噪音检测需要的时间,单位秒 */
  284. // int nNoiseDetectTime = m_noiseDetectParam.nNoiseDetectContinueCount * 1;
  285. // QDateTime startTime = m_leftRightData.startTime;
  286. // startTime = startTime.addSecs(-nNoiseDetectTime);
  287. // alarmInfo.StartTime = startTime;
  288. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 开始噪音报警, 报警开始时间: {}", m_logBase, alarmInfo.strCompareItemName,
  289. // alarmInfo.RoadInfo.strCompareRoadName.toStdString(),
  290. // startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
  291. // /* 这里可以添加通知录制报警文件的线程开始录音 */
  292. // if(m_pThreadCreateAlarm != nullptr)
  293. // {
  294. // m_pThreadCreateAlarm->startRecordAlarmFile(alarmInfo);
  295. // }
  296. // }
  297. // }
  298. // }
  299. // }else
  300. // {
  301. // /* 没有噪音,判断是否结束报警 */
  302. // if(m_isNoiseLast)
  303. // {
  304. // /* 停止噪音报警 */
  305. // m_isNoiseWarning = false;
  306. // /* 通知对比项线程,结束噪音报警 */
  307. // std::lock_guard<std::mutex> lock(m_mutexAlarm);
  308. // for(auto& pair : m_mapAlarmInfo)
  309. // {
  310. // AlarmInfo_t& alarmInfo = pair.second;
  311. // if(alarmInfo.isAlarm) // 如果正在报警
  312. // {
  313. // // 设置为非报警状态
  314. // alarmInfo.isAlarm = false;
  315. // /* 设置结束时间 */
  316. // alarmInfo.EndTime = m_leftRightData.endTime;
  317. // SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, alarmInfo.strCompareItemName,
  318. // alarmInfo.RoadInfo.strCompareRoadName.toStdString());
  319. // /* 这里可以添加通知录制报警文件的线程停止录音 */
  320. // if(m_pThreadCreateAlarm != nullptr)
  321. // {
  322. // m_pThreadCreateAlarm->stopRecordAlarmFile(alarmInfo);
  323. // }
  324. // /* 写入数据库,并清空时间 */
  325. // AlarmManager.addAlarmInfo(alarmInfo);
  326. // alarmInfo.StartTime = QDateTime();
  327. // alarmInfo.EndTime = QDateTime();
  328. // }
  329. // }
  330. // }
  331. // }
  332. // m_isNoiseLast = m_isNoise.load(); // 更新这一次的噪音检测结果
  333. // }
  334. /* 新的保存结果函数,只有一个对比项信息 */
  335. void NoiseDetectThread::saveResultOnlyOneItem()
  336. {
  337. /* 将当前噪音检测结果保存到环形队列中 */
  338. m_ringQueueIsNoise.push(m_currentIsNoise);
  339. /* 计算出噪音个数和噪音所占百分比 */
  340. const int size = m_ringQueueIsNoise.QueueSize();
  341. int numNoise = 0; // 噪音的个数
  342. int numCountinueNoise = 0; // 连续噪音的个数
  343. double percentNoise = 0.0; // 噪音所占百分比
  344. for(int i = 0; i < size; ++i)
  345. {
  346. if(m_ringQueueIsNoise.at(i))
  347. {
  348. numNoise++;
  349. numCountinueNoise++;
  350. }else {
  351. numCountinueNoise = 0; // 如果不是噪音,连续噪音计数清零
  352. }
  353. }
  354. /* 判断是否是噪音预警 */
  355. if(numCountinueNoise >= m_noiseDetectParam.nNoiseContinueCountIsWarn)
  356. {
  357. m_isNoiseWarning.store(true);
  358. }
  359. percentNoise = numNoise * 100.0 / m_noiseDetectParam.nNoiseDetectContinueCount;
  360. /* 根据噪音所占的百分比判断是否是噪音 */
  361. if(percentNoise >= m_noiseDetectParam.nNoiseContinueCountPercent)
  362. {
  363. m_isNoise.store(true);
  364. }else {
  365. m_isNoise.store(false);
  366. }
  367. // SPDLOG_LOGGER_INFO(m_logger, "{} 当前噪音检测结果: {}, 噪音预警: {}, 连续噪音个数: {}, 噪音所占百分比: {:.2f}%",
  368. // m_logBase, m_currentIsNoise, m_isNoiseWarning.load(), numCountinueNoise, percentNoise);
  369. /* 噪音报警信息 */
  370. if(m_isNoise.load())
  371. {
  372. /* 判断上次是否是噪音 */
  373. if(!m_isNoiseLast)
  374. {
  375. /* 开始噪音报警 */
  376. m_isNoiseWarning = true;
  377. /* 通知对比项线程,开始噪音报警 */
  378. if(!m_currentAlarmInfo.isAlarm) // 如果没有报警
  379. {
  380. m_currentAlarmInfo.isAlarm = true; // 设置为报警状态
  381. m_currentAlarmInfo.CompareItemID = m_threadInfo.compareItemInfo.nID;
  382. m_currentAlarmInfo.strCompareItemName = m_threadInfo.compareItemInfo.strName.toStdString();
  383. m_currentAlarmInfo.RoadInfo = m_threadInfo.compareItemInfo.mapRoad.first();
  384. m_currentAlarmInfo.AlarmType = EAlarmType::EAT_Noise;
  385. /* 向前推算噪音开始时间,开始时间需要向前推 n次噪音检测的时间 x 单次噪音检测需要的时间,单位秒 */
  386. int nNoiseDetectTime = m_noiseDetectParam.nNoiseDetectContinueCount * 1;
  387. QDateTime startTime = m_leftRightData.startTime;
  388. startTime = startTime.addSecs(-nNoiseDetectTime);
  389. m_currentAlarmInfo.StartTime = startTime;
  390. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 开始噪音报警, 报警开始时间: {}", m_logBase, m_currentAlarmInfo.strCompareItemName,
  391. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString(),
  392. startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
  393. /* 这里可以添加通知录制报警文件的线程开始录音 */
  394. if(m_pThreadCreateAlarm != nullptr)
  395. {
  396. m_pThreadCreateAlarm->startRecordAlarmFile(m_currentAlarmInfo);
  397. }
  398. }
  399. }
  400. }else
  401. {
  402. /* 没有噪音,判断是否结束报警 */
  403. if(m_isNoiseLast)
  404. {
  405. /* 停止噪音报警 */
  406. m_isNoiseWarning = false;
  407. /* 通知对比项线程,结束噪音报警 */
  408. std::lock_guard<std::mutex> lock(m_mutexAlarm);
  409. if(m_currentAlarmInfo.isAlarm) // 如果正在报警
  410. {
  411. // 设置为非报警状态
  412. m_currentAlarmInfo.isAlarm = false;
  413. /* 设置结束时间 */
  414. m_currentAlarmInfo.EndTime = m_leftRightData.endTime;
  415. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, m_currentAlarmInfo.strCompareItemName,
  416. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString());
  417. /* 这里可以添加通知录制报警文件的线程停止录音 */
  418. if(m_pThreadCreateAlarm != nullptr)
  419. {
  420. m_pThreadCreateAlarm->stopRecordAlarmFile(m_currentAlarmInfo);
  421. }
  422. /* 写入数据库,并清空时间 */
  423. AlarmManager.addAlarmInfo(m_currentAlarmInfo);
  424. m_currentAlarmInfo = AlarmInfo_t(); // 清空当前报警信息
  425. }
  426. }
  427. }
  428. m_isNoiseLast = m_isNoise.load(); // 更新这一次的噪音检测结果
  429. }
  430. /* 结束报警 */
  431. void NoiseDetectThread::endAlarm()
  432. {
  433. if(m_currentAlarmInfo.isAlarm) // 如果正在报警
  434. {
  435. // 设置为非报警状态
  436. m_currentAlarmInfo.isAlarm = false;
  437. /* 设置结束时间 */
  438. m_currentAlarmInfo.EndTime = m_leftRightData.endTime;
  439. SPDLOG_LOGGER_WARN(m_logger, "{} 对比项-{} {} 结束噪音报警", m_logBase, m_currentAlarmInfo.strCompareItemName,
  440. m_currentAlarmInfo.RoadInfo.strCompareRoadName.toStdString());
  441. /* 这里可以添加通知录制报警文件的线程停止录音 */
  442. if(m_pThreadCreateAlarm != nullptr)
  443. {
  444. m_pThreadCreateAlarm->stopRecordAlarmFile(m_currentAlarmInfo);
  445. }
  446. /* 写入数据库,并清空时间 */
  447. AlarmManager.addAlarmInfo(m_currentAlarmInfo);
  448. m_currentAlarmInfo = AlarmInfo_t(); // 清空当前报警信息
  449. }
  450. m_isNoiseWarning.store(false);
  451. m_isNoise.store(false);
  452. m_isNoiseLast = false;
  453. m_currentIsNoise = false;
  454. }