// CSMachineDlg.cpp: 实现文件 // #include "pch.h" #include "resource.h" // 主符号 #include "CSMachineDlg.h" #include "afxdialogex.h" #include "CConfigDlg.h" //********************************状态机接口函数指针******************************** typedef void*(__stdcall* _CreateStateMachine)(void); typedef void(__stdcall* _DeleteStateMachine)(void*); // CSMachineDlg 对话框 IMPLEMENT_DYNAMIC(CSMachineDlg, CDiosBasicDlg) CSMachineDlg::CSMachineDlg(CWnd* pParent /*=nullptr*/) : CDiosBasicDlg(Dev_SMachine, IDD_DIALOG6, pParent) { InitLog(); m_hStateFinishFlag = CreateEvent(NULL, FALSE, FALSE, 0); m_hStateExitFlag = CreateEvent(NULL, FALSE, FALSE, 0); m_strCfgFile = "xml or json"; } CSMachineDlg::~CSMachineDlg() { ExitLog(); } void CSMachineDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CSMachineDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON3, &CSMachineDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON1, &CSMachineDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CSMachineDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON4, &CSMachineDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CSMachineDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, &CSMachineDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON7, &CSMachineDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, &CSMachineDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9, &CSMachineDlg::OnBnClickedButton9) ON_BN_CLICKED(IDC_BUTTON10, &CSMachineDlg::OnBnClickedButton10) ON_BN_CLICKED(IDC_BUTTON11, &CSMachineDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON12, &CSMachineDlg::OnBnClickedButton12) ON_BN_CLICKED(IDC_BUTTON13, &CSMachineDlg::OnBnClickedButton13) ON_BN_CLICKED(IDC_BUTTON14, &CSMachineDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON15, &CSMachineDlg::OnBnClickedButton15) END_MESSAGE_MAP() // CSMachineDlg 消息处理程序 //初始化配置 BOOL CSMachineDlg::OnInitDialog() { CDiosBasicDlg::OnInitDialog(); return TRUE; } DWORD CSMachineDlg::WaitforStateNotify(LPVOID pParam) { CString log; mLog::Debug("Begin WaitforDriverNotify"); CSMachineDlg* pCurSM = (CSMachineDlg*)pParam; if (pCurSM == NULL) { return 0; } HANDLE HandleArray[3]; HandleArray[0] = pCurSM->m_hStateFinishFlag; HandleArray[1] = pCurSM->m_ptrSMachine->GetStateTransEvent(); bool loopFlag = true; while (loopFlag) { DWORD dwResult = WaitForMultipleObjects(2, HandleArray, FALSE, INFINITE); switch (dwResult) { case WAIT_OBJECT_0: { //mLog::Debug("StateNotifyThread: Exit!"); loopFlag = false; }break; case WAIT_OBJECT_0 + 1: { string strname; pCurSM->m_ptrSMachine->GetCurrentState(strname); mLog::Info("PopStateChange[{$}]", strname.c_str()); pCurSM->GetDlgItem(IDC_EDIT8)->SetWindowText(strname.c_str()); if(pCurSM->m_bRunMode) { pCurSM->m_ptrSMachine->SetRunningState(true); } }break; case WAIT_TIMEOUT: {}break; default: break; } } SetEvent(pCurSM->m_hStateExitFlag); mLog::Debug("Exit WaitforDriverNotify Begin"); return 1; } //设备初始化 bool CSMachineDlg::AppInitial(bool act) { return CreatMode(act); } //初始化日志模块 bool CSMachineDlg::InitLog() { //string strLogPath = GetProcessDirectory() + UnitTool_LogPath; ////Log4CPP::ThreadContext::Map::Set("LogFileName", cfgKey.c_str()); //Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash(UnitTool_LogFileName), UnitTool_DevType_SM); //auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str()); //mLog::gLogger = Log4CPP::LogManager::GetLogger(UnitTool_DevType_SM); //string version; //if (GetVersion(version)) //{ // mLog::Info("===============log begin : [{$}] version:{$} ===================\n", UnitTool_DevType_SM, version.c_str()); // return true; //} //else //{ // mLog::Info("===============log begin : [{$}] version:0.0.0.0 ===================\n", UnitTool_DevType_SM); //} return true; } void CSMachineDlg::ExitLog() { //if (mLog::gLogger) //{ // mLog::Info("===============log end ==================="); // mLog::Close(); // mLog::gLogger = nullptr; //} } //设置消息对照表 void CSMachineDlg::SetMagMap() { CString log; if (m_hDevLib) { CString tempStr; tempStr.Format("%s", m_strCfgFile.c_str()); GetDlgItem(IDC_EDIT1)->SetWindowText(tempStr); } } void CSMachineDlg::InitPageElements(bool act) { if (act) { ShowPageElements(FALSE, TRUE, FALSE, FALSE); SetMagMap(); } else { ShowPageElements(TRUE, FALSE, TRUE, FALSE); } } //设置窗口元素显示 void CSMachineDlg::ShowPageElements(bool init, bool exit, bool cfg, bool general) { __super::ShowPageElements(init, exit, cfg, general); bool temp = exit; //LoadMachine GetDlgItem(IDC_BUTTON4)->EnableWindow(temp); GetDlgItem(IDC_EDIT1)->EnableWindow(temp); //SetMSName GetDlgItem(IDC_BUTTON5)->EnableWindow(temp); GetDlgItem(IDC_EDIT2)->EnableWindow(temp); //AddDevices GetDlgItem(IDC_BUTTON6)->EnableWindow(temp); GetDlgItem(IDC_EDIT3)->EnableWindow(temp); GetDlgItem(IDC_EDIT4)->EnableWindow(temp); //InitPreState or StartSM or StopSM GetDlgItem(IDC_BUTTON7)->EnableWindow(temp); GetDlgItem(IDC_BUTTON8)->EnableWindow(temp); GetDlgItem(IDC_BUTTON9)->EnableWindow(temp); //SetRunState GetDlgItem(IDC_BUTTON10)->EnableWindow(temp); GetDlgItem(IDC_EDIT5)->EnableWindow(temp); //GetSMError GetDlgItem(IDC_BUTTON11)->EnableWindow(temp); GetDlgItem(IDC_EDIT6)->EnableWindow(temp); //GetSMName GetDlgItem(IDC_BUTTON12)->EnableWindow(temp); GetDlgItem(IDC_EDIT7)->EnableWindow(temp); //GetCurState or RunMode? GetDlgItem(IDC_BUTTON13)->EnableWindow(temp); GetDlgItem(IDC_EDIT8)->EnableWindow(temp); GetDlgItem(IDC_BUTTON14)->EnableWindow(temp); GetDlgItem(IDC_BUTTON14)->SetWindowText("AutoRun"); //DebugMode? GetDlgItem(IDC_BUTTON15)->EnableWindow(temp); GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugDisable"); } bool CSMachineDlg::CreatMode(bool act) { CString log; if (act) { if (m_hDevLib != NULL) { FreeLibrary(m_hDevLib); m_hDevLib = NULL; } string strCFGPath(""); string strDLLPath(""); if (!OpenCFGAndGetDllPath(strCFGPath, strDLLPath)) { log.Format("%s OpenCFGAndGetDllPath failed", m_strLogTitle.c_str()); mLog::Error(log); ToolsDlgLog(log); return false; } m_hDevLib = LoadLibraryEx(strDLLPath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (m_hDevLib == NULL) { DWORD ret = GetLastError(); log.Format("%s Failed to load library ret = %d", m_strLogTitle.c_str(), ret); mLog::Error(log); ToolsDlgLog(log); return false; } auto funHandle = (_CreateStateMachine)GetProcAddress(m_hDevLib, "CreateDiosSMachine"); if (funHandle) { mLog::Debug("{$}get [CreateDiosSMachine]function successful", m_strLogTitle.c_str()); m_ptrSMachine = (DiosSMachine*)funHandle(); if (!m_ptrSMachine) { log.Format("%s CreateDiosSMachine failed", m_strLogTitle.c_str()); mLog::Error(log); ToolsDlgLog(log); return false; } } } else { auto funHandle = (_DeleteStateMachine)GetProcAddress(m_hDevLib, "DeleteDiosSMachine"); if (funHandle && m_ptrSMachine) { mLog::Debug("{$}get [DeleteDiosSMachine]function successful", m_strLogTitle.c_str()); funHandle((void*)m_ptrSMachine); } if (m_hDevLib != NULL) { FreeLibrary(m_hDevLib); m_hDevLib = NULL; } } return true; } //选择配置 void CSMachineDlg::OnBnClickedButton3() { CString log; nsCFG::CSMachineCfgDlg dlgcfg(Dev_SMachine, m_strCfgLib); dlgcfg.DoModal(); if (m_strCfgLib.empty()) { log.Format("(SMachine)- SMachine m_strCfgFile is empty"); mLog::Warn(log); ToolsDlgLog(log); } else { ShowPageElements(TRUE, FALSE, TRUE, FALSE); } } //初始化 void CSMachineDlg::OnBnClickedButton1() { CString log; if (!m_strCfgLib.empty()) { if (AppInitial(true)) { ShowPageElements(FALSE, TRUE, FALSE, FALSE); SetMagMap(); mLog::Debug("(SMachine)- SMachine Initial success"); } else { log.Format("(SMachine)- SMachine Initial fail"); mLog::Error(log); ToolsDlgLog(log); } } else { log.Format("(SMachine)- glo_pSMachine not empty"); mLog::Warn(log); ToolsDlgLog(log); } } //退出 void CSMachineDlg::OnBnClickedButton2() { if (AppInitial(false)) { ShowPageElements(TRUE, FALSE, TRUE, FALSE); } if (m_hNotifyThread != NULL) { SetEvent(m_hStateFinishFlag); WaitForSingleObject(m_hStateExitFlag, INFINITE); { mLog::Debug("Exit WaitforDriverNotify Finished"); m_hNotifyThread = NULL; } } } //LoadMachine void CSMachineDlg::OnBnClickedButton4() { CString log; CString tempStr; GetDlgItem(IDC_EDIT1)->GetWindowText(tempStr); ResDataObject tempConfig; if (tempConfig.loadFile(tempStr)) { m_strCfgFile = tempStr.GetBuffer(); m_ptrSMachine->LoadMachine(tempConfig); } else { log.Format("Load WorkflowFile[%s]failed", tempStr); mLog::Error(log); ToolsDlgLog(log); } mLog::Debug("Enter WaitforDriverNotify"); if (m_hNotifyThread == NULL) { DWORD m_HardwareStatusID; m_hNotifyThread = CreateThread(0, 0, WaitforStateNotify, this, 0, &m_HardwareStatusID); if (m_hNotifyThread == NULL) { mLog::Error("Start WaitforDriverNotify Thread Failed"); } } } //SetMSName void CSMachineDlg::OnBnClickedButton5() { CString log; CString tempStr; GetDlgItem(IDC_EDIT2)->GetWindowText(tempStr); string param = tempStr.GetBuffer(); m_ptrSMachine->SetStateMachineName(param); } //AddDevices void CSMachineDlg::OnBnClickedButton6() { CString log; CString tempStr; GetDlgItem(IDC_EDIT3)->GetWindowText(tempStr); ResDataObject json; CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT3); if (pEdit) { int lineCount = pEdit->SendMessage(EM_GETLINECOUNT); for (int i = 0; i < lineCount; ++i) { //处理获取到的每一行文本 CString index; index.Format("P%d", i); CString strTemp; int dataLengh = pEdit->LineLength(pEdit->LineIndex(i)); pEdit->GetLine(i, strTemp.GetBuffer(dataLengh), dataLengh); strTemp.ReleaseBuffer(dataLengh); json.add(index, strTemp); } } string param = tempStr.GetBuffer(); GetDlgItem(IDC_EDIT4)->GetWindowText(tempStr); string strWS = tempStr.GetBuffer(); m_ptrSMachine->AddDevices(json, strWS); } //InitPreState void CSMachineDlg::OnBnClickedButton7() { CString log; m_ptrSMachine->PrePareStateMachine(); } //StartSM void CSMachineDlg::OnBnClickedButton8() { CString log; m_ptrSMachine->StartStateMachine(); } //StopSM void CSMachineDlg::OnBnClickedButton9() { CString log; m_ptrSMachine->StopStateMachine(5000); } //TriggerEvent void CSMachineDlg::OnBnClickedButton10() { CString log; CString tempStr; GetDlgItem(IDC_EDIT5)->GetWindowText(tempStr); string param = tempStr.GetBuffer(); m_ptrSMachine->TriggerEvent(param); } //GetSMError void CSMachineDlg::OnBnClickedButton11() { CString log; CString tempStr; ResDataObject ErrInfo; tempStr = ErrInfo.encode(); GetDlgItem(IDC_EDIT6)->GetWindowText(tempStr); } //GetSMName void CSMachineDlg::OnBnClickedButton12() { CString log; CString tempStr; string param = m_ptrSMachine->GetStateMachineName(); tempStr = param.c_str(); GetDlgItem(IDC_EDIT7)->SetWindowText(tempStr); } //GoToState void CSMachineDlg::OnBnClickedButton13() { CString log; if (m_bRunMode) { CString tempStr; string param; m_ptrSMachine->GetCurrentState(param); tempStr = param.c_str(); GetDlgItem(IDC_EDIT8)->SetWindowText(tempStr); } else { m_ptrSMachine->SetRunningState(true); } } //RunMode? void CSMachineDlg::OnBnClickedButton14() { if (m_bRunMode) { m_bRunMode = false; GetDlgItem(IDC_BUTTON14)->SetWindowText("ManualRun"); } else { m_bRunMode = true; GetDlgItem(IDC_BUTTON14)->SetWindowText("AutoRun"); } } //DebugMode? void CSMachineDlg::OnBnClickedButton15() { if (m_bDebugMode) { m_bDebugMode = false; GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugDisable"); } else { m_bDebugMode = true; GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugEnable"); } m_ptrSMachine->SetDebugMode(m_bDebugMode); }