#include "GlobalConfig.h" #include #include "spdlog/spdlog.h" /* ==================================================================================== * ************************** GlobalConfig成员函数 ****************************** * ====================================================================================*/ GlobalConfig::GlobalConfig() { ThreadSleepMS = 300; } /* 读取配置文件 */ bool GlobalConfig::readConfig(const QString& strConfigFile) { if(strConfigFile.isEmpty()) { SPDLOG_ERROR("读取配置文件失败! 配置文件名为空"); return false; } SPDLOG_DEBUG("读取配置文件: {}", strConfigFile.toStdString()); QSettings settings(strConfigFile, QSettings::IniFormat); settings.setIniCodec("UTF-8"); settings.beginGroup("System"); AppUpdateOnWorkTimeInterval_Time = settings.value("WorkOnInfoSecond", 600).toInt(); /* 更新在岗信息的时间间隔 */ AppPeopleOnWork_Time = settings.value("APPPEPOLEONWORK", 300).toInt(); /* 离岗时间 */ AppContraband_Time = settings.value("APPBADTHING", 50).toInt(); /* 违禁物品出现的时间 */ AppBadMan = settings.value("APPBADMAN", 50).toInt(); /* 非法入侵 */ AppTired_Time = settings.value("APPTIRED", 50).toInt(); /* 疲劳检测时间 */ AppPeopleCont = settings.value("APPPEPOLECONT", 50).toInt(); /* 人员聚集时间 */ AppPlayPhone = settings.value("APPPLAYPHONE", 50).toInt(); /* 玩手机识别 */ AppMouse = settings.value("APPMOUSE", 50).toInt(); /* 手势识别 */ AppMask = settings.value("APPMASK", 5).toInt(); /* 戴口罩识别 */ CheckSet = settings.value("CHECKSET", 300).toInt(); /* 服务端多久检测一次配置 */ EventTimeValid = settings.value("EventTimeValid", 300).toInt(); /* 事件时间有效期 */ Key = settings.value("Key").toString().toStdString(); /* Key */ Secret = settings.value("Secret").toString().toStdString(); /* Secret */ settings.endGroup(); if(Key.empty() || Secret.empty()) { SPDLOG_ERROR("读取配置文件失败! Key或Secret为空"); return false; } return true; } /* 打印读取到的值 */ void GlobalConfig::printValue() { SPDLOG_INFO("APPPEPOLEONWORK: {}", AppPeopleOnWork_Time); SPDLOG_INFO("APPBADTHING: {}", AppContraband_Time); SPDLOG_INFO("APPBADMAN: {}", AppBadMan); SPDLOG_INFO("APPTIRED: {}", AppTired_Time); SPDLOG_INFO("APPPEOPLECONT: {}", AppPeopleCont); SPDLOG_INFO("APPPLAYPHONE: {}", AppPlayPhone); SPDLOG_INFO("APPMOUSE: {}", AppMouse); SPDLOG_INFO("APPMASK: {}", AppMask); SPDLOG_INFO("CHECKSET: {}", CheckSet); SPDLOG_INFO("EventTimeValid: {}", EventTimeValid); } /* 添加通道信息 */ void GlobalConfig::setChannelInfo(std::map mapChannelName) { m_rwLockChnInfo.lockForWrite(); m_mapChannelName.clear(); m_mapChannelName = mapChannelName; m_rwLockChnInfo.unlock(); } /* 清空通道信息 */ void GlobalConfig::clearChannelInfo() { m_rwLockChnInfo.lockForWrite(); m_mapChannelName.clear(); m_rwLockChnInfo.unlock(); } /* 获取通道名称 */ std::string GlobalConfig::getChannelName(int ChannelID) { m_rwLockChnInfo.lockForRead(); std::string strName = ""; auto it = m_mapChannelName.find(ChannelID); if(it != m_mapChannelName.end()) { strName = it->second; } m_rwLockChnInfo.unlock(); return strName; } /* 添加摄像机信息 */ void GlobalConfig::setCameraInfo(std::map mapCameraName) { m_rwLockCamInfo.lockForWrite(); m_mapCameraName.clear(); m_mapCameraName = mapCameraName; m_rwLockCamInfo.unlock(); } /* 获取摄像机名称 */ std::string GlobalConfig::getCameraName(int CameraID) { m_rwLockCamInfo.lockForRead(); std::string strName = ""; auto it = m_mapCameraName.find(CameraID); if(it != m_mapCameraName.end()) { strName = it->second; } m_rwLockCamInfo.unlock(); return strName; } /* ==================================================================================== * ************************ GlobalThreadInfo成员函数 ***************************** * ====================================================================================*/ /* 获取线程运行标志位 */ bool GlobalThreadInfo::getRunning() const { return m_bRunning; } /* 设置线程运行标志位 */ void GlobalThreadInfo::setRunning(bool bRunning) { m_bRunning = bRunning; } /* 手动给功能块列表加锁 */ void GlobalThreadInfo::lockRunFAI() { m_mutexRunFAI.lock(); } /* 手动解锁 */ void GlobalThreadInfo::unlockRunFAI() { m_mutexRunFAI.unlock(); } /** * @brief 添加应用信息,一个应用功能在一个频道内只有一个实例 * 这里是添加应用功能和时间段信息 * * @param func * @return true * @return false */ bool GlobalThreadInfo::addFuncActionInfo(const AppAndTimeInfo& func) { if(func.AppType == 0) { return false; } /* 解出这条信息里包含几个App,AppType按位计算,总共8个应用信息 */ for(int i = 0; i < 8; ++i) { if(func.AppType & 0x01) { /* 查找有没有这个应用 */ auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_OnWork); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_OnWork; fa->strFunctionName = "人员在岗识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if(func.AppType & 0x02) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_Contraband); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_Contraband; fa->strFunctionName = "违禁品识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x04) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_Illegal); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_Illegal; fa->strFunctionName = "非法入侵检测"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x08) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_Fatigue); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_Fatigue; fa->strFunctionName = "疲劳检测"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x10) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_Regional); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_Regional; fa->strFunctionName = "区域人员检测"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x20) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_Mouse); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_Mouse; fa->strFunctionName = "老鼠识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x40) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_PlayPhone); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_PlayPhone; fa->strFunctionName = "玩手机识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x80) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_NoMask); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_NoMask; fa->strFunctionName = "未戴口罩识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } else if (func.AppType & 0x0100) { auto pFuncActionInfo = findAppFunction(func.ChannelID, AppFunction::APP_AllDown); if(pFuncActionInfo != nullptr) { /* 更新时间信息 */ pFuncActionInfo->StartTime = func.StartTime; pFuncActionInfo->EndTime = func.EndTime; continue; } FuncActionInfo* fa = new FuncActionInfo; fa->ChannelID = func.ChannelID; fa->appFunction = AppFunction::APP_AllDown; fa->strFunctionName = "摔倒识别"; fa->StartTime = func.StartTime; fa->EndTime = func.EndTime; m_listFuncActionInfo.push_back(fa); } } return true; } /** * @brief 添加算法信息,根据传进来的算法ID,将其加入到对应的功能中 * 根据功能需要,将算法ID加入到对应的功能中 * * @param info * @return true * @return false */ bool GlobalThreadInfo::addActionInfo(const ActionInfo& info) { if(info.ActionID.empty()) { return false; } /* 人脸识别算法(人员在岗识别、非法入侵检测需要) */ if(info.ActionID == g_actionList.ActFace) { /* 人员在岗识别 */ auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_OnWork); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } /* 非法入侵检测 */ pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Illegal); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 人员计数 */ else if (info.ActionID == g_actionList.ActPersonNumber) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Regional); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 违禁物品 */ else if (info.ActionID == g_actionList.ActContraband) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Contraband); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 玩手机 */ else if (info.ActionID == g_actionList.ActPlayPhone) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_PlayPhone); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 睡岗识别 */ else if (info.ActionID == g_actionList.ActSleep) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Fatigue); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 疲劳检测 */ else if(info.ActionID == g_actionList.ActFatigueDetection) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Fatigue); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 动物识别 */ else if (info.ActionID == g_actionList.ActAnimalDetect) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Mouse); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 老鼠识别 */ else if (info.ActionID == g_actionList.ActMouseDetect) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Mouse); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } /* 口罩识别 */ else if (info.ActionID == g_actionList.ActMask) { auto pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_NoMask); if(pFuncActionInfo != nullptr) { pFuncActionInfo->addActionInfo(info); } } else { SPDLOG_WARN("未知的算法ID: {}", info.ActionID); return false; } return true; } /** * @brief 清空无用的功能信息 * 摄像机和算法信息为空的,或者运行状态为RUN_STATE_EXITCOMPLET,都会被清理掉 * */ void GlobalThreadInfo::clearNoneFuncActionInfo() { for(auto it0 = m_listFuncActionInfo.begin(); it0 != m_listFuncActionInfo.end();) { if((*it0)->listRoomCamActInfo.empty() || ((*it0)->RunState == RunTimeState::RUN_STATE_EXITCOMPLET)) { delete *it0; it0 = m_listFuncActionInfo.erase(it0); }else { ++it0; } } } /* 清空算法列表(直接清空房间信息) */ void GlobalThreadInfo::clearActionList() { for(auto& it0 : m_listFuncActionInfo) { // for(auto& it1 : it0->listRoomCamActInfo) // { // it1.mapCameraAction.clear(); // } it0->listRoomCamActInfo.clear(); } } /* 设置没有配置摄像机的功能退出 */ void GlobalThreadInfo::setNoneCameraFuncStop() { for(auto& it : m_listFuncActionInfo) { if(it->listRoomCamActInfo.empty()) { it->RunState = RunTimeState::RUN_STATE_STOP; } } } /* 查找应用信息 */ bool GlobalThreadInfo::findAppFunction(const AppFunction func) { for(const auto& it0 : m_listFuncActionInfo) { if(it0->appFunction == func) { return true; } } return false; } /* 根据频率和功能查找实例 */ FuncActionInfo* GlobalThreadInfo::findAppFunction(const int ChannelID, const AppFunction func) { for(const auto& it0 : m_listFuncActionInfo) { if( (it0->appFunction == func) && (it0->ChannelID == ChannelID) ) { return it0; } } return nullptr; } /** * @brief 查找这个应用信息 * * @param func * @return FuncActionInfo* */ FuncActionInfo* GlobalThreadInfo::findAppFunction(const FuncActionInfo& func) { for(const auto& it0 : m_listFuncActionInfo) { if(it0->ChannelID == func.ChannelID && it0->appFunction == func.appFunction) { return it0; } } return nullptr; } /* 设置线程状态 */ void GlobalThreadInfo::setThreadState(FuncActionInfo* pInfo, RunTimeState state) { std::lock_guard look(m_mutexRunFAI); auto p = findAppFunction(*pInfo); if(p != nullptr) { p->RunState = state; } } void GlobalThreadInfo::setThreadState(FuncActionInfo& pInfo, RunTimeState state) { std::lock_guard look(m_mutexRunFAI); auto p = findAppFunction(pInfo); if(p != nullptr) { p->RunState = state; } } /** * @brief 功能线程更新功能信息,这里是从内存中的数组里获取 * * @param pInfo * @return true * @return false */ bool GlobalThreadInfo::updateFuncInfo(FuncActionInfo* pInfo) { pInfo->clearActionList(); std::lock_guard look(m_mutexRunFAI); auto fa = findAppFunction(*pInfo); if(fa == nullptr) { return false; } *pInfo = *fa; return true; } bool GlobalThreadInfo::updateFuncInfo(FuncActionInfo& pInfo) { pInfo.clearActionList(); std::lock_guard look(m_mutexRunFAI); auto fa = findAppFunction(pInfo); if(fa == nullptr) { return false; } pInfo = *fa; return true; }