From a14c8cb51345fa3342addde7fa584465c4bc7083 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 09 十二月 2024 17:58:17 +0800
Subject: [PATCH] 1.加入GDI+ 2.警告信息获取;
---
SourceCode/Bond/BondEq/AlarmMonitor.cpp | 207 ++++++++++++++++++++++++++++++++++-----------------
1 files changed, 137 insertions(+), 70 deletions(-)
diff --git a/SourceCode/Bond/BondEq/AlarmMonitor.cpp b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
index edf375d..d53b6f7 100644
--- a/SourceCode/Bond/BondEq/AlarmMonitor.cpp
+++ b/SourceCode/Bond/BondEq/AlarmMonitor.cpp
@@ -3,20 +3,33 @@
#include "Common.h"
#include "CBonder.h"
#include "Log.h"
+#include "ToolUnits.h"
#define ALARM_MAX 200
CAlarmMonitor::CAlarmMonitor()
{
- m_nBeginAddr = 0;
- m_nLastId = 0;
- m_nLastLevel = 0;
+ m_pRawData = new char[200];
+ memset(m_pRawData, 0, 200);
}
CAlarmMonitor::~CAlarmMonitor()
{
+ if (m_pRawData != nullptr) {
+ delete[] m_pRawData;
+ m_pRawData = nullptr;
+ }
+ for (auto item : m_mapAlarmTemplate) {
+ delete item.second;
+ }
+ m_mapAlarmTemplate.clear();
+
+ for (auto item : m_mapAlarming) {
+ item.second->release();
+ }
+ m_mapAlarming.clear();
}
std::string& CAlarmMonitor::getClassName()
@@ -33,13 +46,59 @@
void CAlarmMonitor::onData(int id, const void* pData, int size)
{
const char* pszData = (const char*)pData;
- if (m_nIndex + 1 == id) {
- int addr = m_nBeginAddr * 2;
- int alarmId = (pszData[addr] & 0xff) | (pszData[addr + 1] & 0xff) << 8;
- int alarmLevel = (pszData[addr + 2] & 0xff) | (pszData[addr + 3] & 0xff) << 8;
- if (m_nLastId != alarmId) {
- LOGI("<CAlarmMonitor-%d>AlarmId:%d, AlarmLevel:%d", m_nIndex, alarmId, alarmLevel);
- Alarm(alarmId, alarmLevel);
+ if (MONITOR_ID_ALARM != id) {
+ return;
+ }
+
+ // 比较有没有变化
+ if (compareData(m_pRawData, (const char*)pData, size)) {
+ return;
+ }
+ memcpy(m_pRawData, (const char*)pData, size);
+
+
+ // 找到On的报警并缓存
+ std::vector<int> alarmIds;
+ for (auto item : m_mapAlarmTemplate) {
+ if (isAlarmOn(item.first)) {
+ alarmIds.push_back(item.first);
+ }
+ }
+
+
+ // 发生警告:
+ // 比较新加的ON的警告
+ // 即m_mapAlarming无,alarmIds有
+ for (auto item : alarmIds) {
+ if (m_mapAlarming.find(item) == m_mapAlarming.end()) {
+ auto iter = m_mapAlarmTemplate.find(item);
+ if (iter != m_mapAlarmTemplate.end()) {
+ CAlarm* pAlarm = new CAlarm(iter->second);
+ pAlarm->alarmOn();
+ pAlarm->addRef();
+ m_mapAlarming[item] = pAlarm;
+ LOGE("发生了警告:%s", pAlarm->toString().c_str());
+
+ // 警告信息发出,以使界面显示和历史记录保存
+ SendBroadcast(&CIntent(BC_CODE_ALARM_ON, "", pAlarm));
+ }
+ }
+ }
+
+ // 削除警告:
+ // 比较得到原来ON(m_mapAlarming有), 现在OFF的警告(alarmIds无)
+ for (auto iter = m_mapAlarming.begin(); iter != m_mapAlarming.end();/* iter++*/) {
+ if (!findAlarm(alarmIds, iter->first)) {
+ // 消除警告, 同时将信息发出,以使界面显示和历史记录保存
+ iter->second->alarmOff();
+ LOGE("消除了警告:%s", iter->second->toString().c_str());
+ SendBroadcast(&CIntent(BC_CODE_ALARM_OFF, "", iter->second));
+
+ iter->second->release();
+ m_mapAlarming.erase(iter++);
+ }
+ else {
+ iter++;
}
}
}
@@ -51,20 +110,29 @@
return -1;
}
- CString strLine, strNumber, strDescription;
+ CString strLine, strNumber, strLevel, strDescription;
+ int number, level;
while (file.ReadString(strLine)) {
- int index = strLine.Find(",");
- if (index <= 0) continue;
+ if (!AfxExtractSubString(strNumber, (LPCTSTR)strLine, 0, ','))
+ continue;
+ if (!AfxExtractSubString(strLevel, (LPCTSTR)strLine, 1, ','))
+ continue;
+ if (!AfxExtractSubString(strDescription, (LPCTSTR)strLine, 2, ','))
+ continue;
- strNumber = strLine.Left(index).Trim();
- strDescription = strLine.Right(strLine.GetLength() - index - 1).Trim();
+ try {
+ number = std::stoi((LPTSTR)(LPCTSTR)strNumber);
+ level = std::stoi((LPTSTR)(LPCTSTR)strLevel);
+ }
+ catch (...) {
+ continue;
+ }
- int number = atoi(strNumber);
- m_mapAlarmText[number] = std::string((LPTSTR)(LPCTSTR)strDescription);
+ addAlarmTemplate(number, level, (LPTSTR)(LPCTSTR)strDescription);
}
file.Close();
- return (int)m_mapAlarmText.size();
+ return (int)m_mapAlarmTemplate.size();
}
void CAlarmMonitor::init()
@@ -74,14 +142,7 @@
void CAlarmMonitor::term()
{
- for (auto item : m_alarms) {
- item->release();
- }
-}
-void CAlarmMonitor::setBeginAddr(int nAddr)
-{
- m_nBeginAddr = nAddr;
}
void CAlarmMonitor::OnTimer(UINT nTimerid)
@@ -91,43 +152,14 @@
const char* CAlarmMonitor::getAlarmText(int nID)
{
- auto iter = m_mapAlarmText.find(nID);
- if (iter == m_mapAlarmText.end()) return "";
-
- return iter->second.c_str();
-}
-
-void CAlarmMonitor::Alarm(int id, int level)
-{
- BEQ::IUnit* pUnit = m_pBonder->getUnit(m_nIndex);
- ASSERT(pUnit);
-
- if (id != 0) {
- // 警告
- pUnit->setAlarm(id, level, getAlarmText(id));
- LOGI("<CAlarmMonitor-%d>设备告警(%d, %d).", m_nIndex, id, level);
-
- CAlarm* pAlarm = new CAlarm(m_nIndex, 1, id, level, getAlarmText(id));
- AddAlarm(pAlarm);
- SendBroadcast(&CIntent(BC_CODE_ALARM_EVENT, "", pAlarm));
- m_nLastId = id;
- m_nLastLevel = level;
- }
- else {
- // 解除警告
- pUnit->setAlarm(0, 0, "");
- LOGI("<CAlarmMonitor-%d>解除设备告警(%d, %d).", m_nIndex, m_nLastId, m_nLastLevel);
-
- CAlarm* pAlarm = new CAlarm(m_nIndex, 2, m_nLastId, m_nLastLevel, getAlarmText(m_nLastId));
- AddAlarm(pAlarm);
- SendBroadcast(&CIntent(BC_CODE_ALARM_EVENT, "", pAlarm));
- m_nLastId = 0;
- m_nLastLevel = 0;
- }
+ auto iter = m_mapAlarmTemplate.find(nID);
+ if (iter == m_mapAlarmTemplate.end()) return "";
+ return iter->second->getText().c_str();
}
void CAlarmMonitor::Serialize(CArchive& ar)
{
+ /*
if (ar.IsStoring())
{
Lock();
@@ -153,24 +185,59 @@
}
Unlock();
}
+ */
}
-void CAlarmMonitor::AddAlarm(CAlarm* pAlarm)
+void CAlarmMonitor::getAlarmingMap(std::map<int, CAlarm*>& alarms)
{
Lock();
- pAlarm->addRef();
- m_alarms.push_back(pAlarm);
- if (m_alarms.size() > ALARM_MAX) {
- CAlarm* pTemp = m_alarms.front();
- pTemp->release();
- m_alarms.pop_front();
+ alarms = m_mapAlarming;
+ Unlock();
+}
+
+BOOL CAlarmMonitor::isAlarming()
+{
+ Lock();
+ BOOL bAlarming = !m_mapAlarming.empty();
+ Unlock();
+ return bAlarming;
+}
+
+BOOL CAlarmMonitor::compareData(const char* pScrData, const char* pTarData, int len)
+{
+ for (int i = 0; i < len; i++) {
+ if (pScrData[i] != pTarData[i]) {
+ return FALSE;
+ }
}
- Unlock();
+
+ return TRUE;
}
-void CAlarmMonitor::getAlarmList(std::list<CAlarm*>& list)
+int CAlarmMonitor::addAlarmTemplate(int id, int level, const char* pszDescription)
{
- Lock();
- list = m_alarms;
- Unlock();
+ auto iter = m_mapAlarmTemplate.find(id);
+ if (iter != m_mapAlarmTemplate.end()) return -1;
+
+ CAlarm* pAlarm = new CAlarm(id, level, pszDescription);
+ m_mapAlarmTemplate[id] = pAlarm;
+ return 0;
+}
+
+BOOL CAlarmMonitor::isAlarmOn(int id)
+{
+ int byteIndex, bitIndex;
+ byteIndex = (id - 1) / 8;
+ bitIndex = (id - 1) % 8;
+
+ return CToolUnits::getBit(m_pRawData[byteIndex], bitIndex);
+}
+
+BOOL CAlarmMonitor::findAlarm(std::vector<int>& ids, int id)
+{
+ for (auto item : ids) {
+ if (item == id) return TRUE;
+ }
+
+ return FALSE;
}
\ No newline at end of file
--
Gitblit v1.9.3