123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614 |
- #include "GlobalConfig.h"
- #include <QSettings>
- #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_Time = 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_Time);
- 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<int, std::string> 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<int, std::string> 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);
- }
- /* 非法入侵检测 */
- pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_Illegal);
- if(pFuncActionInfo != nullptr)
- {
- pFuncActionInfo->addActionInfo(info);
- }
- /* 人员在岗识别 */
- pFuncActionInfo = findAppFunction(info.ChannelID, AppFunction::APP_OnWork);
- 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;
- SPDLOG_INFO("《{}》房间信息为空,退出检测", it->strFunctionName);
- }
- }
- }
- /* 查找应用信息 */
- 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<std::mutex> look(m_mutexRunFAI);
- auto p = findAppFunction(*pInfo);
- if(p != nullptr)
- {
- p->RunState = state;
- }
- }
- void GlobalThreadInfo::setThreadState(FuncActionInfo& pInfo, RunTimeState state)
- {
- std::lock_guard<std::mutex> 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<std::mutex> 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<std::mutex> look(m_mutexRunFAI);
- auto fa = findAppFunction(pInfo);
- if(fa == nullptr)
- {
- return false;
- }
- pInfo = *fa;
- return true;
- }
|