#ifndef SPASERVER_H #define SPASERVER_H #include "FromSuperBrain.h" #include "FromRedis.h" #include "ToEQMDataBase.h" /** * 安播辅助提示系统服务类 * 写入EQM数据库的报警逻辑 * */ class SPAServer { public: SPAServer(); ~SPAServer(); /* 启动服务 */ void startServer(); private: /* 从基础平台获取算法信息和设备信息的线程函数 */ void threadFromSuperBrain(); /* 处理算法信息,返回值为true,说明有改变,需要重新读取 */ bool processAlgorithmInfo(std::vector vecNewAlgInfo); /* 处理设备信息,传入新获取到的值,返回true需要更新本地数据缓存 */ bool processDeviceInfo(std::vector vecNewDevInfo); /* 对比算法信息现有的数据和新获取到的数据,取出要删除和添加的数据 */ void compareAlgorithmInfo(const std::vector& vecNewInfo, std::vector& vecAlgUpdate, std::vector& vecAlgDelete); /* 对比设备和算法关联表是否需要更新 */ void compareDeviceAlgorithmInfo(const std::vector& vecNewInfo, std::vector& vecDevUpdate); /* 从Redis获取数据线程函数,这个是摄像机线程(注意,这个函数未被使用,不从这里获取Redis数据) */ void threadFromRedis(const CameraThreadInfo& info); /* 解析Redis基础数据 */ // void parseRedisData(const std::string& strData, AlarmInfo& alarmInfo); /* 解析Redis的基础通用数据,不包含bBoxes数组数据 */ void parseRedisBaseData(const std::string& strData, AlarmInfo& alarmInfo); /* 解析Redis的bBoxes数据, */ void parseRedisBBoxesData(const std::string& strData, AlarmInfo& alarmInfo); /* 判断时间是否长时间没有更新 */ bool isEventTimeVaild(const std::string& strTime); /* 分派任务的线程 */ void threadRoomCamera(); /* 人员在岗识别线程,应该是人脸识别线程,这个需要房间内多个摄像机共同识别 */ void threadActPersonWork(FuncActionInfo* RFAInfo); /* 非法入侵检测 */ void threadActIllegalInvasion(FuncActionInfo* RFAInfo); /* 区域人员检测(人员计数),检测这个区域内的人数,不能少于多少人,不能多余多少人 */ void threadActRegionalPersonnelDetection(FuncActionInfo* RFAInfo); /* 普通任务线程,一个算法值对应一个摄像机 */ void threadActNormal(FuncActionInfo* info); /* 将该算法对应的摄像机放入摄像机列表 */ bool insertCameraToAction(RoomActionInfo* pRAInfo, std::list& listRC, std::multimap& mapCameraActionID); /* 更新算法的摄像机ID */ bool updateFuncInfo(std::shared_ptr pInfo); /* 设置线程状态 */ void setThreadState(std::shared_ptr pInfo, RunTimeState state); /* 计算与当前时间的时间差,返回秒 */ int timeDiffWithNow(const std::string& strTime); /* 字符串时间转换成std::chrono时间点 */ std::chrono::system_clock::time_point strTimeToChrono(const std::string& strTime); /* 时间点转换成字符串 */ std::string chronoToStrTime(const std::chrono::system_clock::time_point& timePoint); private: std::shared_ptr m_logger = nullptr; bool m_threadRunning = true; /* 线程正在运行 */ FromSuperBrain m_fromSuperBrain; ToEQMDataBase m_toEQMDataBase; // std::mutex m_mutexActionID; /* 算法ID的互斥锁 */ // std::string ActPersonWork; /* 人员在岗识别 */ // std::string ActPersonNumber; /* 区域人员检测(区域人员计数) */ // std::string ActIllegalInvasion; /* 非法入侵检测 */ // std::string ActContraband; /* 违禁品检测 */ // std::string ActFatigueDetection; /* 疲劳检测 */ /* 算法信息,这个就是tAction在内存中的数据,方便后续对比,程序启动的时候会先获取一份 */ std::vector m_vecEqmAlgInfo; /* 设备信息,这个是tActionCamer的信息 */ std::vector m_vecEqmDevInfo; /* 算法信息列表,每个算法所在的频率、房间、摄像机 */ std::mutex m_mutexActionInfo; ListActionInfo m_listActionInfo; /* 设备和算法关联信息,这里存储着已经删除的设备对应的算法信息,将在这一轮循环中删除 */ std::list m_listDevIDDelete; // /* 房间和算法关联的信息,包含所需要的摄像机ID */ // std::mutex m_mutexRunRAI; // ListRoomActionInfo m_runListRoomActionInfo; // /* 运行时的算法信息列表,这个容器存储的是不需要摄像机融合的算法 */ // std::mutex m_mutexRunAI; // ListActionInfo m_runListActionInfo; /* 运行时应用线程功能相关信息 */ std::mutex m_mutexRunFAI; ListFuncActInfo m_runListFuncActInfo; }; #endif /* SPASERVER_H */