2025-03-12 14:17:01 +08:00

99 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
@file MessageBuffer.h
@brief 消息缓存对了类,实现消息缓冲,提供读写接口,消息读写加锁
@author 周正龙
*/
#pragma once
#include "boost/thread.hpp"
#include "FesMessage.pb.h"
#include "OptDataMessage.pb.h"
#include <deque>
#define MAX_CHG_ANA_QUEUE_NUM 50 //变化数据最大队列数如果超出丢弃最老数据50*1000 一秒变化数据5万windwo 处理5秒左右linux2秒左右
#define MAX_CHG_DIG_QUEUE_NUM 100 //变化数据最大队列数,最多保证不丢失 15万YX点,10%变化率30秒持续不丢失事件1.5*10000*30 万点的容量)
#define MAX_MAN_SET_QUEUE_NUM 500 //人工置数最大队列数考虑对一个间隔最多200个测点
#define MAX_CAL_SET_QUEUE_NUM 200 //计算公式最大队列数考虑公式不会超时1000变化率20%
#define MAX_UPD_QUEUE_NUM 20 //全数据最大队列数,如果超出,丢弃最老数据 每种类型25*10000 20万点的容量
#define MAX_EVT_QUEUE_NUM 500000//变化事件,如果超出,丢弃最老数据(考虑15万YX点,10%变化率30秒持续共45万点不丢失事件)
namespace iot_service
{
class CPacketQueue
{
public:
CPacketQueue();
virtual ~CPacketQueue();
private://变化数据
boost::mutex m_objMutexChgAi; //锁
boost::mutex m_objMutexChgDi; //锁
boost::mutex m_objMutexChgMi; //锁
boost::mutex m_objMutexChgPi; //锁
std::deque <iot_idl::SFesChangeAiPkg> m_deqFesChgAiPkg;
std::deque <iot_idl::SFesChangeDiPkg> m_deqFesChgDiPkg;
std::deque <iot_idl::SFesChangeMiPkg> m_deqFesChgMiPkg;
std::deque <iot_idl::SFesChangePiPkg> m_deqFesChgPiPkg;
private://全数据;保存最新全数据
boost::mutex m_objMutexUpdAi; //锁
boost::mutex m_objMutexUpdDi; //锁
boost::mutex m_objMutexUpdMi; //锁
boost::mutex m_objMutexUpdPi; //锁
std::deque <iot_idl::SFesUpdateAiPkg> m_deqFesUpdAiPkg;
std::deque <iot_idl::SFesUpdateDiPkg> m_deqFesUpdDiPkg;
std::deque <iot_idl::SFesUpdateMiPkg> m_deqFesUpdMiPkg;
std::deque <iot_idl::SFesUpdatePiPkg> m_deqFesUpdPiPkg;
private://操作+事件
boost::mutex m_objMutexCalSet; //锁
boost::mutex m_objMutexManSet; //锁
boost::mutex m_objMutexSoeEvt; //锁
std::deque <iot_idl::SFesSoeEventPkg> m_deqFesSoeEventPkg;
std::map<int,std::deque <iot_idl::SOptSetDataPkg>> m_mapOptCalSetPkg; //计算设置
std::map<int,std::deque <iot_idl::SOptSetDataPkg>> m_mapOptManSetPkg; //人工设置
public:
/**
@brief 从消息接受队列得到一条消息记录
*/
void addFesChangeAnaPkg(const iot_idl::SFesChangeAiPkg &objFesChgAiPkg);
void addFesChangeDigPkg(const iot_idl::SFesChangeDiPkg &objFesChgDiPkg);
void addFesChangeMixPkg(const iot_idl::SFesChangeMiPkg &objFesChgMiPkg);
void addFesChangeAccPkg(const iot_idl::SFesChangePiPkg &objFesChgPiPkg);
void addFesUpdateAnaPkg(const iot_idl::SFesUpdateAiPkg &objFesUpdAiPkg);
void addFesUpdateDigPkg(const iot_idl::SFesUpdateDiPkg &objFesUpdDiPkg);
void addFesUpdateMixPkg(const iot_idl::SFesUpdateMiPkg &objFesUpdMiPkg);
void addFesUpdateAccPkg(const iot_idl::SFesUpdatePiPkg &objFesUpdPiPkg);
/**
@brief 从消息接受队列得到一条消息记录
*/
bool getFesChangeAnaPkg(std::deque <iot_idl::SFesChangeAiPkg> &queFesChgAiPkg);
bool getFesChangeDigPkg(std::deque <iot_idl::SFesChangeDiPkg> &queFesChgDiPkg);
bool getFesChangeMixPkg(std::deque <iot_idl::SFesChangeMiPkg> &queFesChgMiPkg);
bool getFesChangeAccPkg(std::deque <iot_idl::SFesChangePiPkg> &queFesChgPiPkg);
bool getFesUpdateAnaPkg(iot_idl::SFesUpdateAiPkg &objFesUpdAiPkg);
bool getFesUpdateDigPkg(iot_idl::SFesUpdateDiPkg &objFesUpdDiPkg);
bool getFesUpdateMixPkg(iot_idl::SFesUpdateMiPkg &objFesUpdMiPkg);
bool getFesUpdateAccPkg(iot_idl::SFesUpdatePiPkg &objFesUpdPiPkg);
/**
@brief 从消息接受队列得到一条消息记录
*/
void addOptCalSetPkg(const iot_idl::SOptSetDataPkg &objOptCalSetPkg); //计算设置
void addOptManSetPkg(const iot_idl::SOptSetDataPkg &objOptManSetPkg); //人工设置
bool getOptCalSetPkg(const int nPointType,std::deque <iot_idl::SOptSetDataPkg> &queOptCalSetPkg); //计算设置
bool getOptManSetPkg(const int nPointType,std::deque <iot_idl::SOptSetDataPkg> &queOptManSetPkg); //人工设置
/**
@brief 从消息接受队列得到一条消息记录
*/
void addFesSoeEventPkg(const iot_idl::SFesSoeEventPkg &objFesSoeEventPkg);
bool getFesSoeEventPkg(std::deque <iot_idl::SFesSoeEventPkg> &queFesSoeEventPkg);
};
typedef boost::shared_ptr<CPacketQueue> CPacketQueuePtr;
}