CSMachineDlg.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. // CSMachineDlg.cpp: 实现文件
  2. //
  3. #include "pch.h"
  4. #include "resource.h" // 主符号
  5. #include "CSMachineDlg.h"
  6. #include "afxdialogex.h"
  7. #include "CConfigDlg.h"
  8. //********************************状态机接口函数指针********************************
  9. typedef void*(__stdcall* _CreateStateMachine)(void);
  10. typedef void(__stdcall* _DeleteStateMachine)(void*);
  11. // CSMachineDlg 对话框
  12. IMPLEMENT_DYNAMIC(CSMachineDlg, CDiosBasicDlg)
  13. CSMachineDlg::CSMachineDlg(CWnd* pParent /*=nullptr*/)
  14. : CDiosBasicDlg(Dev_SMachine, IDD_DIALOG6, pParent)
  15. {
  16. InitLog();
  17. m_hStateFinishFlag = CreateEvent(NULL, FALSE, FALSE, 0);
  18. m_hStateExitFlag = CreateEvent(NULL, FALSE, FALSE, 0);
  19. m_strCfgFile = "xml or json";
  20. }
  21. CSMachineDlg::~CSMachineDlg()
  22. {
  23. ExitLog();
  24. }
  25. void CSMachineDlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialogEx::DoDataExchange(pDX);
  28. }
  29. BEGIN_MESSAGE_MAP(CSMachineDlg, CDialogEx)
  30. ON_BN_CLICKED(IDC_BUTTON3, &CSMachineDlg::OnBnClickedButton3)
  31. ON_BN_CLICKED(IDC_BUTTON1, &CSMachineDlg::OnBnClickedButton1)
  32. ON_BN_CLICKED(IDC_BUTTON2, &CSMachineDlg::OnBnClickedButton2)
  33. ON_BN_CLICKED(IDC_BUTTON4, &CSMachineDlg::OnBnClickedButton4)
  34. ON_BN_CLICKED(IDC_BUTTON5, &CSMachineDlg::OnBnClickedButton5)
  35. ON_BN_CLICKED(IDC_BUTTON6, &CSMachineDlg::OnBnClickedButton6)
  36. ON_BN_CLICKED(IDC_BUTTON7, &CSMachineDlg::OnBnClickedButton7)
  37. ON_BN_CLICKED(IDC_BUTTON8, &CSMachineDlg::OnBnClickedButton8)
  38. ON_BN_CLICKED(IDC_BUTTON9, &CSMachineDlg::OnBnClickedButton9)
  39. ON_BN_CLICKED(IDC_BUTTON10, &CSMachineDlg::OnBnClickedButton10)
  40. ON_BN_CLICKED(IDC_BUTTON11, &CSMachineDlg::OnBnClickedButton11)
  41. ON_BN_CLICKED(IDC_BUTTON12, &CSMachineDlg::OnBnClickedButton12)
  42. ON_BN_CLICKED(IDC_BUTTON13, &CSMachineDlg::OnBnClickedButton13)
  43. ON_BN_CLICKED(IDC_BUTTON14, &CSMachineDlg::OnBnClickedButton14)
  44. ON_BN_CLICKED(IDC_BUTTON15, &CSMachineDlg::OnBnClickedButton15)
  45. END_MESSAGE_MAP()
  46. // CSMachineDlg 消息处理程序
  47. //初始化配置
  48. BOOL CSMachineDlg::OnInitDialog()
  49. {
  50. CDiosBasicDlg::OnInitDialog();
  51. return TRUE;
  52. }
  53. DWORD CSMachineDlg::WaitforStateNotify(LPVOID pParam)
  54. {
  55. CString log;
  56. mLog::Debug("Begin WaitforDriverNotify");
  57. CSMachineDlg* pCurSM = (CSMachineDlg*)pParam;
  58. if (pCurSM == NULL)
  59. {
  60. return 0;
  61. }
  62. HANDLE HandleArray[3];
  63. HandleArray[0] = pCurSM->m_hStateFinishFlag;
  64. HandleArray[1] = pCurSM->m_ptrSMachine->GetStateTransEvent();
  65. bool loopFlag = true;
  66. while (loopFlag)
  67. {
  68. DWORD dwResult = WaitForMultipleObjects(2, HandleArray, FALSE, INFINITE);
  69. switch (dwResult)
  70. {
  71. case WAIT_OBJECT_0:
  72. {
  73. //mLog::Debug("StateNotifyThread: Exit!");
  74. loopFlag = false;
  75. }break;
  76. case WAIT_OBJECT_0 + 1:
  77. {
  78. string strname;
  79. pCurSM->m_ptrSMachine->GetCurrentState(strname);
  80. mLog::Info("PopStateChange[{$}]", strname.c_str());
  81. pCurSM->GetDlgItem(IDC_EDIT8)->SetWindowText(strname.c_str());
  82. if(pCurSM->m_bRunMode)
  83. {
  84. pCurSM->m_ptrSMachine->SetRunningState(true);
  85. }
  86. }break;
  87. case WAIT_TIMEOUT:
  88. {}break;
  89. default:
  90. break;
  91. }
  92. }
  93. SetEvent(pCurSM->m_hStateExitFlag);
  94. mLog::Debug("Exit WaitforDriverNotify Begin");
  95. return 1;
  96. }
  97. //设备初始化
  98. bool CSMachineDlg::AppInitial(bool act)
  99. {
  100. return CreatMode(act);
  101. }
  102. //初始化日志模块
  103. bool CSMachineDlg::InitLog()
  104. {
  105. //string strLogPath = GetProcessDirectory() + UnitTool_LogPath;
  106. ////Log4CPP::ThreadContext::Map::Set("LogFileName", cfgKey.c_str());
  107. //Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash(UnitTool_LogFileName), UnitTool_DevType_SM);
  108. //auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  109. //mLog::gLogger = Log4CPP::LogManager::GetLogger(UnitTool_DevType_SM);
  110. //string version;
  111. //if (GetVersion(version))
  112. //{
  113. // mLog::Info("===============log begin : [{$}] version:{$} ===================\n", UnitTool_DevType_SM, version.c_str());
  114. // return true;
  115. //}
  116. //else
  117. //{
  118. // mLog::Info("===============log begin : [{$}] version:0.0.0.0 ===================\n", UnitTool_DevType_SM);
  119. //}
  120. return true;
  121. }
  122. void CSMachineDlg::ExitLog()
  123. {
  124. //if (mLog::gLogger)
  125. //{
  126. // mLog::Info("===============log end ===================");
  127. // mLog::Close();
  128. // mLog::gLogger = nullptr;
  129. //}
  130. }
  131. //设置消息对照表
  132. void CSMachineDlg::SetMagMap()
  133. {
  134. CString log;
  135. if (m_hDevLib)
  136. {
  137. CString tempStr;
  138. tempStr.Format("%s", m_strCfgFile.c_str());
  139. GetDlgItem(IDC_EDIT1)->SetWindowText(tempStr);
  140. }
  141. }
  142. void CSMachineDlg::InitPageElements(bool act)
  143. {
  144. if (act)
  145. {
  146. ShowPageElements(FALSE, TRUE, FALSE, FALSE);
  147. SetMagMap();
  148. }
  149. else
  150. {
  151. ShowPageElements(TRUE, FALSE, TRUE, FALSE);
  152. }
  153. }
  154. //设置窗口元素显示
  155. void CSMachineDlg::ShowPageElements(bool init, bool exit, bool cfg, bool general)
  156. {
  157. __super::ShowPageElements(init, exit, cfg, general);
  158. bool temp = exit;
  159. //LoadMachine
  160. GetDlgItem(IDC_BUTTON4)->EnableWindow(temp);
  161. GetDlgItem(IDC_EDIT1)->EnableWindow(temp);
  162. //SetMSName
  163. GetDlgItem(IDC_BUTTON5)->EnableWindow(temp);
  164. GetDlgItem(IDC_EDIT2)->EnableWindow(temp);
  165. //AddDevices
  166. GetDlgItem(IDC_BUTTON6)->EnableWindow(temp);
  167. GetDlgItem(IDC_EDIT3)->EnableWindow(temp);
  168. GetDlgItem(IDC_EDIT4)->EnableWindow(temp);
  169. //InitPreState or StartSM or StopSM
  170. GetDlgItem(IDC_BUTTON7)->EnableWindow(temp);
  171. GetDlgItem(IDC_BUTTON8)->EnableWindow(temp);
  172. GetDlgItem(IDC_BUTTON9)->EnableWindow(temp);
  173. //SetRunState
  174. GetDlgItem(IDC_BUTTON10)->EnableWindow(temp);
  175. GetDlgItem(IDC_EDIT5)->EnableWindow(temp);
  176. //GetSMError
  177. GetDlgItem(IDC_BUTTON11)->EnableWindow(temp);
  178. GetDlgItem(IDC_EDIT6)->EnableWindow(temp);
  179. //GetSMName
  180. GetDlgItem(IDC_BUTTON12)->EnableWindow(temp);
  181. GetDlgItem(IDC_EDIT7)->EnableWindow(temp);
  182. //GetCurState or RunMode?
  183. GetDlgItem(IDC_BUTTON13)->EnableWindow(temp);
  184. GetDlgItem(IDC_EDIT8)->EnableWindow(temp);
  185. GetDlgItem(IDC_BUTTON14)->EnableWindow(temp);
  186. GetDlgItem(IDC_BUTTON14)->SetWindowText("AutoRun");
  187. //DebugMode?
  188. GetDlgItem(IDC_BUTTON15)->EnableWindow(temp);
  189. GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugDisable");
  190. }
  191. bool CSMachineDlg::CreatMode(bool act)
  192. {
  193. CString log;
  194. if (act)
  195. {
  196. if (m_hDevLib != NULL)
  197. {
  198. FreeLibrary(m_hDevLib);
  199. m_hDevLib = NULL;
  200. }
  201. string strCFGPath("");
  202. string strDLLPath("");
  203. if (!OpenCFGAndGetDllPath(strCFGPath, strDLLPath))
  204. {
  205. log.Format("%s OpenCFGAndGetDllPath failed", m_strLogTitle.c_str());
  206. mLog::Error(log);
  207. ToolsDlgLog(log);
  208. return false;
  209. }
  210. m_hDevLib = LoadLibraryEx(strDLLPath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  211. if (m_hDevLib == NULL)
  212. {
  213. DWORD ret = GetLastError();
  214. log.Format("%s Failed to load library ret = %d", m_strLogTitle.c_str(), ret);
  215. mLog::Error(log);
  216. ToolsDlgLog(log);
  217. return false;
  218. }
  219. auto funHandle = (_CreateStateMachine)GetProcAddress(m_hDevLib, "CreateDiosSMachine");
  220. if (funHandle)
  221. {
  222. mLog::Debug("{$}get [CreateDiosSMachine]function successful", m_strLogTitle.c_str());
  223. m_ptrSMachine = (DiosSMachine*)funHandle();
  224. if (!m_ptrSMachine)
  225. {
  226. log.Format("%s CreateDiosSMachine failed", m_strLogTitle.c_str());
  227. mLog::Error(log);
  228. ToolsDlgLog(log);
  229. return false;
  230. }
  231. }
  232. }
  233. else
  234. {
  235. auto funHandle = (_DeleteStateMachine)GetProcAddress(m_hDevLib, "DeleteDiosSMachine");
  236. if (funHandle && m_ptrSMachine)
  237. {
  238. mLog::Debug("{$}get [DeleteDiosSMachine]function successful", m_strLogTitle.c_str());
  239. funHandle((void*)m_ptrSMachine);
  240. }
  241. if (m_hDevLib != NULL)
  242. {
  243. FreeLibrary(m_hDevLib);
  244. m_hDevLib = NULL;
  245. }
  246. }
  247. return true;
  248. }
  249. //选择配置
  250. void CSMachineDlg::OnBnClickedButton3()
  251. {
  252. CString log;
  253. nsCFG::CSMachineCfgDlg dlgcfg(Dev_SMachine, m_strCfgLib);
  254. dlgcfg.DoModal();
  255. if (m_strCfgLib.empty())
  256. {
  257. log.Format("(SMachine)- SMachine m_strCfgFile is empty");
  258. mLog::Warn(log);
  259. ToolsDlgLog(log);
  260. }
  261. else
  262. {
  263. ShowPageElements(TRUE, FALSE, TRUE, FALSE);
  264. }
  265. }
  266. //初始化
  267. void CSMachineDlg::OnBnClickedButton1()
  268. {
  269. CString log;
  270. if (!m_strCfgLib.empty())
  271. {
  272. if (AppInitial(true))
  273. {
  274. ShowPageElements(FALSE, TRUE, FALSE, FALSE);
  275. SetMagMap();
  276. mLog::Debug("(SMachine)- SMachine Initial success");
  277. }
  278. else
  279. {
  280. log.Format("(SMachine)- SMachine Initial fail");
  281. mLog::Error(log);
  282. ToolsDlgLog(log);
  283. }
  284. }
  285. else
  286. {
  287. log.Format("(SMachine)- glo_pSMachine not empty");
  288. mLog::Warn(log);
  289. ToolsDlgLog(log);
  290. }
  291. }
  292. //退出
  293. void CSMachineDlg::OnBnClickedButton2()
  294. {
  295. if (AppInitial(false))
  296. {
  297. ShowPageElements(TRUE, FALSE, TRUE, FALSE);
  298. }
  299. if (m_hNotifyThread != NULL)
  300. {
  301. SetEvent(m_hStateFinishFlag);
  302. WaitForSingleObject(m_hStateExitFlag, INFINITE);
  303. {
  304. mLog::Debug("Exit WaitforDriverNotify Finished");
  305. m_hNotifyThread = NULL;
  306. }
  307. }
  308. }
  309. //LoadMachine
  310. void CSMachineDlg::OnBnClickedButton4()
  311. {
  312. CString log;
  313. CString tempStr;
  314. GetDlgItem(IDC_EDIT1)->GetWindowText(tempStr);
  315. ResDataObject tempConfig;
  316. if (tempConfig.loadFile(tempStr))
  317. {
  318. m_strCfgFile = tempStr.GetBuffer();
  319. m_ptrSMachine->LoadMachine(tempConfig);
  320. }
  321. else
  322. {
  323. log.Format("Load WorkflowFile[%s]failed", tempStr);
  324. mLog::Error(log);
  325. ToolsDlgLog(log);
  326. }
  327. mLog::Debug("Enter WaitforDriverNotify");
  328. if (m_hNotifyThread == NULL)
  329. {
  330. DWORD m_HardwareStatusID;
  331. m_hNotifyThread = CreateThread(0, 0, WaitforStateNotify, this, 0, &m_HardwareStatusID);
  332. if (m_hNotifyThread == NULL)
  333. {
  334. mLog::Error("Start WaitforDriverNotify Thread Failed");
  335. }
  336. }
  337. }
  338. //SetMSName
  339. void CSMachineDlg::OnBnClickedButton5()
  340. {
  341. CString log;
  342. CString tempStr;
  343. GetDlgItem(IDC_EDIT2)->GetWindowText(tempStr);
  344. string param = tempStr.GetBuffer();
  345. m_ptrSMachine->SetStateMachineName(param);
  346. }
  347. //AddDevices
  348. void CSMachineDlg::OnBnClickedButton6()
  349. {
  350. CString log;
  351. CString tempStr;
  352. GetDlgItem(IDC_EDIT3)->GetWindowText(tempStr);
  353. ResDataObject json;
  354. CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT3);
  355. if (pEdit)
  356. {
  357. int lineCount = pEdit->SendMessage(EM_GETLINECOUNT);
  358. for (int i = 0; i < lineCount; ++i)
  359. {
  360. //处理获取到的每一行文本
  361. CString index;
  362. index.Format("P%d", i);
  363. CString strTemp;
  364. int dataLengh = pEdit->LineLength(pEdit->LineIndex(i));
  365. pEdit->GetLine(i, strTemp.GetBuffer(dataLengh), dataLengh);
  366. strTemp.ReleaseBuffer(dataLengh);
  367. json.add(index, strTemp);
  368. }
  369. }
  370. string param = tempStr.GetBuffer();
  371. GetDlgItem(IDC_EDIT4)->GetWindowText(tempStr);
  372. string strWS = tempStr.GetBuffer();
  373. m_ptrSMachine->AddDevices(json, strWS);
  374. }
  375. //InitPreState
  376. void CSMachineDlg::OnBnClickedButton7()
  377. {
  378. CString log;
  379. m_ptrSMachine->PrePareStateMachine();
  380. }
  381. //StartSM
  382. void CSMachineDlg::OnBnClickedButton8()
  383. {
  384. CString log;
  385. m_ptrSMachine->StartStateMachine();
  386. }
  387. //StopSM
  388. void CSMachineDlg::OnBnClickedButton9()
  389. {
  390. CString log;
  391. m_ptrSMachine->StopStateMachine(5000);
  392. }
  393. //TriggerEvent
  394. void CSMachineDlg::OnBnClickedButton10()
  395. {
  396. CString log;
  397. CString tempStr;
  398. GetDlgItem(IDC_EDIT5)->GetWindowText(tempStr);
  399. string param = tempStr.GetBuffer();
  400. m_ptrSMachine->TriggerEvent(param);
  401. }
  402. //GetSMError
  403. void CSMachineDlg::OnBnClickedButton11()
  404. {
  405. CString log;
  406. CString tempStr;
  407. ResDataObject ErrInfo;
  408. tempStr = ErrInfo.encode();
  409. GetDlgItem(IDC_EDIT6)->GetWindowText(tempStr);
  410. }
  411. //GetSMName
  412. void CSMachineDlg::OnBnClickedButton12()
  413. {
  414. CString log;
  415. CString tempStr;
  416. string param = m_ptrSMachine->GetStateMachineName();
  417. tempStr = param.c_str();
  418. GetDlgItem(IDC_EDIT7)->SetWindowText(tempStr);
  419. }
  420. //GoToState
  421. void CSMachineDlg::OnBnClickedButton13()
  422. {
  423. CString log;
  424. if (m_bRunMode)
  425. {
  426. CString tempStr;
  427. string param;
  428. m_ptrSMachine->GetCurrentState(param);
  429. tempStr = param.c_str();
  430. GetDlgItem(IDC_EDIT8)->SetWindowText(tempStr);
  431. }
  432. else
  433. {
  434. m_ptrSMachine->SetRunningState(true);
  435. }
  436. }
  437. //RunMode?
  438. void CSMachineDlg::OnBnClickedButton14()
  439. {
  440. if (m_bRunMode)
  441. {
  442. m_bRunMode = false;
  443. GetDlgItem(IDC_BUTTON14)->SetWindowText("ManualRun");
  444. }
  445. else
  446. {
  447. m_bRunMode = true;
  448. GetDlgItem(IDC_BUTTON14)->SetWindowText("AutoRun");
  449. }
  450. }
  451. //DebugMode?
  452. void CSMachineDlg::OnBnClickedButton15()
  453. {
  454. if (m_bDebugMode)
  455. {
  456. m_bDebugMode = false;
  457. GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugDisable");
  458. }
  459. else
  460. {
  461. m_bDebugMode = true;
  462. GetDlgItem(IDC_BUTTON15)->SetWindowText("DebugEnable");
  463. }
  464. m_ptrSMachine->SetDebugMode(m_bDebugMode);
  465. }