#include "StateManager.h" #include "Logger.h" #include "utils/Average.h" #include "SystemInfo.h" #include "LanguageManager.h" #include "Toast.h" #include "global.h" #include "plc/SignalService.h" #include "external/imgui/imgui_internal.h" #include #include "utils/TimeHelper.h" StateManager::StateManager() :m_ScannerCtrl(NULL) //,m_GTSController(NULL) , m_ComServer(NULL) , m_StateThread(INVALID_HANDLE_VALUE) , m_RunFlag(false) , m_PrintCabinDoorOpenAlarmLastState(true) { m_LastLayerIndex = 0; m_MStatueFilePath= g_AppPath + "MStatue"; } StateManager::~StateManager() { m_SFile->flush(); m_SFile->close(); DeleteCriticalSection(&m_NotifiesCS); delete m_SFile; if (m_Buzzer)delete m_Buzzer; } void StateManager::Init(ScannerCtrl* psc, CoreCommunication* cc, ComServer* pcs,BasePurifier* pbp, RemoteClient* rc) { m_IoCfgWrapper = ConfigManager::GetInstance()->GetIoCfgWrapper(); m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg(); m_AxisCfgs = ConfigManager::GetInstance()->GetAxisSetting(); m_RunCfg = ConfigManager::GetInstance()->GetRunCfg(); m_AlarmCfgWrapper = ConfigManager::GetInstance()->GetAlarmCfg(); m_MachineCfg = ConfigManager::GetInstance()->GetMachineCfg(); m_Machine = ConfigManager::GetInstance()->GetMachine(); m_PowderEstimateCfg = ConfigManager::GetInstance()->GetPowderEstimateCfg(); InitializeCriticalSection(&m_NotifiesCS); m_ScannerCtrl = psc; m_CoreCommunication = cc; m_ComServer = pcs; m_Purifier = pbp; m_RemoteClient = rc; m_LogTime = GetTickCount64(); m_TotalRunTime = m_LogTime; m_TotalLaserTime = m_LogTime; m_MStatueSaveTime = m_LogTime; m_SFile = new ofstream(); m_SFile->open(m_MStatueFilePath.c_str(), ios::binary); if (m_IoCfgWrapper->m_Buzzer) { m_Buzzer = new Buzzer(); m_Buzzer->Init(); } m_LaserPS = BaseCtrl::GetState(); } void StateManager::Start() { if (m_StateThread != INVALID_HANDLE_VALUE)return; m_RunFlag = true; m_StateThread = AtlCreateThread(StateProc, this); } void StateManager::Stop() { m_RunFlag = false; if (m_StateThread != INVALID_HANDLE_VALUE) { if (WaitForSingleObject(m_StateThread, 500) == WAIT_TIMEOUT) { TerminateThread(m_StateThread, 0); } CloseHandle(m_StateThread); m_StateThread = INVALID_HANDLE_VALUE; } } DWORD WINAPI StateManager::StateProc(StateManager* _this) { if (_this) { _this->StateRun(); } return 0; } void StateManager::StateRun() { Average PrintPressure; SignalService& alarmService = SignalService::GetInstance(); Oxygenstat oxygenStat; EnvState envState; bool CheckOxyReady = false; uint64_t smBegtick = GetTickCount64(); // Sleep(1000); // m_PrintCabinDoorOpenAlarmLastState = m_AlarmCfgWrapper->m_PrintCabinDoorLockOpenAlarm->m_IsAlarm; while (m_RunFlag) { m_Purifier->UpdateShowStat(); m_CoreCommunication->GetEnvState(envState); EnterCriticalSection(&g_SystemInfo->m_InfoCs); g_SystemInfo->m_FanFrequency = m_Purifier->GetFanFreq(); g_SystemInfo->m_EnvState = envState; if (m_ExtCfg->m_ComGetOxygen) { m_ComServer->m_OxygenClient->GetOxygenStat(1, oxygenStat); g_SystemInfo->m_ComPrintOxygen1 = oxygenStat.concentrationValue; g_SystemInfo->m_PrintTemp1 = oxygenStat.tempValue; g_SystemInfo->m_PrintHumidity1 = oxygenStat.humidityValue; bool iscon1 = oxygenStat.baseStat.isConnected; m_ComServer->m_OxygenClient->GetOxygenStat(2, oxygenStat); g_SystemInfo->m_ComPrintOxygen2 = oxygenStat.concentrationValue; g_SystemInfo->m_PrintTemp2 = oxygenStat.tempValue; g_SystemInfo->m_PrintHumidity2 = oxygenStat.humidityValue; bool iscon2 = oxygenStat.baseStat.isConnected; m_ComServer->m_OxygenClient->GetOxygenStat(3, oxygenStat); g_SystemInfo->m_ComOutsideOxygen = oxygenStat.concentrationValue; g_SystemInfo->m_IsOxygenSensorConnect = (iscon1&&iscon2); } else { g_SystemInfo->m_ComPrintOxygen1 = envState.m_PrintOxygen1Analog; g_SystemInfo->m_ComPrintOxygen2 = envState.m_PrintOxygen2Analog; g_SystemInfo->m_ComOutsideOxygen = envState.m_OutsideOxygenAnalog; } if (m_RunCfg->m_PowderStickCalcLength != 0.0f)g_SystemInfo->m_PowderQtyPos = envState.m_PowderLevelValue / m_RunCfg->m_PowderStickCalcLength; if (g_SystemInfo->m_PowderQtyPos > 1.0f)g_SystemInfo->m_PowderQtyPos = 1.0f; g_SystemInfo->m_WindValue = m_Purifier->GetWindValue(0.0); if (m_ComServer->m_TempCtrlClient && m_ComServer->m_TempCtrlClient->GetConfig()->m_Enable) { g_SystemInfo->m_IsHeatingConnect = m_ComServer->m_TempCtrlClient->IsComConnected(); } LeaveCriticalSection(&g_SystemInfo->m_InfoCs); SignalService::GetInstance().SetPurifierIsConnect(m_Purifier->IsConnectAlarm()); if (BaseCtrl::IsStart() || BaseCtrl::IsPause()) { FileProcessor* job = m_ScannerCtrl->GetJobController()->GetJob(); uint64_t dnow = GetTickCount64(); bool hasStopAlarm = false; bool hasPauseAlarm = false; if (BaseCtrl::IsStart()) { alarmService.JudgeStopAlarm(m_ScannerCtrl->m_StopAlarms); char alarmBuffer[1024]; //AlarmCfg* stoplog = alarmService.JudgeStopAlarm(); if (!m_ScannerCtrl->m_StopAlarms.empty()) { hasStopAlarm = true; m_ScannerCtrl->StopWork(); for (auto al : m_ScannerCtrl->m_StopAlarms) { sprintf_s(alarmBuffer, sizeof(alarmBuffer), u8"%s%s %s", _(u8"停止打印,原因:").c_str(), al->m_ShowContent.c_str(), al->m_AlarmInfo.c_str()); AlarmShowInfo* asi = new AlarmShowInfo; asi->m_JobName = job->GetJobTitle(); asi->m_JobId = job->GetJobUid(); std::time(&asi->m_HappenTime); asi->m_LayerIndex = job->GetCurrentLayerIndex(); asi->m_AlarmCode = al->m_Code; asi->m_AlarmName = al->m_ShowContent.c_str(); asi->m_AlarmContent = alarmBuffer; asi->m_AlarmShowInfo = al->m_AlarmInfo; asi->m_AlarmType = ALARM_TYPE_STOP; AddAlarmNotify(asi); string jobname = ""; if (job)jobname = job->GetJobTitle(); g_log->m_LogDao->AddHistoryAlarm(jobname, ALARM_TYPE_STOP, alarmBuffer); } m_RemoteClient->SetNeedSendAlarm(true); if (m_Buzzer)m_Buzzer->SetStopAlarmEnable(); } else { alarmService.JudgePauseAlarm(m_ScannerCtrl->m_PauseAlarms); if (!m_ScannerCtrl->m_PauseAlarms.empty()) { hasPauseAlarm = true; m_ScannerCtrl->PauseWork(); BaseCtrl::SetPauseState(BaseCtrl::AlarmPause); for (auto al : m_ScannerCtrl->m_PauseAlarms) { sprintf_s(alarmBuffer, sizeof(alarmBuffer), u8"%s%s %s", _(u8"暂停打印,原因:").c_str(), al->m_ShowContent.c_str(), al->m_AlarmInfo.c_str()); AlarmShowInfo* asi = new AlarmShowInfo; asi->m_JobName = job->GetJobTitle(); asi->m_JobId = job->GetJobUid(); std::time(&asi->m_HappenTime); asi->m_LayerIndex = job->GetCurrentLayerIndex(); asi->m_AlarmCode = al->m_Code; asi->m_AlarmName = al->m_ShowContent.c_str(); asi->m_AlarmShowInfo = al->m_AlarmInfo; asi->m_AlarmContent = alarmBuffer; asi->m_AlarmType = ALARM_TYPE_PAUSE; AddAlarmNotify(asi); string jobname = ""; if (job)jobname = job->GetJobTitle(); g_log->m_LogDao->AddHistoryAlarm(jobname, ALARM_TYPE_PAUSE, alarmBuffer); } m_RemoteClient->SetNeedSendAlarm(true); if (m_Buzzer)m_Buzzer->SetPauseAlarmEnable(); } } if (m_RunCfg->m_PrintRestEnable && job && job->m_BeginPrintTime != 0L) { g_SystemInfo->m_PrintRemainTime = m_RunCfg->m_PrintContinueMinute * 60 * 1000 - (dnow - job->m_BeginPrintTime); if (g_SystemInfo->m_PrintRemainTime < 0)g_SystemInfo->m_PrintRemainTime = 0; if ((dnow - job->m_BeginPrintTime) > (m_RunCfg->m_PrintContinueMinute * 60 * 1000)) { m_ScannerCtrl->PauseAuto(); BaseCtrl::SetPauseState(BaseCtrl::PrintRestPause); } } vector warns; string warnInfo = alarmService.JudgeWarns(warns); if ((dnow - m_LastWarnInfo) > (m_RunCfg->m_WarnAlarmNotifySecond * 1000)) { if (warnInfo != "") { g_Toast->AddToast(new ToastBean(warnInfo, 3000, Toast::COLOR_ORANGE)); } m_LastWarnInfo = dnow; } } if (job) { double pt = (double)(dnow - job->m_BeginPrintTime) / 1000.0; //if (job->m_FirstStartTime == 0L)job->m_FirstStartTime = dnow; double currentPrintTime = (double)(dnow - job->m_FirstStartTime) / 1000.0; //g_SystemInfo->m_StateBean.realCostSeconds = job->GetJobbean()->m_SpendSecond + currentPrintTime; g_SystemInfo->m_StateBean.realCostSeconds = job->GetJobbean()->m_PrintSecond + pt; g_SystemInfo->m_StateBean.remainMil = job->GetMetaData()->GetRemainTime(); job->GetJobbean()->m_CurrentPrintedTime = currentPrintTime; job->GetJobbean()->m_EveryPrintedTime = pt; //job->GetJobbean()->m_MoldPos = m_GTSController->Mold()->GetState()->realPos; bool needPersist = false; int layerIndex = job->GetJobbean()->m_PrintedLayerIndex; if (layerIndex != m_LastLayerIndex) { needPersist = true; m_LastLayerIndex = layerIndex; } if ((dnow - m_LogTime) > m_RunCfg->m_LogPersistInteval || needPersist) { LayerStatus layerStatus; layerStatus.m_JobId = job->GetJobbean()->m_Id; layerStatus.m_LayerIndex = layerIndex; time(&layerStatus.m_InsertTitme); layerStatus.m_SpendSecond = job->GetJobbean()->m_SpendSecond + currentPrintTime; //layerStatus.m_MoldPos = m_GTSController->Mold()->GetState()->realPos; EnterCriticalSection(&g_SystemInfo->m_InfoCs); layerStatus.m_PrintOxygen1 = g_SystemInfo->m_ComPrintOxygen1; layerStatus.m_PrintOxygen2 = g_SystemInfo->m_ComPrintOxygen2; layerStatus.m_OutsideOxygen = g_SystemInfo->m_ComOutsideOxygen; layerStatus.m_PrintTemp1 = g_SystemInfo->m_PrintTemp1; layerStatus.m_PrintTemp2 = g_SystemInfo->m_PrintTemp2; layerStatus.m_PrintHumidity1 = g_SystemInfo->m_PrintHumidity1; layerStatus.m_PrintHumidity2 = g_SystemInfo->m_PrintHumidity2; layerStatus.m_PlateTemp = g_SystemInfo->m_PlatformTemp; layerStatus.m_FanFrequency = g_SystemInfo->m_FanFrequency; layerStatus.m_WindRate = g_SystemInfo->m_WindValue; layerStatus.m_PrintPressure = g_SystemInfo->m_EnvState.m_PrintPressureAnalog; LeaveCriticalSection(&g_SystemInfo->m_InfoCs); g_log->m_LogDao->LogLayerStatus(layerStatus); m_LogTime = dnow; } } if ((dnow - m_TotalRunTime) > m_RunCfg->m_StatisticsInteval) { EnterCriticalSection(&g_SystemInfo->m_MStatueCS); g_SystemInfo->m_MStatue.m_TotalPrintTime = g_SystemInfo->m_MStatue.m_TotalPrintTime + (dnow - m_TotalRunTime); LeaveCriticalSection(&g_SystemInfo->m_MStatueCS); m_TotalRunTime = dnow; } } else if (BaseCtrl::IsStandBy()) { if (BaseCtrl::IsPauseStanBy()) { if (BaseCtrl::GetPauseState() == BaseCtrl::PrintRestPause) { uint64_t dnow = GetTickCount64(); EnterCriticalSection(&m_ScannerCtrl->GetJobController()->m_cs); FileProcessor* job = m_ScannerCtrl->GetJobController()->GetJob(); if (m_RunCfg->m_PrintRestEnable && job && job->m_AutoPauseTime != 0L && job->m_IsAutoCtrl) { g_SystemInfo->m_PauseRemainTime = m_RunCfg->m_PrintRestMinutes * 60 * 1000 - (dnow - job->m_AutoPauseTime); if (g_SystemInfo->m_PauseRemainTime < 0)g_SystemInfo->m_PauseRemainTime = 0; if ((dnow - job->m_AutoPauseTime) > (m_RunCfg->m_PrintRestMinutes * 60 * 1000)) { job->m_AutoPauseTime = GetTickCount64(); m_ScannerCtrl->BeginWork(); } double pt = (double)(dnow - job->m_BeginPrintTime) / 1000.0; g_SystemInfo->m_StateBean.realCostSeconds = job->GetJobbean()->m_PrintSecond + pt; //if (job->m_FirstStartTime == 0L)job->m_FirstStartTime = GetTickCount64(); //double currentPrintTime = (double)(dnow - job->m_FirstStartTime) / 1000.0; //g_SystemInfo->m_StateBean.realCostSeconds = job->GetJobbean()->m_SpendSecond + currentPrintTime; } LeaveCriticalSection(&m_ScannerCtrl->GetJobController()->m_cs); } /*else if (BaseCtrl::GetPauseState() == BaseCtrl::AlarmAutoPause) { if (m_CurrentAutoAlarm) { if (m_AutoAlarmProc.find(m_CurrentAutoAlarm) != m_AutoAlarmProc.end()) { EnterCriticalSection(&m_AutoAlarmCS); if (m_ReadyRestartPrint) { m_ScannerCtrl->BeginWork(); m_ReadyRestartPrint = false; } else { if (m_AutoAlarmHandle == INVALID_HANDLE_VALUE) { m_AutoAlarmHandle = AtlCreateThread(m_AutoAlarmProc[m_CurrentAutoAlarm], this); } } LeaveCriticalSection(&m_AutoAlarmCS); } } }*/ } } m_IoCfgWrapper->AutoCtrlHeating(m_ComServer->m_TempCtrlClient); if (m_AlarmCfgWrapper->m_PrintCabinDoorOpenAlarm->m_IsEnable && m_AlarmCfgWrapper->m_PrintCabinDoorOpenAlarm->m_IsAlarm) { vector* laserCfg = ConfigManager::GetInstance()->GetMatchScannerControlCfg(); for (size_t laserIndex = 0; laserIndex < laserCfg->size(); laserIndex++) { ScannerControlCfg* lcfg = (*laserCfg)[laserIndex]; if (lcfg->m_LaserEnable && lcfg->m_LaserEnable->IsActive()) { lcfg->m_LaserEnable->SetActive(false); } } } m_Machine->AutoCtrlLamp(); if (m_IoCfgWrapper->m_ScannerCool) { bool isLaserOn = false; //振镜冷却随激光器开启 vector* laserCfgs = ConfigManager::GetInstance()->GetMatchScannerControlCfg(); for (size_t i = 0; i < laserCfgs->size(); i++) { ScannerControlCfg* laserCfg = (*laserCfgs)[i]; if (laserCfg->m_LaserEnable && laserCfg->m_LaserEnable->IsActive()) { isLaserOn = true; break; } } if (isLaserOn) { if (!m_IoCfgWrapper->m_ScannerCool->IsActive() && !m_RunCfg->m_IsDebugMode) { m_IoCfgWrapper->m_ScannerCool->SetActive(true); } } else { if (m_IoCfgWrapper->m_ScannerCool->IsActive() && !m_RunCfg->m_IsDebugMode) { m_IoCfgWrapper->m_ScannerCool->SetActive(false); } } } //振镜冷却随激光器开启 /*if (m_IoCfgWrapper->m_Laser->IsActive()) { if (m_IoCfgWrapper->m_ScannerCool) { if (!m_IoCfgWrapper->m_ScannerCool->IsActive() && !m_RunCfg->m_IsDebugMode) { m_IoCfgWrapper->m_ScannerCool->SetActive(true); } } } else { if (m_IoCfgWrapper->m_ScannerCool) { if (m_IoCfgWrapper->m_ScannerCool->IsActive() && !m_RunCfg->m_IsDebugMode) { m_IoCfgWrapper->m_ScannerCool->SetActive(false); } } }*/ if (CheckOxyReady){ if (m_AlarmCfgWrapper->m_PrintCabinDoorOpenAlarm->m_IsAlarm && !m_PrintCabinDoorOpenAlarmLastState) { EnterCriticalSection(&g_SystemInfo->m_InfoCs); if (g_SystemInfo->m_ComPrintOxygen1 < m_RunCfg->m_DangerousOxygen || g_SystemInfo->m_ComPrintOxygen2 < m_RunCfg->m_DangerousOxygen) { AddDangerNotify(_(u8"舱门打开时氧含量过低,请等待三分钟后再进行舱内操作。").c_str()); } LeaveCriticalSection(&g_SystemInfo->m_InfoCs); } } else { uint64_t smNowtic = GetTickCount64(); if (smNowtic - smBegtick > 10000) { CheckOxyReady = true; } } if (m_ComServer->m_SimpleSupplyClient && m_ComServer->m_SimpleSupplyClient->IsServerConnected()) { if (m_ExtCfg->m_UsePowderStick) { if ((m_PowderEstimateCfg->m_StartSupplyQty > g_SystemInfo->GetPowderQty()*100.0f) && m_PowderEstimateCfg->m_AutoSupplyEnable) { if (!m_ComServer->m_SimpleSupplyClient->IsAutoSuppling() && BaseCtrl::IsStart()) { m_ComServer->m_SimpleSupplyClient->AutoSupply(); } } } else { IOCfg* supplyPos = m_PowderEstimateCfg->m_PEVec[m_PowderEstimateCfg->m_StartSupplyPos]->m_PosSensor; if (supplyPos && !supplyPos->IsActive() && m_PowderEstimateCfg->m_AutoSupplyEnable) { if (!m_ComServer->m_SimpleSupplyClient->IsAutoSuppling() && BaseCtrl::IsStart()) { m_ComServer->m_SimpleSupplyClient->AutoSupply(); } } } } m_PrintCabinDoorOpenAlarmLastState = m_AlarmCfgWrapper->m_PrintCabinDoorOpenAlarm->m_IsAlarm; BaseCtrl::PrintState ps = BaseCtrl::GetState(); switch (ps) { case BaseCtrl::PAUSE: { g_SystemInfo->m_StateBean.systemState = _(u8"暂停中").c_str(); }break; case BaseCtrl::STOP: { g_SystemInfo->m_StateBean.systemState = _(u8"停止中").c_str(); }break; case BaseCtrl::STANDBY: { g_SystemInfo->m_StateBean.systemState = _(u8"就绪").c_str(); }break; case BaseCtrl::STANDBY_PAUSE: { g_SystemInfo->m_StateBean.systemState = _(u8"暂停中断").c_str(); }break; case BaseCtrl::STANDBY_STOP: { g_SystemInfo->m_StateBean.systemState = _(u8"停止中断").c_str(); }break; case BaseCtrl::PRINTING: { g_SystemInfo->m_StateBean.systemState = _(u8"正在打印").c_str(); }break; case BaseCtrl::PREPRINT: { switch (BaseCtrl::GetPreState()) { case ScannerCtrl::CheckIO: { g_SystemInfo->m_StateBean.systemState = _(u8"检查").c_str(); }break; case ScannerCtrl::Purifying: { g_SystemInfo->m_StateBean.systemState = _(u8"除氧").c_str(); }break; case ScannerCtrl::Dedusting: { g_SystemInfo->m_StateBean.systemState = _(u8"循环").c_str(); }break; case ScannerCtrl::WaitConfirm: { g_SystemInfo->m_StateBean.systemState = _(u8"等待确认").c_str(); }break; case ScannerCtrl::AutoHeatingScanner: { g_SystemInfo->m_StateBean.systemState = _(u8"振镜预热").c_str(); }break; case ScannerCtrl::PreFinished: { g_SystemInfo->m_StateBean.systemState = _(u8"准备打印").c_str(); }break; } }break; case ScannerCtrl::FINISH: { g_SystemInfo->m_StateBean.systemState = _(u8"完成").c_str(); }break; } if (m_LaserPS != ps) { m_RemoteClient->SendStateChangeMsg(); } m_LaserPS = ps; uint64_t nowtick = GetTickCount64(); time(&g_SystemInfo->m_StateBean.currentTime); if ((nowtick- m_MStatueSaveTime)>100) { EnterCriticalSection(&g_SystemInfo->m_MStatueCS); m_SFile->seekp(0, ios::beg); m_SFile->write((char*)&g_SystemInfo->m_MStatue, sizeof(MStatue)); LeaveCriticalSection(&g_SystemInfo->m_MStatueCS); m_MStatueSaveTime = nowtick; } Sleep(30); } } void StateManager::DrawNotify(void) { size_t nsize = 0; EnterCriticalSection(&m_NotifiesCS); nsize = m_AlarmNotifies.size(); LeaveCriticalSection(&m_NotifiesCS); if (nsize > 0) { ImGui::OpenPopup(_(u8"信息提示").c_str()); if (ImGui::BeginPopupModal(_(u8"信息提示").c_str(), NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) { EnterCriticalSection(&m_NotifiesCS); AlarmShowInfo* info = m_AlarmNotifies[0]; ImGui::Text(_(u8"任务名:%s").c_str(), info->m_JobName.c_str()); ImGui::Text(_(u8"报警层:%u").c_str(), info->m_LayerIndex + 1); ImGui::Text(_(u8"报警时间:%s").c_str(), TimeHelper::Time2Str(info->m_HappenTime).c_str()); ImGui::Text(_(u8"报警类型:%s").c_str(), AlarmCfg::GetTypeInfo(info->m_AlarmType).c_str()); ImGui::TextColored(Toast::COLOR_RED, _(u8"报警项目:%s").c_str(), info->m_AlarmName.c_str()); ImGui::Text(_(u8"报警信息:").c_str()); ImGui::TextColored(Toast::COLOR_RED, info->m_AlarmShowInfo.c_str()); if (m_RemoteClient->IsNeedSendAlarm()) { std::time(&info->m_TFlag); int idif = info->m_TFlag - info->m_HappenTime; if (((idif % 10) == 0) && m_LastSendAlarmFlag != idif) { m_RemoteClient->SendAlarmMsg(info); m_LastSendAlarmFlag = idif; } } LeaveCriticalSection(&m_NotifiesCS); ImGui::Separator(); if (ImGui::Button(_(u8"确定").c_str(), ImVec2(120, 0))) { EnterCriticalSection(&m_NotifiesCS); for (size_t i = 0; i < m_AlarmNotifies.size(); i++) { delete m_AlarmNotifies[i]; } m_AlarmNotifies.clear(); LeaveCriticalSection(&m_NotifiesCS); if (m_Buzzer)m_Buzzer->SetStopAlarmDisable(); if (m_Buzzer)m_Buzzer->SetPauseAlarmDisable(); ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); } } } void StateManager::DrawOxygenReady() { if (BaseCtrl::GetPreState()!= BaseCtrl::WaitConfirm) { return; } ImGui::OpenPopup(_(u8"可打印提示").c_str()); if (ImGui::BeginPopupModal(_(u8"可打印提示").c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize)) { ImGui::Text(_(u8"氧含量已达到可打印状态,是否开始打印?").c_str()); char buffer[256]; sprintf_s(buffer, sizeof(buffer),_(u8"准备在第 %u 层开始打印").c_str(), m_ScannerCtrl->GetJobController()->GetJob()->GetStartIndex()+1); ImGui::TextColored(Toast::COLOR_ORANGE,buffer); if (m_RunCfg->m_IsDebugMode) { ImGui::TextColored(Toast::COLOR_ORANGE, _(u8"注意,本次打印在调试模式下进行!").c_str()); } if (m_ScannerCtrl->IsHeatingScannerEnable()) { ImGui::Separator(); ImGui::Checkbox(_(u8"振镜预热").c_str(), &m_ScannerCtrl->GetJobController()->GetJob()->m_AutoHeatingScanner); } ImGui::Separator(); if (ImGui::Button(_(u8"开始").c_str(),ImVec2(120, 0))) { BaseCtrl::SetPreState(BaseCtrl::SummitConfirm); ImGui::CloseCurrentPopup(); } ImGui::SetItemDefaultFocus(); ImGui::SameLine(); if (ImGui::Button(_(u8"取消").c_str(), ImVec2(120, 0))) { BaseCtrl::SetPreState(BaseCtrl::CancelConfirm); ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); } } void StateManager::AddNotify(string notify) { EnterCriticalSection(&m_NotifiesCS); m_Notifies.push_back(notify); LeaveCriticalSection(&m_NotifiesCS); } void StateManager::AddDangerNotify(string notify) { EnterCriticalSection(&m_NotifiesCS); m_DangerNotifies.push_back(notify); LeaveCriticalSection(&m_NotifiesCS); } void StateManager::ResetTotalPrintTime() { EnterCriticalSection(&g_SystemInfo->m_MStatueCS); g_SystemInfo->m_MStatue.m_TotalPrintTime = 0; m_TotalRunTime = GetTickCount64(); m_SFile->seekp(0, ios::beg); m_SFile->write((char*)&g_SystemInfo->m_MStatue, sizeof(MStatue)); LeaveCriticalSection(&g_SystemInfo->m_MStatueCS); } void StateManager::DrawDangerNotify() { size_t nsize = 0; EnterCriticalSection(&m_NotifiesCS); nsize = m_DangerNotifies.size(); LeaveCriticalSection(&m_NotifiesCS); if (nsize > 0) { ImGui::SetNextWindowPos(ImVec2(300, 400)); ImGui::Begin(_(u8"危险信息提示").c_str(), 0, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize); ImGui::SetWindowFontScale(1.2); EnterCriticalSection(&m_NotifiesCS); for (unsigned int i = 0; i < m_DangerNotifies.size(); i++) { ImGui::TextColored(Toast::COLOR_RED, "%s", m_DangerNotifies[i].c_str()); } LeaveCriticalSection(&m_NotifiesCS); ImGui::Separator(); if (ImGui::Button(_(u8"确定").c_str(), ImVec2(120, 0))) { EnterCriticalSection(&m_NotifiesCS); m_DangerNotifies.clear(); LeaveCriticalSection(&m_NotifiesCS); } ImGui::End(); } } void StateManager::AddAlarmNotify(AlarmShowInfo* info) { if (!info)return; m_LastSendAlarmFlag = -1; EnterCriticalSection(&m_NotifiesCS); m_AlarmNotifies.push_back(info); LeaveCriticalSection(&m_NotifiesCS); } string StateManager::m_MStatueFilePath = "";