CompareItemThread.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #ifndef _COMPAREITEMTHREAD_H_
  2. #define _COMPAREITEMTHREAD_H_
  3. #include <map>
  4. #include <QObject>
  5. #include <QEventLoop>
  6. #include <QTimer>
  7. #include "BaseCalculateThread.h"
  8. #include "CompareItemResult.h"
  9. #include "FromMQTT.h"
  10. #include "AudioData.h"
  11. #include "SystemConfigStruct.h"
  12. class CalculateDBThread;
  13. class NoiseDetectThread;
  14. class CreateDBThread;
  15. class CreateRecordFileThread;
  16. class ConsistencyCompareThread;
  17. #define CI_SIMULATE false
  18. /**
  19. 对比项功能线程
  20. 功能:
  21. 1、对比两个录音通道的数据,通道1是主通道,和其他通道挨个对比
  22. 2、从这里开启各个比对线程,获取比对结果信息,获取噪音检测结果,获取计算出的音量包信息,
  23. 组合成一个对比项的结果,发送到MQTT中,MQTT订阅主题: LH_ACAServer/DB/0
  24. 3、静音、过载、反相的报警信息从计算音量的线程中计算得出,并直接写入数据库,不再经过这里
  25. 一致性报警信息从两两对比线程中计算得出,直接写入数据库
  26. 噪音报警信息从噪音检测线程中计算得出,直接写入数据库
  27. 4、这里创建的线程包含:两两对比线程、音量检测线程,这两个都和对比项相关联
  28. 5、噪音检测线程现在也移动到这里创建,因为噪音报警需要对比项信息
  29. 其他说明:
  30. 1、这个线程由于需要使用qmqtt发布数据,需要使用到Qt的事件循环,所以多继承了 QObject,
  31. 线程的使用权会交给 Qt 的事件循环来管理,通过定时器定时调用 task() 函数
  32. 检测计划段说明
  33. 1、在这里判断是否是检测时间段,如果不是某一项的检测时间段,则设置对应的线程为非检测时间段,对应的检测线程
  34. 输出的结果会做对应的处理(如噪音检测会设置为非噪音,一致性检测设置为一致)
  35. 2、噪音检测是否开启取决于SysConfig中的噪音检测配置
  36. */
  37. class CompareItemThread : public QObject, public BaseCalculateThread
  38. {
  39. Q_OBJECT
  40. public:
  41. CompareItemThread(CalculateThreadInfo_t& threadInfo);
  42. ~CompareItemThread() override;
  43. /* 开启线程 */
  44. void thread_task() override;
  45. /* 停止线程 */
  46. void thread_stop() override;
  47. void thread_stop_block() override;
  48. /* 设置检测时段 */
  49. void setDetectPeriod(const DetectPeriodConfig_t& detectPeriod);
  50. protected:
  51. /* 线程功能函数,未使用这个函数 */
  52. void task() override;
  53. /* 功能函数,使用的是这个函数 */
  54. void timerTask();
  55. /* 初始化数据 */
  56. bool initData() override;
  57. /* 清理数据 */
  58. void clearData() override;
  59. /* 初始化MQTT */
  60. void initMQTT();
  61. /* 停止线程 */
  62. void stop_thread();
  63. private slots:
  64. /* 定时器槽函数 */
  65. void do_timeout();
  66. private:
  67. /* 获取创建实时音量的线程,这个线程属于录音线程,不需要在这里移除和销毁 */
  68. bool getCreateDBThread();
  69. /* 获取录音线程,这个属于录音线程,不需要移除释放 */
  70. void getRecordThread();
  71. /* 创建一致性对比线程,主通道是第一个通道,其他都需要和主通道进行对比 */
  72. bool createCompareThreads();
  73. /* 销毁一致性对比线程 */
  74. void destroyCompareThreads();
  75. /* 创建计算音量报警的线程 */
  76. bool createCalculateDBThreads();
  77. /* 销毁音量计算的线程 */
  78. void destroyCalculateDBThreads();
  79. /* 创建噪音检测线程 */
  80. void createNoiseDetectThreads();
  81. /* 销毁噪音检测线程 */
  82. void destroyNoiseDetectThreads();
  83. /* 更新数据 */
  84. bool updateResultData();
  85. /* 发送数据 */
  86. void sendResultData();
  87. /* 清除标志更新位 */
  88. void clearUpdateFlags();
  89. /* 生成发送至MQTT的JSON数据 */
  90. bool generateMQTTJsonData(const CompareResult_t& compareResult, QByteArray& jsonData);
  91. /* 检查是否在检测时间段内,更新其他检测功能的检测时间,对比项是否启用由外部控制 */
  92. bool checkDetectPeriod();
  93. /* 开启或结束录音 */
  94. void startOrStopRecord(bool isStart);
  95. private:
  96. /* 事件循环 */
  97. QEventLoop m_eventLoop;
  98. /* 定时器 */
  99. QTimer* m_pTimer = nullptr;
  100. /* 发送音量包信息到mqtt中 */
  101. FromMQTT* m_pFromMQTT = nullptr;
  102. /* 发布的主题 */
  103. QString m_pubTopic;
  104. /* ---------------------- DEBUG ---------------------- */
  105. std::chrono::steady_clock::time_point m_nowTimePoint;
  106. /* ---------------------- 动态库设置的参数 ---------------------- */
  107. /* 这三个参数从设置动态库中获取 */
  108. bool m_isConsistencyNoWarnWhenOtherAlarm = false; /* 在其他报警时,不一致不报警且后台不进行不一致对比 */
  109. // bool m_isNotConsistencyOneRoadNoise = false; /* 如果主通道、其他通道,二者一个噪音,一个非噪音,直接判定为不一致 */
  110. // bool m_isNotConsistencyIgnoreSilent = false; /* 不一致对比不进行静音、反相等处理 */
  111. /* ---------------------- 对比项 ---------------------- */
  112. /* 计算音量信息的线程指针,第一个是主通道线程,int是对比项中的通道号 */
  113. std::map<int, CalculateDBThread*> m_mapCalculateDBThreads;
  114. /* 计算噪音的线程指针 */
  115. std::map<int, NoiseDetectThread*> m_mapNoiseDetectThreads;
  116. /* 对比项信息线程,这个线程在这里创建,不会和其他对比项复用,int是第二路对比通道的编号 */
  117. std::map<int, ConsistencyCompareThread*> m_mapCpmsistencyThreads;
  118. /* 创建音量包的线程指针 */
  119. std::map<int, CreateDBThread*> m_mapCreateDBThreads;
  120. /* 音量包更新标志位,int是录音通道 */
  121. std::map<int, bool> m_mapCDBUpdated;
  122. /* 计算的数据结果 */
  123. CompareResult_t m_compareResult;
  124. /* 实时音频数据 */
  125. std::map<int, std::list<OneDBData>> m_mapRealTimeData;
  126. /* 每次发送的音量包数量 */
  127. int m_sendVolumeCount = 3;
  128. /* ---------------------- 检测计划 ---------------------- */
  129. std::mutex m_mutexDetectPeriod; /* 检测时段互斥锁 */
  130. // std::atomic_bool m_isDetectPeriodUpdated = false; /* 检测时段更新标志 */
  131. DetectPeriodConfig_t m_detectPeriod; /* 检测时段配置 */
  132. QDateTime m_lastDetectPeriodUpdateTime; /* 上次检测时段更新时间 */
  133. /* 噪音检测参数 */
  134. NoiseDetectBaseConfig_t m_noiseDetectConfig;
  135. /* ---------------------- 录音线程 ---------------------- */
  136. /* 录音线程指针,int是录音通道号 */
  137. std::map<int, CreateRecordFileThread*> m_mapRecordThreads;
  138. };
  139. #endif // _COMPAREITEMTHREAD_H_