| 2026-01-21 | chenluhua1980 | ![]() |
| 2026-01-21 | chenluhua1980 | ![]() |
| 2026-01-21 | chenluhua1980 | ![]() |
| 2026-01-21 | chenluhua1980 | ![]() |
| 2026-01-21 | chenluhua1980 | ![]() |
| SourceCode/Bond/Servo/AlarmManager.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/AlarmManager.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/AlarmPopupDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/AlarmPopupDlg.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMaster.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMyStatusbar.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/CMyStatusbar.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Common.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.rc | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.vcxproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.vcxproj.filters | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/resource.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/Servo/AlarmManager.cpp
@@ -1,6 +1,7 @@ #include "stdafx.h" #include "stdafx.h" #include "Common.h" #include "AlarmManager.h" #include "Log.h" #include <sstream> #include <fstream> #include <iostream> @@ -8,25 +9,26 @@ #include <ctime> #include <iomanip> #include <random> #include <chrono> // 常é // 常é const std::string DATABASE_FILE = R"(AlarmManager.db)"; // éææååå§å // éææååå§å std::mutex AlarmManager::m_mutex; // è·ååä¾å®ä¾ // è·ååä¾å®ä¾ AlarmManager& AlarmManager::getInstance() { static AlarmManager instance; return instance; } // æé 彿° // æé 彿° AlarmManager::AlarmManager() { m_pDB = new BL::SQLiteDatabase(); } // ææå½æ° // ææå½æ° AlarmManager::~AlarmManager() { if (m_pDB != nullptr) { delete m_pDB; @@ -34,7 +36,7 @@ } } // åå§åæ¥è¦è¡¨ // åå§åæ¥è¦è¡¨ bool AlarmManager::initAlarmTable() { char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); @@ -49,7 +51,7 @@ throw std::runtime_error("Failed to connect to database."); } // å建设å¤è¡¨ // å建设å¤è¡¨ const std::string createDevicesTableQuery = R"( CREATE TABLE IF NOT EXISTS devices ( device_id TEXT PRIMARY KEY NOT NULL, @@ -60,7 +62,7 @@ return false; } // å建åå 表ï¼è®¾å¤IDååå IDç»åä½ä¸ºä¸»é® // å建åå 表ï¼è®¾å¤IDååå IDç»åä½ä¸ºä¸»é® const std::string createUnitsTableQuery = R"( CREATE TABLE IF NOT EXISTS units ( device_id TEXT NOT NULL, @@ -74,7 +76,7 @@ return false; } // å建æ¥è¦è¡¨ï¼æ¥è¦è®°å½çalarm_event_idæ¯ä¸»é® // å建æ¥è¦è¡¨ï¼æ¥è¦è®°å½çalarm_event_idæ¯ä¸»é® const std::string createAlarmsTableQuery = R"( CREATE TABLE IF NOT EXISTS alarms ( alarm_event_id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -93,8 +95,9 @@ return false; } // 设å¤å表 (ID -> åç§°) // 设å¤å表 (ID -> åç§°) std::vector<std::pair<int, std::string>> devices = { {0, "Software"}, {EQ_ID_LOADPORT1, EQ_NAME_LOADPORT1}, {EQ_ID_LOADPORT2, EQ_NAME_LOADPORT2}, {EQ_ID_LOADPORT3, EQ_NAME_LOADPORT3}, @@ -113,12 +116,12 @@ {EQ_ID_OPERATOR_REMOVE, EQ_NAME_OPERATOR_REMOVE} }; // æå ¥ devices å对åºçé»è®¤ unit // æå ¥ devices å对åºçé»è®¤ unit for (const auto& dev : devices) { int nDeviceId = dev.first; const std::string& strDeviceName = dev.second; // æå ¥è®¾å¤ // æå ¥è®¾å¤ std::ostringstream ossDev; ossDev << "INSERT OR IGNORE INTO devices (device_id, device_name) VALUES(" << nDeviceId << ", '" << strDeviceName << "')"; @@ -126,7 +129,7 @@ return false; } // æå ¥é»è®¤åå (unit_id = 0, unit_name = device_name) // æå ¥é»è®¤åå (unit_id = 0, unit_name = device_name) std::ostringstream ossUnit; ossUnit << "INSERT OR IGNORE INTO units (device_id, unit_id, unit_name) VALUES(" << nDeviceId << ", 0, '" << strDeviceName << "')"; @@ -138,14 +141,14 @@ return true; } // 鿝æ¥è¦è¡¨ // 鿝æ¥è¦è¡¨ void AlarmManager::termAlarmTable() { if (m_pDB != nullptr) { m_pDB->disconnect(); } } // 鿝æ¥è¦è¡¨ // 鿝æ¥è¦è¡¨ bool AlarmManager::destroyAlarmTable() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); @@ -154,9 +157,9 @@ return m_pDB->executeQuery(dropTableQuery); } // æå ¥æ¨¡ææ°æ® // æå ¥æ¨¡ææ°æ® void AlarmManager::insertMockData() { // æå ¥è®¾å¤æ°æ® // æå ¥è®¾å¤æ°æ® for (int i = 1; i <= 3; ++i) { std::string deviceName = "Device" + std::to_string(i); std::stringstream query; @@ -166,7 +169,7 @@ } } // æå ¥åå æ°æ® // æå ¥åå æ°æ® for (int i = 1; i <= 3; ++i) { for (int j = 0; j <= 3; ++j) { int unitId = j; @@ -175,8 +178,8 @@ std::stringstream query; query << "INSERT INTO units (device_id, unit_id, unit_name) VALUES ('" << deviceId << "', '" // æå ¥è®¾å¤IDï¼ç¡®ä¿æ¯å符串 << unitId << "', '" // æå ¥åå IDï¼ç¡®ä¿æ¯å符串 << deviceId << "', '" // æå ¥è®¾å¤IDï¼ç¡®ä¿æ¯å符串 << unitId << "', '" // æå ¥åå IDï¼ç¡®ä¿æ¯å符串 << unitName << "');"; if (!m_pDB->executeQuery(query.str())) { @@ -186,7 +189,7 @@ } /* // åå§åéæºæ°çæå¨ // åå§åéæºæ°çæå¨ std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> deviceDis(1, 3); @@ -195,7 +198,7 @@ std::uniform_int_distribution<> severityDis(0, 3); std::vector<std::string> descriptions = { "Overheat", "Sensor failure", "Power outage" }; // æ¶é´ç¸å ³ // æ¶é´ç¸å ³ auto now = std::chrono::system_clock::now(); auto start_time = std::chrono::system_clock::to_time_t(now); auto end_time = std::chrono::system_clock::to_time_t(now + std::chrono::minutes(10)); @@ -205,13 +208,13 @@ localtime_s(&start_tm, &start_time); localtime_s(&end_tm, &end_time); // æå ¥æ¨¡ææ°æ® // æå ¥æ¨¡ææ°æ® for (int i = 0; i < 10; ++i) { int deviceId = deviceDis(gen); // éæºè®¾å¤ID int unitId = unitDis(gen); // éæºåå ID int errorCode = errorCodeDis(gen); // éæºé误ç int severityLevel = severityDis(gen); // éæºçææ¥è¦ç级 std::string description = descriptions[errorCodeDis(gen) % descriptions.size()]; // éæºæ¥è¦æè¿° int deviceId = deviceDis(gen); // éæºè®¾å¤ID int unitId = unitDis(gen); // éæºåå ID int errorCode = errorCodeDis(gen); // éæºé误ç int severityLevel = severityDis(gen); // éæºçææ¥è¦ç级 std::string description = descriptions[errorCodeDis(gen) % descriptions.size()]; // éæºæ¥è¦æè¿° std::stringstream query; query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) " @@ -226,38 +229,38 @@ */ } // æ·»å æ¥è¦ä¿¡æ¯ // æ·»å æ¥è¦ä¿¡æ¯ bool AlarmManager::addAlarm(const AlarmData& alarmData, int& alarmEventId) { if (!m_pDB) { return false; } #if 0 // å¼å§äºå¡ // å¼å§äºå¡ m_pDB->executeQuery("BEGIN TRANSACTION;"); // æå»ºæå ¥æ¥è¯¢ // æå»ºæå ¥æ¥è¯¢ std::ostringstream query; query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) VALUES (" << alarmData.nId << ", " // é误ç << alarmData.nSeverityLevel << ", " // æ¥è¦ç级 << alarmData.nDeviceId << ", " // 设å¤ID << alarmData.nUnitId << ", '" // åå ID << alarmData.strDescription << "', '" // æè¿° << alarmData.strStartTime << "', '" // å¼å§æ¶é´ << alarmData.strEndTime << "')"; // ç»ææ¶é´ << alarmData.nId << ", " // é误ç << alarmData.nSeverityLevel << ", " // æ¥è¦ç级 << alarmData.nDeviceId << ", " // 设å¤ID << alarmData.nUnitId << ", '" // åå ID << alarmData.strDescription << "', '" // æè¿° << alarmData.strStartTime << "', '" // å¼å§æ¶é´ << alarmData.strEndTime << "')"; // ç»ææ¶é´ // 使ç¨éä¿æ¤å¤çº¿ç¨å®å ¨ // 使ç¨éä¿æ¤å¤çº¿ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mutex); // æ§è¡æå ¥æ¥è¯¢ // æ§è¡æå ¥æ¥è¯¢ bool result = m_pDB->executeQuery(query.str()); if (result) { alarmEventId = getLastInsertId(); m_alarmCache[alarmEventId] = alarmData; } // æäº¤äºå¡ // æäº¤äºå¡ m_pDB->executeQuery("COMMIT;"); return result; @@ -273,23 +276,23 @@ } } // æå»ºæå ¥æ¥è¯¢å¹¶ä½¿ç¨ RETURNING è·åæå ¥åç alarm_event_id // æå»ºæå ¥æ¥è¯¢å¹¶ä½¿ç¨ RETURNING è·åæå ¥åç alarm_event_id std::ostringstream query; query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) " << "VALUES (" << alarmData.nId << ", " << alarmData.nSeverityLevel << ", " << alarmData.nDeviceId << ", " << alarmData.nUnitId << ", '" << alarmData.strDescription << "', '" << alarmData.strStartTime << "', '" << alarmData.strEndTime << "') RETURNING alarm_event_id;"; // 使ç¨éä¿æ¤å¤çº¿ç¨å®å ¨ // 使ç¨éä¿æ¤å¤çº¿ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mutex); // æ§è¡æ¥è¯¢å¹¶è·åç»æ // æ§è¡æ¥è¯¢å¹¶è·åç»æ auto results = m_pDB->fetchResults(query.str()); if (!results.empty() && !results[0].empty()) { try { // æåå¹¶è½¬æ¢ alarm_event_id // æåå¹¶è½¬æ¢ alarm_event_id alarmEventId = std::stoi(results[0][0]); // å°æå ¥çæ¥è¦æ°æ®æ·»å å°ç¼å // å°æå ¥çæ¥è¦æ°æ®æ·»å å°ç¼å m_mapCache[alarmEventId] = alarmData; return true; } @@ -303,13 +306,13 @@ #endif } // æ¥è¯¢æææ¥è¦æ°æ® // æ¥è¯¢æææ¥è¦æ°æ® std::vector<AlarmData> AlarmManager::getAllAlarms() { if (!m_pDB) { return {}; } // æ¥è¯¢æææ¥è¦æ°æ®ï¼å æ¬è®¾å¤åç§°ååå åç§°ï¼ // æ¥è¯¢æææ¥è¦æ°æ®ï¼å æ¬è®¾å¤åç§°ååå åç§°ï¼ const std::string query = R"( SELECT a.id, a.severity_level, a.device_id, a.unit_id, d.device_name, u.unit_name, a.description, a.start_time, a.end_time FROM alarms a @@ -319,19 +322,19 @@ auto results = m_pDB->fetchResults(query); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -339,7 +342,7 @@ return alarms; } // æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ // æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ std::vector<AlarmData> AlarmManager::getAlarmsById(const std::string& id) { if (!m_pDB) { return {}; @@ -355,19 +358,19 @@ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -375,7 +378,7 @@ return alarms; } // æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ // æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ std::vector<AlarmData> AlarmManager::getAlarmsByDescription(const std::string& description) { if (!m_pDB) { return {}; @@ -391,19 +394,19 @@ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -411,7 +414,7 @@ return alarms; } // æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ // æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ std::vector<AlarmData> AlarmManager::getAlarmsByTimeRange(const std::string& startTime, const std::string& endTime) { if (!m_pDB) { return {}; @@ -434,19 +437,19 @@ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -454,7 +457,7 @@ return alarms; } // æ ¹æ®IDãå¼å§æ¶é´åç»ææ¶é´æ¥è¯¢æ¥è¦ // æ ¹æ®IDãå¼å§æ¶é´åç»ææ¶é´æ¥è¯¢æ¥è¦ std::vector<AlarmData> AlarmManager::getAlarmsByIdAndTimeRange(const std::string& id, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { return {}; @@ -477,19 +480,19 @@ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -497,7 +500,7 @@ return alarms; } // å页æ¥è¯¢æ¥è¦æ°æ® // å页æ¥è¯¢æ¥è¦æ°æ® std::vector<AlarmData> AlarmManager::getAlarms(int startPosition, int count) { if (!m_pDB) { return {}; @@ -513,19 +516,19 @@ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -533,7 +536,86 @@ return alarms; } // çéæ¥è¦æ°æ® // è·åå½åæªç»æçæ¥è¦ï¼end_time 为空ï¼ï¼å¹¶å¯æ start_time æè¿ N å°æ¶è¿æ»¤ std::vector<AlarmData> AlarmManager::getActiveAlarms(int recentHours /*=12*/) { if (!m_pDB) { return {}; } // è®¡ç®æ¶é´éå¼ï¼å½åæ¶é´å recentHours std::string cutoffTime; if (recentHours > 0) { using namespace std::chrono; auto cutoff = system_clock::now() - hours(recentHours); std::time_t t = system_clock::to_time_t(cutoff); std::tm tm {}; localtime_s(&tm, &t); char buf[32] = { 0 }; std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); cutoffTime = buf; } std::ostringstream query; query << R"( SELECT a.id, a.severity_level, a.device_id, a.unit_id, d.device_name, u.unit_name, a.description, a.start_time, a.end_time FROM alarms a JOIN devices d ON a.device_id = d.device_id JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id WHERE a.end_time IS NULL OR a.end_time = '' )"; if (!cutoffTime.empty()) { query << " AND a.start_time >= '" << cutoffTime << "'"; } query << " ORDER BY a.start_time DESC"; auto lastErrStr = []() -> std::string { DWORD gle = GetLastError(); if (gle == 0) return {}; LPSTR buf = nullptr; size_t len = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, gle, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, nullptr); std::string s = (buf && len > 0) ? std::string(buf, len) : ""; if (buf) LocalFree(buf); return s; }; std::vector<std::vector<std::string>> results; try { results = m_pDB->fetchResults(query.str()); } catch (const std::exception& ex) { DWORD gle = GetLastError(); auto errStr = lastErrStr(); LOGE("<AlarmManager>getActiveAlarms failed: %s, GLE=%lu (%s)", ex.what(), gle, errStr.c_str()); return {}; } std::vector<AlarmData> alarms; auto toInt = [](const std::string& s) -> int { try { return std::stoi(s); } catch (...) { return 0; } }; for (const auto& row : results) { if (row.size() < 9) continue; AlarmData alarmData; alarmData.nId = toInt(row[0]); alarmData.nSeverityLevel = toInt(row[1]); alarmData.nDeviceId = toInt(row[2]); alarmData.nUnitId = toInt(row[3]); alarmData.strDeviceName = row[4]; alarmData.strUnitName = row[5]; alarmData.strDescription = row[6]; alarmData.strStartTime = row[7]; alarmData.strEndTime = row[8]; alarms.push_back(alarmData); } return alarms; } // çéæ¥è¦æ°æ® std::vector<AlarmData> AlarmManager::getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize) { if (!m_pDB) { return {}; @@ -547,7 +629,7 @@ JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id WHERE 1=1)"; // ç»ä¸å ³é®åæ¨¡ç³æ¥è¯¢ // ç»ä¸å ³é®åæ¨¡ç³æ¥è¯¢ if (!keyword.empty()) { query << " AND (" << "a.id LIKE '%" << keyword << "%' OR " @@ -557,7 +639,7 @@ << "a.description LIKE '%" << keyword << "%')"; } // æ¶é´æ¡ä»¶ // æ¶é´æ¡ä»¶ if (!startTime.empty()) { query << " AND a.start_time >= '" << startTime << "'"; } @@ -565,26 +647,26 @@ query << " AND a.end_time <= '" << endTime << "'"; } // å页设置 // å页设置 int nOffset = (pageNumber - 1) * pageSize; query << " ORDER BY a.start_time DESC LIMIT " << pageSize << " OFFSET " << nOffset; // æ¥è¯¢ // æ¥è¯¢ auto results = m_pDB->fetchResults(query.str()); // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ // éåæ¥è¯¢ç»æï¼å¡«å AlarmData ç»æä½ std::vector<AlarmData> alarms; for (const auto& row : results) { AlarmData alarmData; alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 (å符串) alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarmData.nId = std::stoi(row[0]); // é误ç alarmData.nSeverityLevel = std::stoi(row[1]); // æ¥è¦ç级 (å符串) alarmData.nDeviceId = std::stoi(row[2]); // 设å¤ID alarmData.nUnitId = std::stoi(row[3]); // åå ID alarmData.strDeviceName = row[4]; // 设å¤åç§° alarmData.strUnitName = row[5]; // åå åç§° alarmData.strDescription = row[6]; // æè¿° alarmData.strStartTime = row[7]; // å¼å§æ¶é´ alarmData.strEndTime = row[8]; // ç»ææ¶é´ alarms.push_back(alarmData); } @@ -592,7 +674,7 @@ return alarms; } // è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° // è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° int AlarmManager::getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { return 0; @@ -606,7 +688,7 @@ JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id WHERE 1=1)"; // ç»ä¸å ³é®åæ¨¡ç³æ¥è¯¢ // ç»ä¸å ³é®åæ¨¡ç³æ¥è¯¢ if (!keyword.empty()) { query << " AND (" << "a.id LIKE '%" << keyword << "%' OR " @@ -616,7 +698,7 @@ << "a.description LIKE '%" << keyword << "%')"; } // æ¶é´æ¡ä»¶ // æ¶é´æ¡ä»¶ if (!startTime.empty()) { query << " AND a.start_time >= '" << startTime << "'"; } @@ -628,7 +710,7 @@ return (!results.empty() && !results[0].empty()) ? std::stoi(results[0][0]) : 0; } // æ´æ°æ¥è¦çç»ææ¶é´ // æ´æ°æ¥è¦çç»ææ¶é´ bool AlarmManager::updateAlarmEndTime( const std::string& id, const std::string& severityLevel, @@ -642,7 +724,7 @@ return false; } // æ´æ°æ¥è¦ç»ææ¶é´ // æ´æ°æ¥è¦ç»ææ¶é´ std::ostringstream updateQuery; updateQuery << "UPDATE alarms SET end_time = '" << newEndTime << "'" << " WHERE id = '" << id << "'" @@ -655,7 +737,7 @@ return m_pDB->executeQuery(updateQuery.str()); } // æ¸ çæ§æ¥è¦æ°æ® // æ¸ çæ§æ¥è¦æ°æ® void AlarmManager::cleanOldAlarms(int daysToKeep, const std::string& deviceId, const std::string& unitId) { if (!m_pDB) { return; @@ -674,7 +756,7 @@ m_pDB->executeQuery(query.str()); } // éè¿è®¾å¤IDè·å设å¤åç§° // éè¿è®¾å¤IDè·å设å¤åç§° std::string AlarmManager::getDeviceNameById(int deviceId) { if (!m_pDB) { return ""; @@ -688,10 +770,10 @@ return ""; } return result[0][0]; // è¿åæ¥è¯¢å°ç设å¤åç§° return result[0][0]; // è¿åæ¥è¯¢å°ç设å¤åç§° } // éè¿è®¾å¤IDååå IDè·ååå åç§° // éè¿è®¾å¤IDååå IDè·ååå åç§° std::string AlarmManager::getUnitNameById(int deviceId, int unitId) { if (!m_pDB) { return ""; @@ -706,10 +788,10 @@ return ""; } return result[0][0]; // è¿åæ¥è¯¢å°çåå åç§° return result[0][0]; // è¿åæ¥è¯¢å°çåå åç§° } // è·åæè¿æå ¥ç alarm_event_id // è·åæè¿æå ¥ç alarm_event_id int AlarmManager::getLastInsertId() { std::string query = "SELECT last_insert_rowid();"; auto results = m_pDB->fetchResults(query); @@ -718,12 +800,12 @@ return -1; } // 仿¥è¯¢ç»æä¸è·åæåæå ¥ç ID // 仿¥è¯¢ç»æä¸è·åæåæå ¥ç ID int lastInsertId = std::stoi(results[0][0]); return lastInsertId; } // éè¿ alarm_event_id è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ // éè¿ alarm_event_id è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ bool AlarmManager::clearAlarmByEventId(int alarmEventId, const std::string& endTime) { if (!m_pDB) { return false; @@ -745,7 +827,7 @@ return result; } // éè¿å¤ä¸ªå±æ§æ¥æ¾å¹¶è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ // éè¿å¤ä¸ªå±æ§æ¥æ¾å¹¶è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ bool AlarmManager::clearAlarmByAttributes(int nId, int nDeviceId, int nUnitId, const std::string& endTime) { if (!m_pDB) { return false; @@ -753,7 +835,7 @@ std::lock_guard<std::mutex> lock(m_mutex); // å å¨ç¼å䏿¥æ¾å¹é ç alarm_event_id // å å¨ç¼å䏿¥æ¾å¹é ç alarm_event_id int alarmEventId = -1; for (AlarmDataMap::const_iterator it = m_mapCache.begin(); it != m_mapCache.end(); ++it) { const AlarmData& alarm = it->second; @@ -766,12 +848,32 @@ } } // å¦ææ²¡æ¾å°å¹é çè®°å½ï¼åç´æ¥è¿å false if (alarmEventId == -1) { return false; } // ç¼åæªå½ä¸æ¶ï¼ä»æ°æ®åºæ¥æ¾ä»æªç»æçè®°å½ï¼åææ°ä¸æ¡ï¼ if (alarmEventId == -1) { std::ostringstream querySel; querySel << "SELECT alarm_event_id FROM alarms WHERE " << "id = " << nId << " AND device_id = " << nDeviceId << " AND unit_id = " << nUnitId << " AND (end_time IS NULL OR end_time = '') " << "ORDER BY start_time DESC LIMIT 1;"; auto results = m_pDB->fetchResults(querySel.str()); if (!results.empty() && !results[0].empty()) { try { alarmEventId = std::stoi(results[0][0]); } catch (...) { alarmEventId = -1; } } } // æå»º SQL è¯å¥ï¼ä½¿ç¨æ¾å°ç alarm_event_id æ¥æ´æ°ç»ææ¶é´ // å¦ææ²¡æ¾å°å¹é çè®°å½ï¼åç´æ¥è¿å false if (alarmEventId == -1) { return false; } // æå»º SQL è¯å¥ï¼ä½¿ç¨æ¾å°ç alarm_event_id æ¥æ´æ°ç»ææ¶é´ std::ostringstream query; query << "UPDATE alarms SET end_time = '" << endTime << "' WHERE alarm_event_id = " << alarmEventId << ";"; bool result = m_pDB->executeQuery(query.str()); @@ -782,7 +884,7 @@ return result; } // è¯»åæ¥è¦æä»¶ // è¯»åæ¥è¦æä»¶ bool AlarmManager::readAlarmFile(const std::string& filename) { std::ifstream file(filename, std::ios::binary); if (!file.is_open()) { @@ -795,7 +897,7 @@ char ch; while (f.get(ch)) { if (ch == '\r') { // å¤ç \r\n æ åç¬ \r // å¤ç \r\n æ åç¬ \r if (f.peek() == '\n') f.get(); break; } @@ -850,19 +952,19 @@ return true; } // å°æ¥è¦æ°æ®ä¿åå°æä»¶ // å°æ¥è¦æ°æ®ä¿åå°æä»¶ bool AlarmManager::saveAlarmFile(const std::string& filename) { std::ofstream file(filename); if (!file.is_open()) { std::cerr << "æå¼æä»¶åå ¥å¤±è´¥!" << std::endl; std::cerr << "æå¼æä»¶åå ¥å¤±è´¥!" << std::endl; return false; } // åå ¥æ é¢è¡ // åå ¥æ é¢è¡ file << "No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description\n"; // åå ¥æ¥è¦æ°æ® // åå ¥æ¥è¦æ°æ® int nIndex = 1; for (const auto& pair : m_mapAlarm) { const AlarmInfo& alarm = pair.second; @@ -880,19 +982,19 @@ return true; } // éè¿ AlarmID æ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ // éè¿ AlarmID æ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ const AlarmInfo* AlarmManager::getAlarmInfoByID(int nAlarmID) const { auto it = m_mapAlarm.find(nAlarmID); if (it != m_mapAlarm.end()) { return &(it->second); } else { std::cerr << "æªæ¾å° AlarmID: " << nAlarmID << std::endl; std::cerr << "æªæ¾å° AlarmID: " << nAlarmID << std::endl; return nullptr; } } // éè¿å¤ä¸ª AlarmID æ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ // éè¿å¤ä¸ª AlarmID æ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ std::vector<AlarmInfo> AlarmManager::getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const { std::vector<AlarmInfo> alarms; @@ -902,7 +1004,7 @@ alarms.push_back(it->second); } else { std::cerr << "æªæ¾å° AlarmID: " << alarmID << std::endl; std::cerr << "æªæ¾å° AlarmID: " << alarmID << std::endl; } } SourceCode/Bond/Servo/AlarmManager.h
@@ -1,4 +1,4 @@ #ifndef ALARM_MANAGER_H #ifndef ALARM_MANAGER_H #define ALARM_MANAGER_H #include <string> @@ -18,15 +18,15 @@ }; struct AlarmData { int nId; // é误ç int nSeverityLevel; // æ¥è¦ç级 int nDeviceId; // 设å¤ID int nUnitId; // åå ID std::string strDeviceName; // 设å¤åç§° std::string strUnitName; // åå åç§° std::string strDescription; // æè¿° std::string strStartTime; // å¼å§æ¶é´ std::string strEndTime; // ç»ææ¶é´ int nId; // é误ç int nSeverityLevel; // æ¥è¦ç级 int nDeviceId; // 设å¤ID int nUnitId; // åå ID std::string strDeviceName; // 设å¤åç§° std::string strUnitName; // åå åç§° std::string strDescription; // æè¿° std::string strStartTime; // å¼å§æ¶é´ std::string strEndTime; // ç»ææ¶é´ }; using AlarmInfoMap = std::unordered_map<int, AlarmInfo>; @@ -35,116 +35,117 @@ class AlarmManager { public: /** * è·ååä¾å®ä¾ * @return AlarmManagerå®ä¾çå¼ç¨ * è·ååä¾å®ä¾ * @return AlarmManagerå®ä¾çå¼ç¨ */ static AlarmManager& getInstance(); /** * åå§åæ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * åå§åæ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool initAlarmTable(); /** * 鿝æ¥è¦è¡¨ * 鿝æ¥è¦è¡¨ */ void termAlarmTable(); /** * 鿝æ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * 鿝æ¥è¦è¡¨ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool destroyAlarmTable(); /** * æå ¥æ¨¡ææ°æ® * æå ¥æ¨¡ææ°æ® */ void insertMockData(); /** * æ·»å æ¥è¦ * @param alarmData æ¥è¦æ°æ®çç»æä½ * @param alarmEventId æè¿æå ¥ç alarm_event_id * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * æ·»å æ¥è¦ * @param alarmData æ¥è¦æ°æ®çç»æä½ * @param alarmEventId æè¿æå ¥ç alarm_event_id * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool addAlarm(const AlarmData& alarmData, int& alarmEventId); /** * æ¥è¯¢æææ¥è¦æ°æ® * @return å å«æææ¥è¦æ°æ®çç»æä½ * æ¥è¯¢æææ¥è¦æ°æ® * @return å å«æææ¥è¦æ°æ®çç»æä½ */ std::vector<AlarmData> getAllAlarms(); /** * æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @return å å«çéåæ¥è¦æ°æ®çç»æä½ * æ ¹æ®æ¥è¦IDæ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @return å å«çéåæ¥è¦æ°æ®çç»æä½ */ std::vector<AlarmData> getAlarmsById(const std::string& id); /** * æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ * @param description æ¥è¦æè¿°çç鿡件 * @return å å«çéåæ¥è¦æ°æ®çç»æä½ * æ ¹æ®æè¿°æ¥è¯¢æ¥è¦ * @param description æ¥è¦æè¿°çç鿡件 * @return å å«çéåæ¥è¦æ°æ®çç»æä½ */ std::vector<AlarmData> getAlarmsByDescription(const std::string& description); /** * æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® * æ ¹æ®æ¶é´èå´æ¥è¯¢æ¥è¦ * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® */ std::vector<AlarmData> getAlarmsByTimeRange(const std::string& startTime, const std::string& endTime); /** * æ ¹æ®IDåæ¶é´èå´æ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® * æ ¹æ®IDåæ¶é´èå´æ¥è¯¢æ¥è¦ * @param id æ¥è¦ID * @param startTime èµ·å§æ¶é´ * @param endTime ç»ææ¶é´ * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® */ std::vector<AlarmData> getAlarmsByIdAndTimeRange(const std::string& id, const std::string& startTime, const std::string& endTime); /** * è·åæ¥è¦æ°æ® * @param startPosition èµ·å§ä½ç½® * @param count è·åçè®°å½æ°é * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® * è·åæ¥è¦æ°æ® * @param startPosition èµ·å§ä½ç½® * @param count è·åçè®°å½æ°é * @return å 嫿¥è¯¢ç»æçæ¥è¦æ°æ® */ std::vector<AlarmData> getAlarms(int startPosition, int count); std::vector<AlarmData> getActiveAlarms(int recentHours = 12); /** * çéæ¥è¦æ°æ® * @param keyword å ³é®åç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @param pageNumber 页ç * @param pageSize æ¯é¡µè®°å½æ° * @return å å«çéåæ¥è¦æ°æ®çç»æä½ * çéæ¥è¦æ°æ® * @param keyword å ³é®åç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @param pageNumber 页ç * @param pageSize æ¯é¡µè®°å½æ° * @return å å«çéåæ¥è¦æ°æ®çç»æä½ */ std::vector<AlarmData> getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize); /** * è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° * @param keyword å ³é®åç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @return ç¬¦åæ¡ä»¶çæ¥è¦æ»æ° * è·åç¬¦åæ¡ä»¶çæ¥è¦æ»æ° * @param keyword å ³é®åç鿡件 * @param startTime èµ·å§æ¶é´ç鿡件 * @param endTime ç»ææ¶é´ç鿡件 * @return ç¬¦åæ¡ä»¶çæ¥è¦æ»æ° */ int getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime); /** * æ´æ°æ¥è¦ç»ææ¶é´ * @param id æ¥è¦ID * @param severityLevel æ¥è¦ç级ç鿡件 * @param deviceId 设å¤ID * @param unitId åå ID * @param description æ¥è¦æè¿° * @param startTime æ¥è¦å¼å§æ¶é´ * @param newEndTime æ°çæ¥è¦ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * æ´æ°æ¥è¦ç»ææ¶é´ * @param id æ¥è¦ID * @param severityLevel æ¥è¦ç级ç鿡件 * @param deviceId 设å¤ID * @param unitId åå ID * @param description æ¥è¦æè¿° * @param startTime æ¥è¦å¼å§æ¶é´ * @param newEndTime æ°çæ¥è¦ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool updateAlarmEndTime( const std::string& id, @@ -156,79 +157,79 @@ const std::string& newEndTime); /** * æ¸ çæ§æ¥è¦ * @param daysToKeep ä¿ççå¤©æ° * @param deviceId 设å¤ID * @param unitId åå ID * æ¸ çæ§æ¥è¦ * @param daysToKeep ä¿ççå¤©æ° * @param deviceId 设å¤ID * @param unitId åå ID */ void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceId = "", const std::string& unitId = ""); /** * éè¿è®¾å¤IDè·å设å¤åç§° * @param deviceId 设å¤ID * @return æåè¿å设å¤åç§°ï¼å¤±è´¥è¿å空 * éè¿è®¾å¤IDè·å设å¤åç§° * @param deviceId 设å¤ID * @return æåè¿å设å¤åç§°ï¼å¤±è´¥è¿å空 */ std::string getDeviceNameById(int deviceId); /** * éè¿è®¾å¤IDååå IDè·ååå åç§° * @param deviceId 设å¤ID * @param unitId åå ID * @return æåè¿ååå åç§°ï¼å¤±è´¥è¿å空 * éè¿è®¾å¤IDååå IDè·ååå åç§° * @param deviceId 设å¤ID * @param unitId åå ID * @return æåè¿ååå åç§°ï¼å¤±è´¥è¿å空 */ std::string getUnitNameById(int deviceId, int unitId); /** * è·åæè¿æå ¥ç alarm_event_id * @return 失败è¿å-1ï¼æåè¿åæè¿æå ¥ç alarm_event_id * è·åæè¿æå ¥ç alarm_event_id * @return 失败è¿å-1ï¼æåè¿åæè¿æå ¥ç alarm_event_id */ int getLastInsertId(); /** * éè¿äºä»¶idè§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ * @param alarmEventId äºä»¶ID * @param endTime ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * éè¿äºä»¶idè§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ * @param alarmEventId äºä»¶ID * @param endTime ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool clearAlarmByEventId(int alarmEventId, const std::string& endTime); /** * éè¿å¤ä¸ªå±æ§æ¥æ¾å¹¶è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ * @param nId æ¥è¦ID * @param nSeverityLevel æ¥è¦ç级 * @param nDeviceId 设å¤ID * @param nUnitId åå ID * @param strDescription æè¿° * @param endTime ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * éè¿å¤ä¸ªå±æ§æ¥æ¾å¹¶è§£é¤æ¥è¦ï¼æ´æ°ç»ææ¶é´ï¼ * @param nId æ¥è¦ID * @param nSeverityLevel æ¥è¦ç级 * @param nDeviceId 设å¤ID * @param nUnitId åå ID * @param strDescription æè¿° * @param endTime ç»ææ¶é´ * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool clearAlarmByAttributes(int nId, int nDeviceId, int nUnitId, const std::string& endTime); /** * è¯»åæ¥è¦æä»¶ * @param filename æä»¶å * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * è¯»åæ¥è¦æä»¶ * @param filename æä»¶å * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool readAlarmFile(const std::string& filename); /** * ä¿åæ¥è¦æä»¶ * @param filename æä»¶å * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse * ä¿åæ¥è¦æä»¶ * @param filename æä»¶å * @return æåè¿åtrueï¼å¤±è´¥è¿åfalse */ bool saveAlarmFile(const std::string& filename); /** * éè¿æ¥è¦IDæ¥è¯¢æ¥è¦ä¿¡æ¯ * @param nAlarmID æ¥è¦ID * @return æ¥è¦ä¿¡æ¯çæé * éè¿æ¥è¦IDæ¥è¯¢æ¥è¦ä¿¡æ¯ * @param nAlarmID æ¥è¦ID * @return æ¥è¦ä¿¡æ¯çæé */ const AlarmInfo* getAlarmInfoByID(int nAlarmID) const; /** * éè¿å¤ä¸ªæ¥è¦IDæ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ * @param alarmIDs å¤ä¸ªæ¥è¦ID * @return è¿åå¤ä¸ªæ¥è¦ä¿¡æ¯ * éè¿å¤ä¸ªæ¥è¦IDæ¥è¯¢å¯¹åºçæ¥è¦ä¿¡æ¯ * @param alarmIDs å¤ä¸ªæ¥è¦ID * @return è¿åå¤ä¸ªæ¥è¦ä¿¡æ¯ */ std::vector<AlarmInfo> getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const; @@ -236,7 +237,7 @@ AlarmManager(); ~AlarmManager(); // ç¦æ¢æ·è´åèµå¼ // ç¦æ¢æ·è´åèµå¼ AlarmManager(const AlarmManager&) = delete; AlarmManager& operator=(const AlarmManager&) = delete; SourceCode/Bond/Servo/AlarmPopupDlg.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,321 @@ #include "stdafx.h" #include "Servo.h" #include "AlarmPopupDlg.h" #include "afxdialogex.h" #include "Log.h" #include "Common.h" #include "HorizontalLine.h" #include "ServoDlg.h" IMPLEMENT_DYNAMIC(CAlarmPopupDlg, CDialogEx) CAlarmPopupDlg::CAlarmPopupDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_DIALOG_POPUP_ALARM, pParent) , m_hasActive(false) { memset(&m_activeAlarm, 0, sizeof(m_activeAlarm)); m_crBkgnd = RGB(112, 146, 190); m_hbrBkgnd = nullptr; } CAlarmPopupDlg::~CAlarmPopupDlg() { } void CAlarmPopupDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAlarmPopupDlg, CDialogEx) ON_BN_CLICKED(IDC_POPUP_BTN_CLOSE, &CAlarmPopupDlg::OnBnClickedClose) ON_BN_CLICKED(IDC_BUTTON_ALARM_OFF, &CAlarmPopupDlg::OnBnClickedAlarmOff) ON_BN_CLICKED(IDC_BUTTON_PREV, &CAlarmPopupDlg::OnBnClickedPrev) ON_BN_CLICKED(IDC_BUTTON_NEXT, &CAlarmPopupDlg::OnBnClickedNext) ON_WM_CTLCOLOR() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CAlarmPopupDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // èæ¯å· if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); // åä½ HFONT hFontDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT); LOGFONT lf; ::GetObject(hFontDefault, sizeof(LOGFONT), &lf); lf.lfHeight -= 8; lf.lfWeight = 700; m_fontTitle.CreateFontIndirect(&lf); ::GetObject(hFontDefault, sizeof(LOGFONT), &lf); lf.lfHeight -= 8; m_fontLevel.CreateFontIndirect(&lf); ::GetObject(hFontDefault, sizeof(LOGFONT), &lf); lf.lfHeight -= 16; m_fontName.CreateFontIndirect(&lf); ::GetObject(hFontDefault, sizeof(LOGFONT), &lf); lf.lfHeight -= 8; m_fontDescription.CreateFontIndirect(&lf); GetDlgItem(IDC_LABEL_TITLE)->SetFont(&m_fontTitle); GetDlgItem(IDC_LABEL_LEVEL)->SetFont(&m_fontLevel); GetDlgItem(IDC_LABEL_NAME)->SetFont(&m_fontName); GetDlgItem(IDC_LABEL_DESCRIPTION)->SetFont(&m_fontDescription); GetDlgItem(IDC_LABEL_NO_ALARM)->SetFont(&m_fontDescription); // 徿 CString strIcon1; HICON hIcon; CStatic* pStatic; strIcon1.Format(_T("%s\\Res\\Alarm_o_24.ico"), theApp.m_strAppDir); pStatic = (CStatic*)GetDlgItem(IDC_ICON_TITLE); hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), strIcon1, IMAGE_ICON, 24, 24, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); pStatic->SetIcon(hIcon); strIcon1.Format(_T("%s\\Res\\Alarm_o_64.ico"), theApp.m_strAppDir); pStatic = (CStatic*)GetDlgItem(IDC_ICON_ALARM); hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), strIcon1, IMAGE_ICON, 64, 64, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); pStatic->SetIcon(hIcon); // å ³éæé® strIcon1.Format(_T("%s\\Res\\close_blcak_24.ico"), theApp.m_strAppDir); pStatic = (CStatic*)GetDlgItem(IDC_ICON_ALARM); hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), strIcon1, IMAGE_ICON, 128, 128, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); m_btnClose.SubclassDlgItem(IDC_POPUP_BTN_CLOSE, this); m_btnClose.SetIcon(hIcon, hIcon, 24); m_btnClose.SetFaceColor(m_crBkgnd); m_btnClose.SetBkgndColor(BS_NORMAL, BTN_ALARM_OFF_BKGND_NORMAL); m_btnClose.SetBkgndColor(BS_HOVER, BTN_ALARM_OFF_BKGND_NORMAL); m_btnClose.SetBkgndColor(BS_PRESS, BTN_ALARM_OFF_BKGND_PRESS); m_btnClose.SetFrameColor(m_crBkgnd); // è§£é¤è¦åæé® m_btnAlarmOff.SubclassDlgItem(IDC_BUTTON_ALARM_OFF, this); m_btnAlarmOff.SetFrameColor(BS_NORMAL, BTN_ALARM_OFF_FRAME_NORMAL); m_btnAlarmOff.SetFrameColor(BS_HOVER, BTN_ALARM_OFF_FRAME_HOVER); m_btnAlarmOff.SetFrameColor(BS_PRESS, BTN_ALARM_OFF_FRAME_PRESS); m_btnAlarmOff.SetBkgndColor(BS_NORMAL, BTN_ALARM_OFF_BKGND_NORMAL); m_btnAlarmOff.SetBkgndColor(BS_HOVER, BTN_ALARM_OFF_BKGND_HOVER); m_btnAlarmOff.SetBkgndColor(BS_PRESS, BTN_ALARM_OFF_BKGND_PRESS); // éé³æé® bool bMute = false; m_btnSoundOff.SubclassDlgItem(IDC_BUTTON_SOUND_OFF, this); m_btnSoundOff.SetFrameColor(BS_NORMAL, BTN_SOUND_OFF_FRAME_NORMAL); m_btnSoundOff.SetFrameColor(BS_HOVER, BTN_SOUND_OFF_FRAME_HOVER); m_btnSoundOff.SetFrameColor(BS_PRESS, BTN_SOUND_OFF_FRAME_PRESS); SetButtonBackgroundColors(bMute); // 横线1 CHorizontalLine* pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE1)->m_hWnd); pLine->SetBkgndColor(m_crBkgnd); pLine->SetLineColor(RGB(168, 168, 168)); pLine = CHorizontalLine::Hook(GetDlgItem(IDC_LINE2)->m_hWnd); pLine->SetBkgndColor(m_crBkgnd); pLine->SetLineColor(RGB(168, 168, 168)); RefreshContent(); return TRUE; } void CAlarmPopupDlg::ShowNoAlarmControls(bool bShow) { const int ids[] = { IDC_LABEL_NO_ALARM }; for (int id : ids) { if (auto* p = GetDlgItem(id)) { p->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } } } void CAlarmPopupDlg::ShowAlarmControls(bool bShow) { const int ids[] = { IDC_BUTTON_PREV, IDC_BUTTON_NEXT, IDC_LABEL_TITLE, IDC_ICON_ALARM, IDC_ICON_TITLE, IDC_LABEL_LEVEL, IDC_LABEL_NAME, IDC_LINE1, IDC_BUTTON_SOUND_OFF, IDC_BUTTON_ALARM_OFF, IDC_LINE2, IDC_LABEL_DESCRIPTION }; for (int id : ids) { if (auto* p = GetDlgItem(id)) { p->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } } } void CAlarmPopupDlg::RefreshContent() { m_activeAlarms = AlarmManager::getInstance().getActiveAlarms(); m_activeIndex = 0; if (!m_activeAlarms.empty()) { m_hasActive = true; DisplayActiveAt(m_activeIndex); ShowAlarmControls(true); ShowNoAlarmControls(false); } else { m_hasActive = false; SetDlgItemText(IDC_LABEL_NO_ALARM, _T("å½åæ æ¥è¦")); SetDlgItemText(IDC_LABEL_NAME, _T("")); SetDlgItemText(IDC_LABEL_LEVEL, _T("")); SetDlgItemText(IDC_LABEL_DESCRIPTION, _T("")); ShowAlarmControls(false); ShowNoAlarmControls(true); } } void CAlarmPopupDlg::OnBnClickedClose() { ShowWindow(SW_HIDE); } void CAlarmPopupDlg::OnBnClickedAlarmOff() { if (!m_hasActive) return; AlarmManager& alarmManager = AlarmManager::getInstance(); alarmManager.clearAlarmByAttributes( m_activeAlarm.nId, m_activeAlarm.nDeviceId, m_activeAlarm.nUnitId, CToolUnits::getCurrentTimeString()); RefreshContent(); } void CAlarmPopupDlg::OnBnClickedPrev() { if (m_activeIndex > 0) { --m_activeIndex; DisplayActiveAt(m_activeIndex); } } void CAlarmPopupDlg::OnBnClickedNext() { if (m_activeIndex + 1 < static_cast<int>(m_activeAlarms.size())) { ++m_activeIndex; DisplayActiveAt(m_activeIndex); } } void CAlarmPopupDlg::DisplayActiveAt(int idx) { if (idx < 0 || idx >= static_cast<int>(m_activeAlarms.size())) return; m_activeAlarm = m_activeAlarms[idx]; // æ 记已读 if (auto* pParent = dynamic_cast<CServoDlg*>(GetParent())) { pParent->AckAlarm(m_activeAlarm.nId); } AlarmManager& alarmManager = AlarmManager::getInstance(); const AlarmInfo* info = alarmManager.getAlarmInfoByID(m_activeAlarm.nId); CString title, level, name, desc; level.Format(_T("ç级: %d"), m_activeAlarm.nSeverityLevel); if (info != nullptr && !info->strAlarmText.empty()) { name = CString(info->strAlarmText.c_str()); } else { name.Format(_T("ID:%d (%s)"), m_activeAlarm.nId, CString(m_activeAlarm.strDeviceName.c_str())); } if (!m_activeAlarm.strDescription.empty()) { desc = CString(m_activeAlarm.strDescription.c_str()); } else if (info != nullptr && !info->strDescription.empty()) { desc = CString(info->strDescription.c_str()); } else { desc = _T("ææ æè¿°"); } title.Format(_T("设å¤:%s åå :%s"), CString(m_activeAlarm.strDeviceName.c_str()), CString(m_activeAlarm.strUnitName.c_str())); SetDlgItemText(IDC_LABEL_TITLE, title); SetDlgItemText(IDC_LABEL_NAME, name); SetDlgItemText(IDC_LABEL_LEVEL, level); SetDlgItemText(IDC_LABEL_DESCRIPTION, desc); UpdateNavButtons(); ShowWindow(SW_SHOW); } void CAlarmPopupDlg::UpdateNavButtons() { auto* pPrev = GetDlgItem(IDC_BUTTON_PREV); auto* pNext = GetDlgItem(IDC_BUTTON_NEXT); if (pPrev) pPrev->EnableWindow(m_activeIndex > 0); if (pNext) pNext->EnableWindow(m_activeIndex + 1 < static_cast<int>(m_activeAlarms.size())); } HBRUSH CAlarmPopupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkColor(m_crBkgnd); pDC->SetTextColor(RGB(30, 30, 30)); hbr = m_hbrBkgnd; } else if (nCtlColor == CTLCOLOR_DLG) { hbr = m_hbrBkgnd; } return hbr; } void CAlarmPopupDlg::OnDestroy() { CDialogEx::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); m_hbrBkgnd = nullptr; } } void CAlarmPopupDlg::SetButtonBackgroundColors(bool bMute) { if (!bMute) { m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_OFF_BKGND_NORMAL); m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_OFF_BKGND_HOVER); m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_OFF_BKGND_PRESS); m_btnSoundOff.Invalidate(); } else { m_btnSoundOff.SetBkgndColor(BS_NORMAL, BTN_SOUND_ON_BKGND_NORMAL); m_btnSoundOff.SetBkgndColor(BS_HOVER, BTN_SOUND_ON_BKGND_HOVER); m_btnSoundOff.SetBkgndColor(BS_PRESS, BTN_SOUND_ON_BKGND_PRESS); m_btnSoundOff.Invalidate(); } } SourceCode/Bond/Servo/AlarmPopupDlg.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ #pragma once #include "afxwin.h" #include "AlarmManager.h" #include "Common.h" #include "ToolUnits.h" #include "BlButton.h" // ç®åçæ¥è¦å¼¹çªï¼å¯¹æ¥ AlarmManager çæ´»è·åè¦ class CAlarmPopupDlg : public CDialogEx { DECLARE_DYNAMIC(CAlarmPopupDlg) public: CAlarmPopupDlg(CWnd* pParent = NULL); virtual ~CAlarmPopupDlg(); public: void RefreshContent(); // å·æ°å½ååè¦æ¾ç¤º private: COLORREF m_crBkgnd; HBRUSH m_hbrBkgnd; CFont m_fontTitle; CFont m_fontLevel; CFont m_fontName; CFont m_fontDescription; CBlButton m_btnClose; CBlButton m_btnSoundOff; CBlButton m_btnAlarmOff; // å¯¹è¯æ¡æ°æ® #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DIALOG_POPUP_ALARM }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); afx_msg void OnDestroy(); afx_msg void OnBnClickedClose(); afx_msg void OnBnClickedAlarmOff(); afx_msg void OnBnClickedPrev(); afx_msg void OnBnClickedNext(); private: bool m_hasActive; AlarmData m_activeAlarm; std::vector<AlarmData> m_activeAlarms; int m_activeIndex = 0; void SetButtonBackgroundColors(bool bMute); void ShowNoAlarmControls(bool bShow); void ShowAlarmControls(bool bShow); void UpdateNavButtons(); void DisplayActiveAt(int idx); }; SourceCode/Bond/Servo/CMaster.cpp
@@ -153,132 +153,132 @@ LOGE("è¿æ¥CC-Link失败."); } else { LOGI("è¿æ¥CC-Linkæå."); BoardVersion version{}; int nRet = m_cclink.GetBoardVersion(version); if (nRet == 0) { LOGD("çæ¬ä¿¡æ¯ï¼%s.", version.toString().c_str()); } else { LOGE("è·åCC-Linkçæ¬ä¿¡æ¯å¤±è´¥."); } BoardStatus status; nRet = m_cclink.GetBoardStatus(status); if (nRet == 0) { LOGD("ç¶æï¼%s.", status.toString().c_str()); } else { LOGE("è·åCC-Linkç¶æå¤±è´¥."); } LOGI("è¿æ¥CC-Linkæå."); BoardVersion version{}; int nRet = m_cclink.GetBoardVersion(version); if (nRet == 0) { LOGD("çæ¬ä¿¡æ¯ï¼%s.", version.toString().c_str()); } else { LOGE("è·åCC-Linkçæ¬ä¿¡æ¯å¤±è´¥."); } // åå§åæ·»å ååè®¾å¤ CLoadPort* pPort1, * pPort2, * pPort3, * pPort4; CBonder* pBonder1, * pBonder2; CEFEM* pEfem; CArm* pArm; CArmTray* pArmTray1, * pArmTray2; CFliper* pFliper; CVacuumBake* pVacuumBake; CAligner* pAligner; CBakeCooling* pBakeCooling; CMeasurement* pMeasurement; pPort1 = addLoadPort(0); pPort2 = addLoadPort(1); pPort3 = addLoadPort(2); pPort4 = addLoadPort(3); pEfem = addEFEM(); pArm = addArm(); pArmTray1 = addArmTray(0); pArmTray2 = addArmTray(1); pFliper = addFliper(); pVacuumBake = addVacuumBake(); pAligner = addAligner(); pBonder1 = addBonder(0); pBonder2 = addBonder(1); pBakeCooling = addBakeCooling(); pMeasurement = addMeasurement(); ASSERT(pEfem); ASSERT(pFliper); ASSERT(pVacuumBake); ASSERT(pAligner); ASSERT(pBonder1); ASSERT(pBonder2); ASSERT(pBakeCooling); ASSERT(pMeasurement); pEfem->setPort(0, pPort1); pEfem->setPort(1, pPort2); pEfem->setPort(2, pPort3); pEfem->setPort(3, pPort4); pEfem->setFliper(pFliper); pEfem->setAligner(pAligner); pEfem->setArmTray(0, pArmTray1); pEfem->setArmTray(1, pArmTray2); pPort1->setArm(pArm); pPort2->setArm(pArm); pPort3->setArm(pArm); pPort4->setArm(pArm); pArmTray1->setArm(pArm); pArmTray2->setArm(pArm); pFliper->setArm(pArm); pVacuumBake->setArm(pArm); pAligner->setArm(pArm); pBonder1->setArm(pArm); pBonder2->setArm(pArm); pBakeCooling->setArm(pArm); pMeasurement->setArm(pArm); connectEquipments(); // 读ç¼åæ°æ® const ULONGLONG boot_cache_begin = GetTickCount64(); const ULONGLONG boot_read_begin = GetTickCount64(); readCache(); LOGI("[BOOT][MASTER] readCache finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_read_begin)); const ULONGLONG boot_state_begin = GetTickCount64(); loadState(); LOGI("[BOOT][MASTER] loadState finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_state_begin)); if (m_listener.onControlJobChanged) { notifyControlJobChanged(); BoardStatus status; nRet = m_cclink.GetBoardStatus(status); if (nRet == 0) { LOGD("ç¶æï¼%s.", status.toString().c_str()); } LOGI("[BOOT][MASTER] cache/state loaded, cost=%llu ms (since init %llu ms)", (unsigned long long)(GetTickCount64() - boot_cache_begin), (unsigned long long)(GetTickCount64() - boot_master_begin)); // 宿¶å¨ g_pMaster = this; SetTimer(NULL, 1, 250, (TIMERPROC)MasterTimerProc); // è°åº¦çº¿ç¨ m_hDispatchThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::DispatchThreadFunction, this, 0, &m_nDispatchThreadAddr); // çæ§bitçº¿ç¨ m_hReadBitsThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::ReadBitsThreadFunction, this, 0, &m_nReadBitsThreadAddr); // æ²çº¿æå¡ CreateDAQBridgeServer(); LOGI("<Master>åå§å宿."); LOGI("[BOOT][MASTER] init finished, total cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_master_begin)); return 0; else { LOGE("è·åCC-Linkç¶æå¤±è´¥."); } } // åå§åæ·»å ååè®¾å¤ CLoadPort* pPort1, * pPort2, * pPort3, * pPort4; CBonder* pBonder1, * pBonder2; CEFEM* pEfem; CArm* pArm; CArmTray* pArmTray1, * pArmTray2; CFliper* pFliper; CVacuumBake* pVacuumBake; CAligner* pAligner; CBakeCooling* pBakeCooling; CMeasurement* pMeasurement; pPort1 = addLoadPort(0); pPort2 = addLoadPort(1); pPort3 = addLoadPort(2); pPort4 = addLoadPort(3); pEfem = addEFEM(); pArm = addArm(); pArmTray1 = addArmTray(0); pArmTray2 = addArmTray(1); pFliper = addFliper(); pVacuumBake = addVacuumBake(); pAligner = addAligner(); pBonder1 = addBonder(0); pBonder2 = addBonder(1); pBakeCooling = addBakeCooling(); pMeasurement = addMeasurement(); ASSERT(pEfem); ASSERT(pFliper); ASSERT(pVacuumBake); ASSERT(pAligner); ASSERT(pBonder1); ASSERT(pBonder2); ASSERT(pBakeCooling); ASSERT(pMeasurement); pEfem->setPort(0, pPort1); pEfem->setPort(1, pPort2); pEfem->setPort(2, pPort3); pEfem->setPort(3, pPort4); pEfem->setFliper(pFliper); pEfem->setAligner(pAligner); pEfem->setArmTray(0, pArmTray1); pEfem->setArmTray(1, pArmTray2); pPort1->setArm(pArm); pPort2->setArm(pArm); pPort3->setArm(pArm); pPort4->setArm(pArm); pArmTray1->setArm(pArm); pArmTray2->setArm(pArm); pFliper->setArm(pArm); pVacuumBake->setArm(pArm); pAligner->setArm(pArm); pBonder1->setArm(pArm); pBonder2->setArm(pArm); pBakeCooling->setArm(pArm); pMeasurement->setArm(pArm); connectEquipments(); // 读ç¼åæ°æ® const ULONGLONG boot_cache_begin = GetTickCount64(); const ULONGLONG boot_read_begin = GetTickCount64(); readCache(); LOGI("[BOOT][MASTER] readCache finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_read_begin)); const ULONGLONG boot_state_begin = GetTickCount64(); loadState(); LOGI("[BOOT][MASTER] loadState finished, cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_state_begin)); if (m_listener.onControlJobChanged) { notifyControlJobChanged(); } LOGI("[BOOT][MASTER] cache/state loaded, cost=%llu ms (since init %llu ms)", (unsigned long long)(GetTickCount64() - boot_cache_begin), (unsigned long long)(GetTickCount64() - boot_master_begin)); // 宿¶å¨ g_pMaster = this; SetTimer(NULL, 1, 250, (TIMERPROC)MasterTimerProc); // è°åº¦çº¿ç¨ m_hDispatchThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::DispatchThreadFunction, this, 0, &m_nDispatchThreadAddr); // çæ§bitçº¿ç¨ m_hReadBitsThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::ReadBitsThreadFunction, this, 0, &m_nReadBitsThreadAddr); // æ²çº¿æå¡ CreateDAQBridgeServer(); LOGI("<Master>åå§å宿."); LOGI("[BOOT][MASTER] init finished, total cost=%llu ms", (unsigned long long)(GetTickCount64() - boot_master_begin)); return 0; } int CMaster::term() { @@ -3607,14 +3607,14 @@ auto& dataTypes = CServoUtilsTool::getEqDataTypes(); auto& bonderTypes = dataTypes[MID_Bonder1]; for (size_t i = 0; i < bonderTypes.size(); ++i) { m_pCollector->buffersSetChannelName(MID_Bonder1, i + 1, bonderTypes[i].c_str()); m_pCollector->buffersSetChannelName(MID_Bonder2, i + 1, bonderTypes[i].c_str()); m_pCollector->buffersSetChannelName(MID_Bonder1, (UINT)i + 1, bonderTypes[(UINT)i].c_str()); m_pCollector->buffersSetChannelName(MID_Bonder2, (UINT)i + 1, bonderTypes[(UINT)i].c_str()); } auto& vacuumbakeTypes = dataTypes[MID_VacuumBakeA]; for (size_t i = 0; i < vacuumbakeTypes.size(); ++i) { m_pCollector->buffersSetChannelName(MID_VacuumBakeA, i + 1, vacuumbakeTypes[i].c_str()); m_pCollector->buffersSetChannelName(MID_VacuumBakeB, i + 1, vacuumbakeTypes[i].c_str()); m_pCollector->buffersSetChannelName(MID_VacuumBakeA, (UINT)i + 1, vacuumbakeTypes[(UINT)i].c_str()); m_pCollector->buffersSetChannelName(MID_VacuumBakeB, (UINT)i + 1, vacuumbakeTypes[(UINT)i].c_str()); } auto& coolingTypes = dataTypes[MID_BakeCoolingA]; SourceCode/Bond/Servo/CMyStatusbar.cpp
@@ -70,6 +70,11 @@ SetDlgItemText(IDC_LABEL_RUNTIME, pszText); } void CMyStatusbar::setJobText(const char* pszText) { SetDlgItemText(IDC_LABEL_JOBSTATE, pszText); } void CMyStatusbar::setCurTaskBtnText(const char* pszText) { SetDlgItemText(IDC_BUTTON_ROBOTTASK, pszText); @@ -212,4 +217,12 @@ pItem->GetClientRect(rcItem); pItem->MoveWindow(x, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height()); x += rcItem.Width(); x += 8; pItem = GetDlgItem(IDC_LABEL_JOBSTATE); if (pItem != nullptr) { pItem->GetClientRect(rcItem); pItem->MoveWindow(x, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height()); x += rcItem.Width(); } } SourceCode/Bond/Servo/CMyStatusbar.h
@@ -20,6 +20,7 @@ void setBackgroundColor(COLORREF color); void setForegroundColor(COLORREF cr); void setRunTimeText(const char* pszText); void setJobText(const char* pszText); void setCurTaskBtnText(const char* pszText); void setCimBtnText(const char* pszText); void setCurTaskBtnColors(COLORREF face, COLORREF frame, COLORREF text); SourceCode/Bond/Servo/Common.h
@@ -24,6 +24,7 @@ /* 软件侧 ALID */ #define ALID_SOFTWARE_PAUSE_EVENT 9000 #define ALID_SOFTWARE_TEST_ALARM 9099 /* Channel Name */ #define MC_CHANNEL1_NAME "McChannel1" @@ -561,3 +562,23 @@ /* PPIDååæå¤§é¿åº¦ */ #define PPID_NAME_MAX 80 /* è§£é¤è¦å æé® */ #define BTN_ALARM_OFF_FRAME_NORMAL RGB(88, 88, 88) #define BTN_ALARM_OFF_FRAME_HOVER RGB(88, 88, 88) #define BTN_ALARM_OFF_FRAME_PRESS RGB(88, 88, 88) #define BTN_ALARM_OFF_BKGND_NORMAL RGB(255, 127, 39) #define BTN_ALARM_OFF_BKGND_HOVER RGB(255, 157, 59) #define BTN_ALARM_OFF_BKGND_PRESS RGB(255, 100, 29) /* éé³æé® */ #define BTN_SOUND_OFF_FRAME_NORMAL RGB(88, 88, 88) #define BTN_SOUND_OFF_FRAME_HOVER RGB(88, 88, 88) #define BTN_SOUND_OFF_FRAME_PRESS RGB(88, 88, 88) #define BTN_SOUND_OFF_BKGND_NORMAL RGB(255, 127, 39) #define BTN_SOUND_OFF_BKGND_HOVER RGB(255, 157, 59) #define BTN_SOUND_OFF_BKGND_PRESS RGB(255, 100, 29) #define BTN_SOUND_ON_BKGND_NORMAL RGB(100, 200, 100) #define BTN_SOUND_ON_BKGND_HOVER RGB(150, 250, 150) #define BTN_SOUND_ON_BKGND_PRESS RGB(50, 150, 50) SourceCode/Bond/Servo/Servo.rc
@@ -835,6 +835,26 @@ PUSHBUTTON "Online Remote",IDC_BUTTON_ONLINE_REMOTE,138,15,58,27 END IDD_DIALOG_POPUP_ALARM DIALOGEX 0, 0, 379, 247 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_SYSMENU FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN PUSHBUTTON "<< ä¸ä¸æ¡",IDC_BUTTON_PREV,8,224,50,14,NOT WS_VISIBLE PUSHBUTTON "ä¸ä¸æ¡ >>",IDC_BUTTON_NEXT,62,224,50,14,NOT WS_VISIBLE LTEXT "è¦å",IDC_LABEL_TITLE,27,6,212,17,SS_CENTERIMAGE | NOT WS_VISIBLE ICON "",IDC_ICON_ALARM,29,28,20,20 ICON "",IDC_ICON_TITLE,7,8,20,20,NOT WS_VISIBLE LTEXT "ç级ï¼--",IDC_LABEL_LEVEL,75,26,161,18 LTEXT "è¦ååç§°",IDC_LABEL_NAME,120,45,251,24 PUSHBUTTON "",IDC_POPUP_BTN_CLOSE,354,0,24,22 CONTROL "Custom1",IDC_LINE1,"BYHorizontalLine",WS_TABSTOP,7,78,364,8 PUSHBUTTON "éé³",IDC_BUTTON_SOUND_OFF,228,216,68,22,WS_DISABLED PUSHBUTTON "å¼å¸¸è§£é¤",IDC_BUTTON_ALARM_OFF,304,216,68,22,WS_DISABLED CONTROL "Custom1",IDC_LINE2,"BYHorizontalLine",WS_TABSTOP,7,202,364,8 LTEXT "è¦åæè¿°ï¼",IDC_LABEL_DESCRIPTION,18,98,329,89 CTEXT "å½å没æè¦å",IDC_LABEL_NO_ALARM,18,98,329,89,SS_CENTERIMAGE | NOT WS_VISIBLE END ///////////////////////////////////////////////////////////////////////////// // @@ -1288,6 +1308,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 90 END IDD_DIALOG_POPUP_ALARM, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 371 TOPMARGIN, 7 BOTTOMMARGIN, 238 END END #endif // APSTUDIO_INVOKED @@ -1552,6 +1580,11 @@ 0 END IDD_DIALOG_POPUP_ALARM AFX_DIALOG_LAYOUT BEGIN 0 END ///////////////////////////////////////////////////////////////////////////// // @@ -1600,6 +1633,8 @@ END POPUP "æµè¯(&T)" BEGIN MENUITEM "Test1", ID_MENU_TEST_ALARM_ON MENUITEM "Test2", ID_MENU_TEST_ALARM_OFF MENUITEM "Message &Set", ID_MENU_TEST_MESSAGE_SET MENUITEM "Message &Clear", ID_MENU_TEST_MESSAGE_CLEAR END SourceCode/Bond/Servo/Servo.vcxproj
@@ -223,6 +223,7 @@ <ClInclude Include="..\jsoncpp\include\json\writer.h" /> <ClInclude Include="..\jsoncpp\lib_json\json_batchallocator.h" /> <ClInclude Include="AccordionWnd.h" /> <ClInclude Include="AlarmPopupDlg.h" /> <ClInclude Include="CBaseDlg.h" /> <ClInclude Include="CCarrierSlotGrid.h" /> <ClInclude Include="CCarrierSlotSelector.h" /> @@ -451,6 +452,7 @@ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> </ClCompile> <ClCompile Include="AccordionWnd.cpp" /> <ClCompile Include="AlarmPopupDlg.cpp" /> <ClCompile Include="CBaseDlg.cpp" /> <ClCompile Include="CCarrierSlotGrid.cpp" /> <ClCompile Include="CCarrierSlotSelector.cpp" /> SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -244,6 +244,7 @@ <ClCompile Include="CPageProdOverview.cpp" /> <ClCompile Include="HmLabel.cpp" /> <ClCompile Include="CPageCtrlState.cpp" /> <ClCompile Include="AlarmPopupDlg.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="AlarmManager.h" /> @@ -530,6 +531,7 @@ <ClInclude Include="CPageProdOverview.h" /> <ClInclude Include="HmLabel.h" /> <ClInclude Include="CPageCtrlState.h" /> <ClInclude Include="AlarmPopupDlg.h" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="Servo.rc" /> SourceCode/Bond/Servo/ServoDlg.cpp
@@ -31,6 +31,7 @@ #include "InputDialog.h" #include "ClientListDlg.h" #include "CControlJobManagerDlg.h" #include "AlarmManager.h" #include "CUserManager2.h" #include "CUserManager2Dlg.h" #include "CUserXLogDlg.h" @@ -110,6 +111,8 @@ m_pTopToolbar = nullptr; m_pMyStatusbar = nullptr; m_pRobotTaskDlg = nullptr; m_pTab = nullptr; m_pAlarmPopupDlg = nullptr; } void CServoDlg::DoDataExchange(CDataExchange* pDX) @@ -137,6 +140,10 @@ ON_UPDATE_COMMAND_UI(ID_MENU_FILE_SECSTEST, &CServoDlg::OnUpdateMenuFileSecsTest) ON_COMMAND(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnMenuProjectVarialbleList) ON_UPDATE_COMMAND_UI(ID_MENU_PROJECT_VARIABLE_LIST, &CServoDlg::OnUpdateMenuProjectVarialbleList) ON_COMMAND(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnMenuTestAlarmOn) ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_ON, &CServoDlg::OnUpdateMenuTestAlarmOn) ON_COMMAND(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnMenuTestAlarmOff) ON_UPDATE_COMMAND_UI(ID_MENU_TEST_ALARM_OFF, &CServoDlg::OnUpdateMenuTestAlarmOff) ON_COMMAND(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnMenuTestMessageSet) ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnUpdateMenuTestMessageSet) ON_COMMAND(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnMenuTestMessageClear) @@ -264,7 +271,7 @@ CString text; if (cj != nullptr) { std::string st = cj->getStateText(); text.Format(_T("ControlJob: %S (%S)"), cj->id().c_str(), st.c_str()); text.Format(_T("ControlJob: %s (%s)"), cj->id().c_str(), st.c_str()); if (cj->state() == SERVO::CJState::Paused) { text += _T(" [Paused]"); } @@ -273,7 +280,7 @@ text = _T("ControlJob: None"); } if (m_pMyStatusbar != nullptr) { m_pMyStatusbar->setRunTimeText((LPTSTR)(LPCTSTR)text); m_pMyStatusbar->setJobText((LPTSTR)(LPCTSTR)text); if (cj != nullptr && cj->state() == SERVO::CJState::Paused) { m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_ALARM); m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0)); @@ -326,6 +333,9 @@ //dlg.DoModal(); } } else if (RX_CODE_ALARM_SET == code || RX_CODE_ALARM_CLEAR == code) { RefreshAlarmBadge(); } if (RX_CODE_PASSIVE_STATUS_CHANGED == code) { int state = 0; @@ -357,6 +367,83 @@ theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } void CServoDlg::RefreshAlarmBadge() { if (m_pTopToolbar == nullptr) return; auto activeAlarms = AlarmManager::getInstance().getActiveAlarms(); // ç»´æ¤æªè¯»å表ï¼å½åæ´»è·ä¸æªå¨å·²è¯»éåä¸çæ¥è¦ std::unordered_set<int> activeIds; m_unreadAlarms.clear(); for (const auto& alarm : activeAlarms) { activeIds.insert(alarm.nId); if (m_ackAlarms.find(alarm.nId) == m_ackAlarms.end()) { m_unreadAlarms.push_back(alarm); } } // ç§»é¤å·²è¯»éåä¸å·²ä¸åæ´»è·çåè¦ for (auto it = m_ackAlarms.begin(); it != m_ackAlarms.end(); ) { if (activeIds.find(*it) == activeIds.end()) { it = m_ackAlarms.erase(it); } else { ++it; } } int count = static_cast<int>(m_unreadAlarms.size()); auto* pBtn = dynamic_cast<CBlButton*>(m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)); if (pBtn != nullptr) { if (count <= 0) { pBtn->SetBadgeNumber(0); pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); pBtn->StopFlash(); } else if (count <= 9) { pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); pBtn->SetBadgeNumber(count); if (!pBtn->IsFlash()) pBtn->Flash(600); } else { pBtn->SetBadgeNumber(0); pBtn->ShowDotBadge(TRUE, RGB(255, 0, 0)); if (!pBtn->IsFlash()) pBtn->Flash(600); } pBtn->EnableWindow(TRUE); } } void CServoDlg::AckAlarm(int alarmId) { m_ackAlarms.insert(alarmId); RefreshAlarmBadge(); } void CServoDlg::RaiseTestAlarm() { theApp.m_model.raiseSoftAlarm(ALID_SOFTWARE_TEST_ALARM, "Test Alarm (Ctrl+Alt+T)"); } void CServoDlg::ClearTestAlarm() { theApp.m_model.clearSoftAlarm(ALID_SOFTWARE_TEST_ALARM); } void CServoDlg::MarkAlarmsRead() { auto* pBtn = dynamic_cast<CBlButton*>(m_pTopToolbar ? m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM) : nullptr); for (const auto& alarm : m_unreadAlarms) { m_ackAlarms.insert(alarm.nId); } m_unreadAlarms.clear(); if (pBtn != nullptr) { pBtn->SetBadgeNumber(0); pBtn->ShowDotBadge(FALSE, RGB(255, 0, 0)); pBtn->StopFlash(); } } @@ -466,7 +553,7 @@ (unsigned long long)(GetTickCount64() - boot_pages_begin), (unsigned long long)(GetTickCount64() - boot_ui_begin)); CHmTab* m_pTab = CHmTab::Hook(GetDlgItem(IDC_TAB1)->m_hWnd); m_pTab = CHmTab::Hook(GetDlgItem(IDC_TAB1)->m_hWnd); m_pTab->SetPaddingLeft(20); m_pTab->SetItemMarginLeft(18); m_pTab->AddItem("ç¶æå¾", FALSE); @@ -505,6 +592,7 @@ m_pMyStatusbar = new CMyStatusbar(); m_pMyStatusbar->Create(IDD_STATUSBAR, this); m_pMyStatusbar->ShowWindow(SW_SHOW); m_pMyStatusbar->setJobText("ControlJob: None"); LOGI("[BOOT][UI] statusbar created, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); @@ -531,13 +619,20 @@ } LOGI("[BOOT][UI] before master.init, elapsed=%llu ms", (unsigned long long)(GetTickCount64() - boot_ui_begin)); // ç¸å½äºå»¶æ¶è°ç¨masterçåå§å const ULONGLONG boot_master_begin = GetTickCount64(); theApp.m_model.m_master.init(); LOGI("[BOOT][UI] m_master.init finished, cost=%llu ms (since OnInit start %llu ms)", (unsigned long long)(GetTickCount64() - boot_master_begin), (unsigned long long)(GetTickCount64() - boot_ui_begin)); theApp.m_model.loadPortParams(); // ç¸å½äºå»¶æ¶è°ç¨masterçåå§å const ULONGLONG boot_master_begin = GetTickCount64(); theApp.m_model.m_master.init(); LOGI("[BOOT][UI] m_master.init finished, cost=%llu ms (since OnInit start %llu ms)", (unsigned long long)(GetTickCount64() - boot_master_begin), (unsigned long long)(GetTickCount64() - boot_ui_begin)); theApp.m_model.loadPortParams(); } // è¿åç¶ææ è¿è¡æ¶é´æ¾ç¤ºï¼é¿å ä¸ç´åçå¨âæ£å¨å è½½åå²ç¼å...âï¼ if (m_pMyStatusbar != nullptr) { CString strText; GetRuntimeFormatText(strText, ""); m_pMyStatusbar->setRunTimeText((LPTSTR)(LPCTSTR)strText); } @@ -547,6 +642,8 @@ // æ´æ°ç»å½ç¶æ UpdateLoginStatus(); // åå§åæ¥è¦è§æ RefreshAlarmBadge(); //SystemLogManager::getInstance.log(SystemLogManager::LogType::Info, _T("BondEqå¯å¨...")); //SystemLogManager::getInstance. @@ -736,6 +833,26 @@ pCmdUI->Enable(TRUE); } void CServoDlg::OnMenuTestAlarmOn() { RaiseTestAlarm(); } void CServoDlg::OnUpdateMenuTestAlarmOn(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } void CServoDlg::OnMenuTestAlarmOff() { ClearTestAlarm(); } void CServoDlg::OnUpdateMenuTestAlarmOff(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); } void CServoDlg::OnMenuTestMessageSet() { SERVO::CEquipment* pEquipment = m_pPanelMaster->GetActiveEquipment(); @@ -848,6 +965,12 @@ m_pMyStatusbar->DestroyWindow(); delete m_pMyStatusbar; m_pMyStatusbar = nullptr; } if (m_pAlarmPopupDlg != nullptr) { m_pAlarmPopupDlg->DestroyWindow(); delete m_pAlarmPopupDlg; m_pAlarmPopupDlg = nullptr; } if (m_pRobotTaskDlg != nullptr) { @@ -1256,6 +1379,16 @@ dlg.SetEFEM(pEFEM); dlg.DoModal(); } else if (id == IDC_BUTTON_ALARM) { if (m_pAlarmPopupDlg == nullptr) { m_pAlarmPopupDlg = new CAlarmPopupDlg(); m_pAlarmPopupDlg->Create(IDD_DIALOG_POPUP_ALARM, this); m_pAlarmPopupDlg->CenterWindow(); } m_pAlarmPopupDlg->RefreshContent(); m_pAlarmPopupDlg->ShowWindow(SW_SHOW); MarkAlarmsRead(); } else if (id == IDC_BUTTON_SETTINGS) { SERVO::CEquipment* pEq = theApp.m_model.m_master.getEquipment(EQ_ID_EFEM); ((SERVO::CEFEM*)pEq)->printDebugRobotState(); @@ -1367,6 +1500,11 @@ return 0; } BOOL CServoDlg::PreTranslateMessage(MSG* pMsg) { return CDialogEx::PreTranslateMessage(pMsg); } CString& CServoDlg::GetRuntimeFormatText(CString& strText, const char* pszSuffix) { ULONGLONG ullRunTime = (ULONGLONG)(theApp.m_model.getMaster().getRunTime() * 0.001); SourceCode/Bond/Servo/ServoDlg.h
@@ -3,6 +3,8 @@ // #pragma once #include <vector> #include <unordered_set> #include "BlButton.h" #include "PageLog.h" #include "PageAlarm.h" @@ -15,12 +17,15 @@ #include "CPanelProduction.h" #include "CPageGraph1.h" #include "CPageGraph2.h" #include "HmTab.h" #include "TopToolbar.h" #include "CMyStatusbar.h" #include "CRobotTaskDlg.h" #include "CPageGlassList.h" #include "CPageVarialbles.h" #include "CPageDataVarialbles.h" #include "AlarmPopupDlg.h" #include "AlarmManager.h" // CServoDlg å¯¹è¯æ¡ @@ -33,9 +38,14 @@ public: void ShowTerminalText(const char* pszText, unsigned int duration = -1); void AckAlarm(int alarmId); private: void InitRxWindows(); void RefreshAlarmBadge(); void MarkAlarmsRead(); void RaiseTestAlarm(); void ClearTestAlarm(); void Resize(); void SetLeftPanelType(int type, bool resize = true); void ShowChildPage(int index); @@ -53,6 +63,10 @@ CPageAlarm* m_pPageAlarm; CPageLog* m_pPageLog; CPageTransferLog* m_pPageTransferLog; CAlarmPopupDlg* m_pAlarmPopupDlg; CHmTab* m_pTab; std::vector<AlarmData> m_unreadAlarms; std::unordered_set<int> m_ackAlarms; // å¯¹è¯æ¡æ°æ® #ifdef AFX_DESIGN_TIME @@ -100,6 +114,10 @@ afx_msg void OnUpdateMenuFileExit(CCmdUI* pCmdUI); afx_msg void OnMenuProjectVarialbleList(); afx_msg void OnUpdateMenuProjectVarialbleList(CCmdUI* pCmdUI); afx_msg void OnMenuTestAlarmOn(); afx_msg void OnUpdateMenuTestAlarmOn(CCmdUI* pCmdUI); afx_msg void OnMenuTestAlarmOff(); afx_msg void OnUpdateMenuTestAlarmOff(CCmdUI* pCmdUI); afx_msg void OnMenuTestMessageSet(); afx_msg void OnUpdateMenuTestMessageSet(CCmdUI* pCmdUI); afx_msg void OnMenuTestMessageClear(); @@ -116,4 +134,5 @@ afx_msg void OnTabSelChanged(NMHDR* nmhdr, LRESULT* result); LRESULT OnToolbarBtnClicked(WPARAM wParam, LPARAM lParam); LRESULT OnStatusbarBtnClicked(WPARAM wParam, LPARAM lParam); virtual BOOL PreTranslateMessage(MSG* pMsg); }; SourceCode/Bond/Servo/resource.h
@@ -49,7 +49,6 @@ #define IDD_DIALOG_RECIPE_DEVICE_BIND 167 #define IDD_PAGE_VARIABLE 168 #define IDD_PAGE_REPORT 169 #define IDD_PAGE_ 170 #define IDD_PAGE_COLLECTION_EVENT 171 #define IDD_DIALOG_CONTROL_JOB 172 #define IDD_PAGE_GLASS_LIST 173 @@ -68,6 +67,7 @@ #define IDD_DIALOG_EVENT_EDIT 188 #define IDD_PANEL_PRODUCTION 189 #define IDD_PROD_CTRL_STATE 190 #define IDD_DIALOG_POPUP_ALARM 191 #define IDC_SERVO_GRAPH1 1001 #define IDC_BUTTON_LOG 1002 #define IDC_EDIT_LOG 1003 @@ -332,6 +332,24 @@ #define IDC_BUTTON_OFFLINE 1252 #define IDC_BUTTON_ONLINE_LOCAL 1253 #define IDC_BUTTON_ONLINE_REMOTE 1254 #define IDC_POPUP_TITLE 1255 #define IDC_POPUP_ALARM_ID 1256 #define IDC_POPUP_ALARM_LEVEL 1257 #define IDC_POPUP_ALARM_DESC 1258 #define IDC_POPUP_BTN_CLOSE 1259 #define IDC_POPUP_BTN_CLEAR 1260 #define IDC_BUTTON_PREV 1261 #define IDC_BUTTON_NEXT 1262 #define IDC_ICON_ALARM 1263 #define IDC_ICON_TITLE 1264 #define IDC_LABEL_LEVEL 1265 #define IDC_LABEL_NAME 1267 #define IDC_BUTTON_SOUND_OFF 1268 #define IDC_BUTTON_ALARM_OFF 1269 #define IDC_LINE2 1270 #define IDC_LABEL_DESCRIPTION 1271 #define IDC_LABEL_NO_ALARM 1272 #define IDC_LABEL_JOBSTATE 1273 #define ID_MENU_HELP_ABOUT 32771 #define ID_MENU_FILE_EXIT 32772 #define ID_MENU_FILE_SECSTEST 32773 @@ -364,14 +382,16 @@ #define ID_MENU_TOOLS_CLIENT_LIST 32801 #define ID_MENU_WND_TEST_PANEL 32802 #define ID_MENU_WND_PRO_PANEL 32803 #define ID_MENU_TEST_ALARM_ON 32804 #define ID_MENU_TEST_ALARM_OFF 32805 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 191 #define _APS_NEXT_COMMAND_VALUE 32804 #define _APS_NEXT_CONTROL_VALUE 1255 #define _APS_NEXT_RESOURCE_VALUE 192 #define _APS_NEXT_COMMAND_VALUE 32806 #define _APS_NEXT_CONTROL_VALUE 1274 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif