99 lines
4.6 KiB
C++
99 lines
4.6 KiB
C++
/**
|
||
@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;
|
||
}
|