|
@@ -1,7 +1,9 @@
|
|
|
#include "CompareItemThread.h"
|
|
|
|
|
|
+#include "ChannelParam.h"
|
|
|
#include "FromMQTT.h"
|
|
|
#include "GlobalInfo.h"
|
|
|
+#include "SystemConfig.h"
|
|
|
#include "ThreadManager.h"
|
|
|
#include "CalculateDBThread.h"
|
|
|
#include "NoiseDetectThread.h"
|
|
@@ -60,7 +62,9 @@ void CompareItemThread::threadTask()
|
|
|
// SPDLOG_LOGGER_WARN(m_logger, "{} 创建定时器成功,开启定时器", m_logBase);
|
|
|
m_pTimer->setTimerType(Qt::PreciseTimer);
|
|
|
m_pTimer->setSingleShot(false); // 设置为非单次定时器
|
|
|
- m_pTimer->setInterval(30);
|
|
|
+ /* 计算定时时间,根据每次需要发送的音量包大小设置定时时间,-3是让定时器提前3ms溢出 */
|
|
|
+ int interval = (1000 / VOLUME_INFO_NUM) * m_sendVolumeCount - 3;
|
|
|
+ m_pTimer->setInterval(interval);
|
|
|
m_eventLoop.connect(m_pTimer, &QTimer::timeout, this, &CompareItemThread::do_timeout, Qt::DirectConnection);
|
|
|
m_pTimer->start();
|
|
|
|
|
@@ -195,6 +199,10 @@ void CompareItemThread::timerTask()
|
|
|
/* 初始化数据 */
|
|
|
bool CompareItemThread::initData()
|
|
|
{
|
|
|
+ /* 获取参数 */
|
|
|
+ m_noiseDetectConfig = SysConfig.getNoiseDetectBaseConfig();
|
|
|
+
|
|
|
+
|
|
|
/* 创建录音通道线程 */
|
|
|
for(const auto& road : m_threadInfo.compareItemInfo.mapRoad)
|
|
|
{
|
|
@@ -210,8 +218,12 @@ bool CompareItemThread::initData()
|
|
|
createCompareThreads();
|
|
|
|
|
|
/* 创建计算噪音的线程 */
|
|
|
- destroyNoiseDetectThreads();
|
|
|
- createNoiseDetectThreads();
|
|
|
+ if(m_noiseDetectConfig.isEnableNoiseDetect)
|
|
|
+ {
|
|
|
+ destroyNoiseDetectThreads();
|
|
|
+ createNoiseDetectThreads();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/* 获取创建实时音量包的线程 */
|
|
|
if(!getCreateDBThread())
|
|
@@ -229,6 +241,8 @@ bool CompareItemThread::initData()
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/* 初始化存储结果的数据结构 */
|
|
|
m_compareResult = CompareResult_t();
|
|
|
m_compareResult.compareItemID = m_threadInfo.compareItemInfo.nID;
|
|
@@ -255,6 +269,8 @@ bool CompareItemThread::initData()
|
|
|
QDateTime currentTime = QDateTime::currentDateTime();
|
|
|
m_lastDetectPeriodUpdateTime = currentTime;
|
|
|
|
|
|
+ m_nowTimePoint = std::chrono::steady_clock::now();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -288,7 +304,7 @@ void CompareItemThread::clearData()
|
|
|
/* 定时器槽函数 */
|
|
|
void CompareItemThread::do_timeout()
|
|
|
{
|
|
|
- std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
|
|
|
+ // std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
|
|
|
// SPDLOG_LOGGER_WARN(m_logger, "{} 定时器触发,开始执行定时任务", m_logBase);
|
|
|
if(m_pFromMQTT == nullptr)
|
|
|
{
|
|
@@ -297,8 +313,9 @@ void CompareItemThread::do_timeout()
|
|
|
timerTask();
|
|
|
|
|
|
std::chrono::steady_clock::time_point endTime = std::chrono::steady_clock::now();
|
|
|
- std::chrono::milliseconds duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);
|
|
|
+ std::chrono::milliseconds duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - m_nowTimePoint);
|
|
|
SPDLOG_LOGGER_DEBUG(m_logger, "{} 定时器任务完成,耗时: {} ms", m_logBase, duration.count());
|
|
|
+ m_nowTimePoint = endTime; // 更新当前时间点
|
|
|
}
|
|
|
|
|
|
/* 初始化MQTT */
|
|
@@ -467,6 +484,15 @@ void CompareItemThread::createNoiseDetectThreads()
|
|
|
{
|
|
|
for(const auto& road : m_threadInfo.compareItemInfo.mapRoad)
|
|
|
{
|
|
|
+ if(road.nCompareRoadNum == 1)
|
|
|
+ {
|
|
|
+ /* 是主通道,判断主通道是否开启了噪音检测计划 */
|
|
|
+ if(!m_noiseDetectConfig.isEnableMainRoadDetect)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 主通道 {} 不开启噪音检测", m_logBase, road.strCompareRoadName.toStdString());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
CalculateThreadInfo_t threadInfo;
|
|
|
threadInfo.compareItemInfo.mapRoad.clear(); // 清空通道信息
|
|
|
threadInfo.compareItemInfo.mapRoad.insert(road.nCompareRoadNum, road); // 添加当前通道
|
|
@@ -556,6 +582,7 @@ void CompareItemThread::destroyNoiseDetectThreads()
|
|
|
*/
|
|
|
bool CompareItemThread::updateResultData()
|
|
|
{
|
|
|
+ // std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
|
|
|
/* -------------------------------------------------------------------------------------
|
|
|
* 先从音量计算数据中获取音量包信息,循环等待获取完成
|
|
|
* ------------------------------------------------------------------------------------- */
|
|
@@ -570,30 +597,26 @@ bool CompareItemThread::updateResultData()
|
|
|
/* 已经更新过了 */
|
|
|
continue;
|
|
|
}
|
|
|
- // CalculateDBThread* pThread = m_mapCalculateDBThreads[pair.first];
|
|
|
- // if(pThread == nullptr)
|
|
|
- // {
|
|
|
- // SPDLOG_LOGGER_ERROR(m_logger, "{} 音量计算线程失效", m_logBase);
|
|
|
- // continue;
|
|
|
- // }
|
|
|
- // /* 获取最新的音量包数据 */
|
|
|
- // if(!pThread->getlastVolumeInfo(m_compareResult.mapRoadVolumes[pair.first]))
|
|
|
- // {
|
|
|
- // continue; // 没有获取到最新数据,继续等待
|
|
|
- // }
|
|
|
+
|
|
|
CreateDBThread* pThread = m_mapCreateDBThreads[pair.first];
|
|
|
+ // CreateDBThread* pThread = m_mapCreateDBThreads[2];
|
|
|
if(pThread == nullptr)
|
|
|
{
|
|
|
SPDLOG_LOGGER_WARN(m_logger, "{} 获取音量创建线程失败,通道: {}", m_logBase, pair.first);
|
|
|
continue;
|
|
|
}
|
|
|
/* 获取最新的音量包数据 */
|
|
|
- if(!pThread->getLatestRealTimeResult(m_mapRealTimeData[pair.first], 3))
|
|
|
+ if(!pThread->getLatestRealTimeResult(m_mapRealTimeData[pair.first], m_sendVolumeCount))
|
|
|
{
|
|
|
// SPDLOG_LOGGER_WARN(m_logger, "{} 获取最新音量值失败,通道: {}", m_logBase, pair.first);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ // std::chrono::steady_clock::time_point oneTime = std::chrono::steady_clock::now();
|
|
|
+ // std::chrono::milliseconds oneDuration = std::chrono::duration_cast<std::chrono::milliseconds>(oneTime - startTime);
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 获取音量包数据成功,通道: {}, 耗时: {} ms", m_logBase, pair.first, oneDuration.count());
|
|
|
+
|
|
|
+
|
|
|
pair.second = true;
|
|
|
}
|
|
|
/* 判断是否全部更新,如果没有则返回,等待下次再次获取 */
|
|
@@ -609,9 +632,33 @@ bool CompareItemThread::updateResultData()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // std::chrono::steady_clock::time_point updateTime = std::chrono::steady_clock::now();
|
|
|
+ // std::chrono::milliseconds updateDuration = std::chrono::duration_cast<std::chrono::milliseconds>(updateTime - startTime);
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 音量计算线程数据全部更新,耗时: {} ms", m_logBase, updateDuration.count());
|
|
|
+
|
|
|
/* -------------------------------------------------------------------------------------
|
|
|
* 获取静音、过载、反相的结果
|
|
|
* ------------------------------------------------------------------------------------- */
|
|
|
+ for(auto& pair : m_mapCalculateDBThreads)
|
|
|
+ {
|
|
|
+ CalculateDBThread* pThread = pair.second;
|
|
|
+ if(pThread == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 音量计算线程失效", m_logBase);
|
|
|
+ continue; // 跳过这个线程
|
|
|
+ }
|
|
|
+ /* 获取最新的音量数据 */
|
|
|
+ OneRoadVolume_t roadVolume;
|
|
|
+ if(pThread->getAlarmInfo(roadVolume))
|
|
|
+ {
|
|
|
+ m_compareResult.mapRoadVolumes[pair.first].similarity = roadVolume.similarity;
|
|
|
+ m_compareResult.mapRoadVolumes[pair.first].isSilence = roadVolume.isSilence;
|
|
|
+ m_compareResult.mapRoadVolumes[pair.first].isOverload = roadVolume.isOverload;
|
|
|
+ m_compareResult.mapRoadVolumes[pair.first].roadInfo = pThread->getRoadInfo();
|
|
|
+ }else {
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 获取音量计算结果失败,通道: {}", m_logBase, pair.first);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------
|
|
@@ -749,7 +796,6 @@ bool CompareItemThread::generateMQTTJsonData(const CompareResult_t& compareResul
|
|
|
json1["right_db_array"].push_back(db.rightDB);
|
|
|
// fmt::print("left_db_array: {}\n", db);
|
|
|
}
|
|
|
- listRTData.clear();
|
|
|
|
|
|
// json1["left_real_time_db"] = m_mapRealTimeData[roadNum].leftDB;
|
|
|
// json1["right_real_time_db"] = m_mapRealTimeData[roadNum].rightDB;
|
|
@@ -854,7 +900,7 @@ bool CompareItemThread::checkDetectPeriod()
|
|
|
pThread.second->setPhaseInDetectPeriod(true);
|
|
|
}
|
|
|
}
|
|
|
- /* 应用于噪音检测 */
|
|
|
+ /* 应用于噪音检测,如果没开启噪音检测计划,这个map就是空的 */
|
|
|
for(auto& pThread : m_mapNoiseDetectThreads)
|
|
|
{
|
|
|
if(m_detectPeriod.isApplyNoise)
|