Module.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "Module.h"
  2. #include <QJsonArray>
  3. #include <QJsonObject>
  4. #include <QJsonDocument>
  5. #include <QtCore/QVariant>
  6. #include <QtCore/QDebug>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. void split(const std::string source,const std::string delim,std::vector<std::string>& dest)
  10. {
  11. long n = delim.length();
  12. long lt = source.length();
  13. long last = 0;
  14. size_t index = source.find_first_of(delim,last);
  15. while(index != std::string::npos)
  16. {
  17. dest.push_back(source.substr(last,index-last));
  18. last = index + n;
  19. index = source.find_first_of(delim,last);
  20. }
  21. long len = source.length();
  22. if( len - last > 0)
  23. {
  24. dest.push_back(source.substr(last,len - last));
  25. }
  26. }
  27. Module::Module()
  28. :BaseModule()
  29. {
  30. m_pDataConsumer = nullptr;
  31. m_szOutputs.clear();
  32. m_mpRangeConfig.clear();
  33. m_mpDataValue.clear();
  34. }
  35. bool Module::isInheritedFrom(std::string tp)
  36. {
  37. bool bEqual = (strcasecmp(tp.c_str(), "BaseModule") == 0);
  38. return bEqual;
  39. }
  40. void Module::regConsumer(DataConsumer* pDC)
  41. {
  42. m_pDataConsumer = pDC;
  43. }
  44. void Module::Setup(ModuleInfo mi)
  45. {
  46. std::list<DataItem>::iterator itrO;
  47. for( itrO = mi.Properties.begin(); itrO != mi.Properties.end(); ++itrO )
  48. {
  49. m_szOutputs.push_back(mi.Code + "." + itrO->Code);
  50. }
  51. std::vector<Setting>::iterator itr;
  52. for( itr = mi.vSettings.begin(); itr != mi.vSettings.end(); ++itr )
  53. {
  54. QJsonDocument jsonDoc(QJsonDocument::fromJson(itr->qValue.toString().toLocal8Bit().toStdString().c_str()));
  55. QJsonObject json = jsonDoc.object();
  56. QStringList keys = json.keys();
  57. tagRange tr;
  58. if( keys.contains("KeepTimes",Qt::CaseInsensitive) )
  59. {
  60. tr.uWinSize = abs(json["KeepTimes"].toInt());
  61. }
  62. if( keys.contains("Operator",Qt::CaseInsensitive) )
  63. {
  64. double dbOperator1 = 0;
  65. if( keys.contains("Operator1",Qt::CaseInsensitive) )
  66. {
  67. dbOperator1 = json["Operator1"].toDouble();
  68. }
  69. double dbOperator2 = 0;
  70. if( keys.contains("Operator2",Qt::CaseInsensitive) )
  71. {
  72. dbOperator2 = json["Operator2"].toDouble();
  73. }
  74. std::string szOp = json["Operator"].toString().toLocal8Bit().toStdString();
  75. if( strcasecmp(szOp.c_str(), "range") == 0)
  76. {
  77. tr.dbMin = dbOperator1;
  78. tr.dbMax = dbOperator2;
  79. }
  80. else if( strcasecmp(szOp.c_str(), "above") == 0)
  81. {
  82. tr.dbMax = dbOperator1;
  83. }
  84. else if( strcasecmp(szOp.c_str(), "below") == 0)
  85. {
  86. tr.dbMin = dbOperator1;
  87. }
  88. m_mpRangeConfig["topic_" + itr->Name] = tr;
  89. }
  90. }
  91. }
  92. void Module::OnSubData(std::string name,std::string val)
  93. {
  94. if( m_mpRangeConfig.find(name) == m_mpRangeConfig.end())
  95. {
  96. return;
  97. }
  98. if( val.find(' ') != std::string::npos )
  99. {
  100. std::vector<std::string> dest;
  101. split(val," ",dest);
  102. val = *dest.rbegin();
  103. }
  104. uint nMaxWinSize = m_mpRangeConfig[name].uWinSize;
  105. if( nMaxWinSize <= 0 )
  106. {
  107. nMaxWinSize = 1;
  108. }
  109. // add data
  110. m_objDataLock.lockForWrite();
  111. if( m_mpDataValue.find(name) == m_mpDataValue.end())
  112. {
  113. m_mpDataValue[name].push_back(tagKeyValue(name,val.length()>0 ? std::stod(val):0));
  114. }
  115. else
  116. {
  117. while( m_mpDataValue[name].size() >= nMaxWinSize)
  118. {
  119. m_mpDataValue[name].erase(m_mpDataValue[name].begin());
  120. }
  121. m_mpDataValue[name].push_back(tagKeyValue(name,val.length()>0 ? std::stod(val):0));
  122. }
  123. // alarm recognition
  124. m_mpRangeConfig[name].nStatus = EAS_Both;
  125. std::list<tagKeyValue>::iterator itrV;
  126. for( itrV = m_mpDataValue[name].begin(); itrV != m_mpDataValue[name].end(); ++itrV)
  127. {
  128. tagKeyValue tKV = *itrV;
  129. if( itrV->value > m_mpRangeConfig[name].dbMax )
  130. {
  131. m_mpRangeConfig[name].nStatus &= 0x01;
  132. }
  133. else if( itrV->value < m_mpRangeConfig[name].dbMin )
  134. {
  135. m_mpRangeConfig[name].nStatus &= 0x02;
  136. }
  137. else
  138. {
  139. m_mpRangeConfig[name].nStatus = EAS_Normal;
  140. }
  141. }
  142. m_objDataLock.unlock();
  143. //qDebug() << __FILE__ << __LINE__ << name.c_str() << m_mpRangeConfig[name].nStatus;
  144. std::vector<std::string>::iterator itr;
  145. for( itr = m_szOutputs.begin(); itr != m_szOutputs.end(); ++itr )
  146. {
  147. m_pDataConsumer->OnData(*itr,QVariant(m_mpRangeConfig[name].nStatus));
  148. }
  149. }
  150. BaseModule* instance()
  151. {
  152. return new Module();
  153. }
  154. void destroy(BaseModule* pInstance)
  155. {
  156. if( pInstance )
  157. {
  158. delete pInstance;
  159. }
  160. }