|
@@ -8,27 +8,6 @@
|
|
|
#include <stdlib.h>
|
|
|
#include <math.h>
|
|
|
|
|
|
-void split(const std::string source,const std::string delim,std::vector<std::string>& dest)
|
|
|
-{
|
|
|
- long n = delim.length();
|
|
|
- long lt = source.length();
|
|
|
-
|
|
|
- long last = 0;
|
|
|
- size_t index = source.find_first_of(delim,last);
|
|
|
- while(index != std::string::npos)
|
|
|
- {
|
|
|
- dest.push_back(source.substr(last,index-last));
|
|
|
- last = index + n;
|
|
|
- index = source.find_first_of(delim,last);
|
|
|
- }
|
|
|
-
|
|
|
- long len = source.length();
|
|
|
- if( len - last > 0)
|
|
|
- {
|
|
|
- dest.push_back(source.substr(last,len - last));
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
Module::Module()
|
|
|
:BaseModule()
|
|
|
{
|
|
@@ -54,7 +33,7 @@ void Module::Setup(ModuleInfo mi)
|
|
|
std::list<DataItem>::iterator itrO;
|
|
|
for( itrO = mi.Properties.begin(); itrO != mi.Properties.end(); ++itrO )
|
|
|
{
|
|
|
- m_szOutputs.push_back(mi.Code + "." + itrO->Code);
|
|
|
+ m_szOutputs.push_back(mi.Code + "_" + itrO->Code);
|
|
|
}
|
|
|
|
|
|
std::vector<Setting>::iterator itr;
|
|
@@ -65,10 +44,31 @@ void Module::Setup(ModuleInfo mi)
|
|
|
QStringList keys = json.keys();
|
|
|
|
|
|
tagRange tr;
|
|
|
+ tr.status = 0;
|
|
|
if( keys.contains("KeepTimes",Qt::CaseInsensitive) )
|
|
|
{
|
|
|
tr.uWinSize = abs(json["KeepTimes"].toInt());
|
|
|
}
|
|
|
+ if( keys.contains("DataName",Qt::CaseInsensitive) )
|
|
|
+ {
|
|
|
+ tr.szName = json["DataName"].toString();
|
|
|
+ }
|
|
|
+ if( keys.contains("alarmRuleId",Qt::CaseInsensitive) )
|
|
|
+ {
|
|
|
+ tr.alarmRuleId = json["alarmRuleId"].toString().toLocal8Bit().toStdString();
|
|
|
+ }
|
|
|
+ if( keys.contains("alarmRuleVersion",Qt::CaseInsensitive) )
|
|
|
+ {
|
|
|
+ tr.alarmRuleVersion = json["alarmRuleVersion"].toInt();
|
|
|
+ }
|
|
|
+ if( keys.contains("level",Qt::CaseInsensitive) )
|
|
|
+ {
|
|
|
+ tr.level = json["level"].toInt();
|
|
|
+ }
|
|
|
+ if( keys.contains("object",Qt::CaseInsensitive) )
|
|
|
+ {
|
|
|
+ tr.object = json["object"].toString().toLocal8Bit().toStdString();
|
|
|
+ }
|
|
|
if( keys.contains("Operator",Qt::CaseInsensitive) )
|
|
|
{
|
|
|
double dbOperator1 = 0;
|
|
@@ -97,90 +97,115 @@ void Module::Setup(ModuleInfo mi)
|
|
|
{
|
|
|
tr.dbMin = dbOperator1;
|
|
|
}
|
|
|
- m_mpRangeConfig["topic_" + itr->Name] = tr;
|
|
|
+ m_mpRangeConfig[tr.szName.toLocal8Bit().toStdString()] = tr;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void Module::OnSubData(std::string name,std::string val)
|
|
|
+void Module::OnSubData(std::string table,std::string val)
|
|
|
{
|
|
|
- if( m_mpRangeConfig.find(name) == m_mpRangeConfig.end())
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if( val.find(' ') != std::string::npos )
|
|
|
- {
|
|
|
- std::vector<std::string> dest;
|
|
|
- split(val," ",dest);
|
|
|
- val = *dest.rbegin();
|
|
|
- }
|
|
|
- uint nMaxWinSize = m_mpRangeConfig[name].uWinSize;
|
|
|
- if( nMaxWinSize <= 0 )
|
|
|
- {
|
|
|
- nMaxWinSize = 1;
|
|
|
- }
|
|
|
-
|
|
|
- // add data
|
|
|
- m_objDataLock.lockForWrite();
|
|
|
- if( m_mpDataValue.find(name) == m_mpDataValue.end())
|
|
|
- {
|
|
|
- m_mpDataValue[name].push_back(tagKeyValue(name,val.length()>0 ? std::stod(val):0));
|
|
|
- }
|
|
|
- else
|
|
|
+ // iterate data
|
|
|
+ QJsonParseError err;
|
|
|
+ QJsonDocument jsonDoc(QJsonDocument::fromJson(val.c_str(),&err));
|
|
|
+ QJsonObject jsonObject = jsonDoc.object();
|
|
|
+ QStringList keys = jsonObject.keys();
|
|
|
+ foreach(QString dn,keys)
|
|
|
{
|
|
|
- while( m_mpDataValue[name].size() >= nMaxWinSize)
|
|
|
+ double dbDataValue = jsonObject[dn].toDouble();
|
|
|
+ std::string szDataName = dn.toLocal8Bit().toStdString();
|
|
|
+ // has table
|
|
|
+ if( m_mpRangeConfig.find(szDataName) == m_mpRangeConfig.end())
|
|
|
{
|
|
|
- m_mpDataValue[name].erase(m_mpDataValue[name].begin());
|
|
|
+ continue;
|
|
|
}
|
|
|
- m_mpDataValue[name].push_back(tagKeyValue(name,val.length()>0 ? std::stod(val):0));
|
|
|
- }
|
|
|
|
|
|
- // alarm recognition
|
|
|
- m_mpRangeConfig[name].nStatus = EAS_Both;
|
|
|
- std::list<tagKeyValue>::iterator itrV;
|
|
|
- for( itrV = m_mpDataValue[name].begin(); itrV != m_mpDataValue[name].end(); ++itrV)
|
|
|
- {
|
|
|
- tagKeyValue tKV = *itrV;
|
|
|
-
|
|
|
- if( itrV->value > m_mpRangeConfig[name].dbMax )
|
|
|
- {
|
|
|
- m_mpRangeConfig[name].nStatus &= 0x01;
|
|
|
- }
|
|
|
- else if( itrV->value < m_mpRangeConfig[name].dbMin )
|
|
|
+ // cache data
|
|
|
+ m_objDataLock.lockForWrite();
|
|
|
+ tagKeyValue kv(szDataName,dbDataValue);
|
|
|
+ if( m_mpDataValue.find(szDataName) == m_mpDataValue.end())
|
|
|
{
|
|
|
- m_mpRangeConfig[name].nStatus &= 0x02;
|
|
|
+ m_mpDataValue[szDataName].push_back(kv);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- m_mpRangeConfig[name].nStatus = EAS_Normal;
|
|
|
+ // win size
|
|
|
+ uint nMaxWinSize = m_mpRangeConfig[szDataName].uWinSize;
|
|
|
+ if( nMaxWinSize <= 0 )
|
|
|
+ {
|
|
|
+ nMaxWinSize = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ while( m_mpDataValue[szDataName].size() >= nMaxWinSize)
|
|
|
+ {
|
|
|
+ m_mpDataValue[szDataName].erase(m_mpDataValue[szDataName].begin());
|
|
|
+ }
|
|
|
+ m_mpDataValue[szDataName].push_back(kv);
|
|
|
}
|
|
|
+ m_objDataLock.unlock();
|
|
|
}
|
|
|
- m_objDataLock.unlock();
|
|
|
|
|
|
- //qDebug() << __FILE__ << __LINE__ << name.c_str() << m_mpRangeConfig[name].nStatus;
|
|
|
- std::vector<std::string>::iterator itr;
|
|
|
- for( itr = m_szOutputs.begin(); itr != m_szOutputs.end(); ++itr )
|
|
|
+ // alarm recognition
|
|
|
+ m_objDataLock.lockForRead();
|
|
|
+ std::map<std::string,std::list<tagKeyValue>>::iterator itr;
|
|
|
+ for( itr = m_mpDataValue.begin(); itr != m_mpDataValue.end(); ++itr )
|
|
|
{
|
|
|
- QString szStatus;
|
|
|
- switch( m_mpRangeConfig[name].nStatus )
|
|
|
+ std::string szDataName = itr->first;
|
|
|
+
|
|
|
+ m_mpRangeConfig[szDataName].nStatus = EAS_Normal;
|
|
|
+ std::list<tagKeyValue>::iterator itrV;
|
|
|
+ for( itrV = m_mpDataValue[szDataName].begin(); itrV != m_mpDataValue[szDataName].end(); ++itrV)
|
|
|
{
|
|
|
- case EAS_Normal:
|
|
|
- szStatus = "Normal";
|
|
|
- break;
|
|
|
- case EAS_OverThan:
|
|
|
- szStatus = "OverThan";
|
|
|
- break;
|
|
|
- case EAS_UnderThan:
|
|
|
- szStatus = "OverThan";
|
|
|
- break;
|
|
|
- case EAS_Both:
|
|
|
- szStatus = "Both";
|
|
|
- break;
|
|
|
+ tagKeyValue tKV = *itrV;
|
|
|
+
|
|
|
+ if( itrV->value > m_mpRangeConfig[szDataName].dbMax )
|
|
|
+ {
|
|
|
+ m_mpRangeConfig[szDataName].nStatus |= 0x01;
|
|
|
+ }
|
|
|
+ else if( itrV->value < m_mpRangeConfig[szDataName].dbMin )
|
|
|
+ {
|
|
|
+ m_mpRangeConfig[szDataName].nStatus |= 0x02;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_mpRangeConfig[szDataName].nStatus = EAS_Normal;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- m_pDataConsumer->OnData(*itr,QVariant(szStatus));
|
|
|
+ //qDebug() << __FILE__ << __LINE__ << name.c_str() << m_mpRangeConfig[name].nStatus;
|
|
|
+ std::vector<std::string>::iterator itr;
|
|
|
+ for( itr = m_szOutputs.begin(); itr != m_szOutputs.end(); ++itr )
|
|
|
+ {
|
|
|
+ QString szStatus;
|
|
|
+ switch( m_mpRangeConfig[szDataName].nStatus )
|
|
|
+ {
|
|
|
+ case EAS_Normal:
|
|
|
+ szStatus = "[]";
|
|
|
+ break;
|
|
|
+ case EAS_OverThan:
|
|
|
+ szStatus = ">";
|
|
|
+ break;
|
|
|
+ case EAS_UnderThan:
|
|
|
+ szStatus = "<";
|
|
|
+ break;
|
|
|
+ case EAS_Both:
|
|
|
+ szStatus = "><";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ QString szJson;
|
|
|
+ szJson += "{";
|
|
|
+ szJson += QString("\"occurTime\":\"%1\",").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss:zzz"));
|
|
|
+ szJson += QString("\"status\":%1,").arg(m_mpRangeConfig[szDataName].status);
|
|
|
+ szJson += QString("\"content\":\"%1 %2\",").arg(szDataName.c_str()).arg(szStatus);
|
|
|
+ szJson += QString("\"alarmRuleId\":\"%1\",").arg(m_mpRangeConfig[szDataName].alarmRuleId.c_str());
|
|
|
+ szJson += QString("\"alarmRuleVersion\":%1,").arg(m_mpRangeConfig[szDataName].alarmRuleVersion);
|
|
|
+ szJson += QString("\"level\":%1,").arg(m_mpRangeConfig[szDataName].level);
|
|
|
+ szJson += QString("\"object\":\"%1\"").arg(m_mpRangeConfig[szDataName].object.c_str());
|
|
|
+ szJson += "}";
|
|
|
+ m_pDataConsumer->OnData(*itr,QVariant(szJson));
|
|
|
+ }
|
|
|
}
|
|
|
+ m_objDataLock.unlock();
|
|
|
}
|
|
|
|
|
|
BaseModule* instance()
|