| | |
| | | m_hsmsPassive.setVariableValue("PJobSpace", (__int64)(m_master.isProcessJobsEmpty() ? 1 : 0)); |
| | | } |
| | | |
| | | void CModel::notifyControlJobChanged() |
| | | { |
| | | // 1) 刷新派生 SV |
| | | refreshDerivedSVs(); |
| | | // 2) 通知上层 UI(RX_CODE_CONTROLJOB_CHANGED) |
| | | notify(RX_CODE_CONTROLJOB_CHANGED); |
| | | } |
| | | |
| | | bool CModel::raiseSoftAlarm(int alarmId, |
| | | const std::string& desc, |
| | | int level /*= -1*/, |
| | | int deviceId /*= 0*/, |
| | | int unitId /*= 0*/, |
| | | const char* deviceName /*= "Software"*/, |
| | | const char* unitName /*= "App"*/) |
| | | { |
| | | AlarmManager& alarmManager = AlarmManager::getInstance(); |
| | | const AlarmInfo* info = alarmManager.getAlarmInfoByID(alarmId); |
| | | |
| | | int severity = level; |
| | | if (severity < 0 && info != nullptr) severity = info->nAlarmLevel; |
| | | if (severity < 0) severity = 0; |
| | | |
| | | std::string descText = desc; |
| | | if (descText.empty() && info != nullptr) { |
| | | descText = !info->strDescription.empty() ? info->strDescription : info->strAlarmText; |
| | | } |
| | | if (descText.empty()) { |
| | | descText = CToolUnits::formatString("Alarm %d", alarmId); |
| | | } |
| | | |
| | | AlarmData alarmData; |
| | | alarmData.nId = alarmId; |
| | | alarmData.nSeverityLevel = severity; |
| | | alarmData.nDeviceId = deviceId; |
| | | alarmData.nUnitId = unitId; |
| | | alarmData.strDeviceName = deviceName; |
| | | alarmData.strUnitName = unitName; |
| | | // 若未显式提供设备/单元名称,尝试通过 deviceId/unitId 解析(soft alarm 默认均为 0) |
| | | if (alarmData.strDeviceName.empty()) { |
| | | alarmData.strDeviceName = alarmManager.getDeviceNameById(deviceId); |
| | | } |
| | | if (alarmData.strUnitName.empty()) { |
| | | alarmData.strUnitName = alarmManager.getUnitNameById(deviceId, unitId); |
| | | } |
| | | alarmData.strStartTime = CToolUnits::timeToString2(CToolUnits::getTimestamp()); |
| | | alarmData.strEndTime = ""; |
| | | alarmData.strDescription = descText; |
| | | |
| | | int nAlarmEventId = 0; |
| | | bool result = alarmManager.addAlarm(alarmData, nAlarmEventId); |
| | | if (result) { |
| | | notify(RX_CODE_ALARM_SET); |
| | | if (m_master.isAlarmReportEnable()) { |
| | | m_hsmsPassive.requestAlarmReport(1, alarmId, descText.c_str()); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | void CModel::clearSoftAlarm(int alarmId, int deviceId, int unitId) |
| | | { |
| | | AlarmManager& alarmManager = AlarmManager::getInstance(); |
| | | alarmManager.clearAlarmByAttributes(alarmId, deviceId, unitId, CToolUnits::getCurrentTimeString()); |
| | | notify(RX_CODE_ALARM_CLEAR); |
| | | if (m_master.isAlarmReportEnable()) { |
| | | const AlarmInfo* info = alarmManager.getAlarmInfoByID(alarmId); |
| | | std::string descText; |
| | | if (info != nullptr) descText = info->strAlarmText; |
| | | m_hsmsPassive.requestAlarmReport(0, alarmId, descText.c_str()); |
| | | } |
| | | } |
| | | |
| | | void CModel::setControlState(ControlState newState) |
| | | { |
| | | const auto prev = m_currentControlState; |
| | |
| | | |
| | | // CGlassPool |
| | | m_glassPool.initPool(); |
| | | |
| | | // 将 Model 上下文传递给 Master,便于 Master 触发软件级报警等跨层操作 |
| | | m_master.setModelCtx(this); |
| | | |
| | | |
| | | // Log |
| | |
| | | m_hsmsPassive.loadReports((LPTSTR)(LPCTSTR)strVarialbleFile); |
| | | strVarialbleFile.Format(_T("%s\\CollectionEventList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir); |
| | | m_hsmsPassive.loadCollectionEvents((LPTSTR)(LPCTSTR)strVarialbleFile); |
| | | { |
| | | auto events = m_hsmsPassive.getCollectionEvents(); |
| | | std::vector<unsigned int> ceids; |
| | | ceids.reserve(events.size()); |
| | | for (auto e : events) { |
| | | if (e != nullptr) ceids.push_back(e->getEventId()); |
| | | } |
| | | m_master.setAllowedCeids(ceids); |
| | | } |
| | | strVarialbleFile.Format(_T("%s\\HsmsPassive.cache"), (LPTSTR)(LPCTSTR)m_strWorkDir); |
| | | m_hsmsPassive.loadCacheFromFile(strVarialbleFile); |
| | | |
| | |
| | | }; |
| | | masterListener.onControlJobChanged = [this](void* pMaster) { |
| | | (void)pMaster; |
| | | this->refreshDerivedSVs(); |
| | | this->notifyControlJobChanged(); |
| | | }; |
| | | masterListener.onEqAlive = [&](void* pMaster, SERVO::CEquipment* pEquipment, BOOL bAlive) -> void { |
| | | LOGI("<CModel>Equipment onAlive:%s(%s).", pEquipment->getName().c_str(), |