📄 corearg.cpp
字号:
/*====================================================================================
*
* Subroutine : CheckSoeData()
*
* Parameters :
*
*
* Called from :
*
* Description : 检测事件队列,list最大值超过2000弹出首值
*
* Return :
*
* Modification:
* 2004-12-11:
*
*====================================================================================*/
void CSoeData::CheckSoeData(void)
{
int nResult = 0;
unsigned int i_len = 0;
list<SOE_STATUS>::iterator iter,iter0;
sem_wait(&sem_soe);
i_len = m_ListSoe.size();
if (i_len > 2000)
{
m_ListSoe.pop_front();
}
else if (i_len > 8000)
{
// m_ListSoe.erase(m_ListSoe.begin(), m_ListSoe.end()+7000);
m_ListSoe.clear();
}
//查找错误数据并删除
iter = m_ListSoe.begin();
for (iter=m_ListSoe.begin(); iter!=m_ListSoe.end(); iter++)
{
if (((*iter).eStation != GATE_REMOTESTATION)
&& ((*iter).eStation != GATE_OPERATERSTATION)
&& ((*iter).eStation != GATE_ENGINEERSTATION))
{
m_ListSoe.erase(iter);
}
}
sem_post(&sem_soe);
return;
}
/*====================================================================================
*
* Subroutine : CheckCtrlData()
*
* Parameters :
*
*
* Called from :
*
* Description : 检测命令队列,list最大值超过2000弹出首值。当enum CMD_TYPE
* 增加命令时函数中的判断也要添加
*
* Return :
*
* Modification:
* 2004-12-22:
*
*====================================================================================*/
void CSoeData::CheckCtrlData(void)
{
int nResult = 0;
unsigned int i_len = 0;
list<CTRL_VALUE>::iterator iter,iter0;
sem_wait(&sem_soe);
i_len = m_CtrlValue.size();
if (i_len > 2000)
{
m_CtrlValue.pop_front();
}
else if (i_len > 8000)
{
// m_CtrlValue.erase(m_CtrlValue.begin(), m_CtrlValue.end()+7000);
m_CtrlValue.clear();
}
//查找错误数据并删除
iter = m_CtrlValue.begin();
for (iter=m_CtrlValue.begin(); iter!=m_CtrlValue.end(); iter++)
{
if ( ((*iter).eCmdType != COMMAND_SEL_CTRL) //控制选择
&& ((*iter).eCmdType != COMMAND_EXE_CTRL) //控制执行
&& ((*iter).eCmdType != COMMAND_CANCEL_CTRL) //控制撤消
&& ((*iter).eCmdType != COMMAND_BAOHU_RESET) //保护复归
&& ((*iter).eCmdType != COMMAND_AMMETER) //冻结电度
&& ((*iter).eCmdType != COMMAND_CALI_TIME) //对时
&& ((*iter).eCmdType != COMMAND_SET_RYB)) //软压板
{
m_CtrlValue.erase(iter);
}
}
sem_post(&sem_soe);
return;
}
//----------------------------------- 设备内存数据 -----------------------------------
CDevData::CDevData()
{
sem_init(&sem_dev, 0, 1);
}
CDevData::~CDevData()
{
sem_destroy(&sem_dev);
}
/*====================================================================================
*
* Subroutine : InsDevData()
*
* Parameters :
* pData:设备数据结构
* count:数据的个数(以数据结构为单位)
*
* Called from :
*
* Description : 插入设备数据信息
*
* Return : 返回值: 1:成功, 0:失败
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
int CDevData::InsDevData(DATAGROUP *pData, int count)
{
int nResult = 0;
if (count>0)
{
pair<pair<unsigned int, unsigned int>, enum DATA_TYPE> i_pair;
map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;
sem_wait(&sem_dev);
for (int i=0; i<count; i++)
{
i_pair.first.first = pData[i].nPortNo;
i_pair.first.second = pData[i].nSerial;
i_pair.second = pData[i].eType;
m_MapData.insert(map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>
::value_type(i_pair, pData[i]));
}
sem_post(&sem_dev);
nResult = 1;
}
return nResult;
}
/*====================================================================================
*
* Subroutine : DelDevData()
*
* Parameters :
* nPortNo 设备编号
* No: 序号
* count: 数据的个数(以数据结构为单位)
*
* Called from :
*
* Description : 删除设备数据信息
*
* Return : 返回值: 1:成功, 0:失败
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
int CDevData::DelDevData(unsigned int nPortNo,
unsigned int *No,
enum DATA_TYPE eType,
int count)
{
int nResult = 0;
if (count >0)
{
pair<pair<unsigned int, unsigned int>, enum DATA_TYPE> i_pair;
sem_wait(&sem_dev);
for (int i=0; i<count; i++)
{
i_pair.first.first = nPortNo;
i_pair.first.second = No[i];
i_pair.second = eType;
m_MapData.erase(i_pair);
}
sem_post(&sem_dev);
nResult = 1;
}
return nResult;
}
/*====================================================================================
*
* Subroutine : DelAllDevData()
*
* Parameters :
* DevAddr: 设备地址
*
* Called from :
*
* Description : 删除全部设备数据信息
*
* Return : 返回值: 1:成功, 0:失败
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
int CDevData::DelAllDevData(unsigned int nPortNo)
{
int num = 0;
pair<pair<unsigned int, unsigned int>, enum DATA_TYPE> i_pair;
map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;
sem_wait(&sem_dev);
iter = m_MapData.begin();
while (iter != m_MapData.end())
{
if (nPortNo==(*iter).second.nPortNo)
{
i_pair.first.first = (*iter).second.nPortNo;
i_pair.first.second = (*iter).second.nSerial;
i_pair.second = (*iter).second.eType;
m_MapData.erase(i_pair);
iter = m_MapData.begin();
num++;
}
else
{
iter++;
}
}
sem_post(&sem_dev);
return num;
}
/*====================================================================================
*
* Subroutine : CountDevData()
*
* Parameters :
* nPortNo: 设备编号
* eType: 数据类型
*
* Called from :
*
* Description : 返回指定装置和类型的数据分组信息记录
*
* Return : 返回值: 记录个数num
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
int CDevData::CountDevData(unsigned int nPortNo, enum DATA_TYPE eType)
{
int num = 0;
map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;
sem_wait(&sem_dev);
for (iter=m_MapData.begin(); iter!=m_MapData.end(); iter++)
{
if ((nPortNo==(*iter).second.nPortNo)
&& (eType==(*iter).second.eType))
{
num++;
}
}
sem_post(&sem_dev);
return num;
}
/*====================================================================================
*
* Subroutine : GetFixDevData()
*
* Parameters :
* nPortNo: 设备编号
* no: 序号
* pData: 设备数据结构
*
* Called from :
*
* Description : 返回指定装置和序号的指定数据信息记录(根据设备编号/序号找实际值)
*
* Return : 返回值: 1:记录存在, 0:记录不存在
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
int CDevData::GetFixDevData(unsigned int nPortNo,
unsigned int no,
enum DATA_TYPE eType,
DATAGROUP &pData)
{
int ret = 0;
map<pair<pair<unsigned int, unsigned int>, enum DATA_TYPE>, DATAGROUP>::iterator iter;
sem_wait(&sem_dev);
for (iter=m_MapData.begin(); iter!=m_MapData.end(); iter++)
{
if ((nPortNo==(*iter).second.nPortNo)
&& (no==(*iter).second.nSerial)
&& (eType==(*iter).second.eType))
{
pData = (*iter).second;
ret = 1;
break;
}
}
sem_post(&sem_dev);
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -