FrmCctvOprMainF.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "ITSSkinF.h"
  4. #include "ITSUtilF.h"
  5. #include "ITSLangTransF.h"
  6. #include "ITSMapF.h"
  7. #pragma hdrstop
  8. #include "FrmCctvOprMainF.h"
  9. #include "TThreadPollingF.h"
  10. #include "FrmInitializeF.h" // 프로그램 초기화화면
  11. //---------------------------------------------------------------------------
  12. #include "CTV0100MF.h" // 정지영상 모니터링
  13. #include "CTV0300MF.h" // 상태 모니터링
  14. #include "CTV0500MF.h" // CCTV 제어
  15. #include "CTVM100MF.h" // 기본정보관리
  16. //---------------------------------------------------------------------------
  17. #ifndef ULONG_PTR
  18. #define ULONG_PTR unsigned long *
  19. #endif
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <list>
  23. #include <map>
  24. //---------------------------------------------------------------------------
  25. #pragma package(smart_init)
  26. #pragma link "cxClasses"
  27. #pragma link "cxContainer"
  28. #pragma link "cxControls"
  29. #pragma link "cxEdit"
  30. #pragma link "cxGraphics"
  31. #pragma link "cxHint"
  32. #pragma link "cxLabel"
  33. #pragma link "cxLookAndFeelPainters"
  34. #pragma link "cxLookAndFeels"
  35. #pragma link "cxMaskEdit"
  36. #pragma link "cxPC"
  37. #pragma link "cxPCdxBarPopupMenu"
  38. #pragma link "cxSpinEdit"
  39. #pragma link "cxTextEdit"
  40. #pragma link "dxBar"
  41. #pragma link "dxCustomHint"
  42. #pragma link "dxRibbon"
  43. #pragma link "dxRibbonGallery"
  44. #pragma link "dxRibbonSkins"
  45. #pragma link "dxRibbonStatusBar"
  46. #pragma link "dxScreenTip"
  47. #pragma link "dxSkinBlack"
  48. #pragma link "dxSkinBlue"
  49. #pragma link "dxSkinCaramel"
  50. #pragma link "dxSkinChooserGallery"
  51. #pragma link "dxSkinCoffee"
  52. #pragma link "dxSkinDarkRoom"
  53. #pragma link "dxSkinDarkSide"
  54. #pragma link "dxSkinFoggy"
  55. #pragma link "dxSkinGlassOceans"
  56. #pragma link "dxSkiniMaginary"
  57. #pragma link "dxSkinLilian"
  58. #pragma link "dxSkinLiquidSky"
  59. #pragma link "dxSkinLondonLiquidSky"
  60. #pragma link "dxSkinMcSkin"
  61. #pragma link "dxSkinMoneyTwins"
  62. #pragma link "dxSkinOffice2007Black"
  63. #pragma link "dxSkinOffice2007Blue"
  64. #pragma link "dxSkinOffice2007Green"
  65. #pragma link "dxSkinOffice2007Pink"
  66. #pragma link "dxSkinOffice2007Silver"
  67. #pragma link "dxSkinOffice2010Black"
  68. #pragma link "dxSkinOffice2010Blue"
  69. #pragma link "dxSkinOffice2010Silver"
  70. #pragma link "dxSkinsCore"
  71. #pragma link "dxSkinscxPCPainter"
  72. #pragma link "dxSkinsdxBarPainter"
  73. #pragma link "dxSkinsdxRibbonPainter"
  74. #pragma link "dxSkinSeven"
  75. #pragma link "dxSkinsForm"
  76. #pragma link "dxSkinSharp"
  77. #pragma link "dxSkinSilver"
  78. #pragma link "dxSkinStardust"
  79. #pragma link "dxStatusBar"
  80. #pragma link "dxTabbedMDI"
  81. #pragma link "IdAntiFreeze"
  82. #pragma link "IdAntiFreezeBase"
  83. #pragma link "IdBaseComponent"
  84. #pragma resource "*.dfm"
  85. TFrmCctvOprMain *FrmCctvOprMain = NULL;
  86. #define MAX_EXEPROGRAM 5
  87. ST_RUNPROGRAM g_RunProgram[MAX_EXEPROGRAM+1] = {
  88. {"TFrmCctvLogStts", "CctvLogStts.exe", "CCTV상태이력조회"},
  89. {"TFrmCctvLogMsg", "CctvLogMsg.exe", "CCTV제공이력조회"},
  90. {"TFrmCctvLogCtl", "CctvLogCtl.exe", "CCTV제어이력조회"},
  91. {"TFrmCctvLogDnld", "CctvLogDnld.exe", "CCTV다운로드이력조회"},
  92. {"TFrmCctvCamViewer", "CctvCamViewer.exe", "CCTV영상모니터링"},
  93. {"", "", ""},
  94. };
  95. //---------------------------------------------------------------------------
  96. __fastcall TFrmCctvOprMain::TFrmCctvOprMain(TComponent* Owner)
  97. : TdxCustomRibbonForm(Owner)//TdxCustomRibbonForm(Owner)//TForm(Owner)
  98. {
  99. FLogoutTick = 0;
  100. DoubleBuffered = true;
  101. g_AppCfg.lMainWinHandle = (long)Handle;
  102. StartJobThread();
  103. while(!PostJobMessage(WM_THREAD, WP_PING)) ;
  104. Application->OnException = OnAppException;
  105. ::CoInitialize(NULL);
  106. //Caption = g_AppCfg.sTitle;
  107. LangTrans->Translate(this, ITSDb_GetConnection());
  108. ITSSkin_Initialize(Application, g_AppCfg.sLang, true, true);
  109. ITSSkin_Menu(this);
  110. String sCaption = "";
  111. ReadConfigInfo(g_AppCfg.sConfigFile, "APPLICATION", "CAPTION", sCaption);
  112. ITSSkin_Caption(sCaption == "1" ? true : false);
  113. BarVmsSys1->Visible = false;
  114. BarVmsMngr2->Visible = false;
  115. BarVmsMngr3->Visible = false;
  116. TabVmsFormMngr->Visible = false;
  117. TabVmsSchMngr->Visible = false;
  118. RVMSH200M->Visible = ivNever;
  119. RVMSH400M->Visible = ivNever;
  120. TabVmsConfig->Visible = false;
  121. NVMS0200M->Visible = ivNever;
  122. NVMSM300M->Visible = ivNever; //VMS정보제공축관리
  123. NVMSM310M->Visible = ivNever; //VMS정보제공축설정
  124. Ribbon->ShowTabGroups = true; // 메뉴탭 show/hide
  125. Ribbon->QuickAccessToolbar->Visible = false;
  126. //Ribbon->ApplicationButton->Visible = false;
  127. Ribbon->SupportNonClientDrawing = true;
  128. Ribbon->EnableTabAero = true;
  129. TabVmsSystem->Active = true;
  130. SetColorScheme(g_AppCfg.sSkinName);
  131. //SetColorScheme("Blue");
  132. CMM_SetFormPosition(g_AppCfg.bSaveForm);
  133. CMM_LoadForm(g_sFormsDir, this);
  134. FCommServerState = vms_normal;
  135. TmrOnShow->Enabled = false;
  136. TmrAppState->Enabled = false;
  137. }
  138. //---------------------------------------------------------------------------
  139. LONG __stdcall HelperExceptionFilter(struct _EXCEPTION_POINTERS * pContext)
  140. {
  141. LONG lRet = EXCEPTION_EXECUTE_HANDLER;
  142. DWORD dwRet = ERROR_SUCCESS;
  143. __try
  144. {
  145. Application->NormalizeTopMosts();
  146. if (g_AppCfg.sLang == "kr")
  147. {
  148. Application->MessageBox(L"시스템에서 알수없는 오류가 발생했습니다.\r\n프로그램을 다시 기동해 주세요.",
  149. L"시스템 오류", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  150. }
  151. else
  152. {
  153. Application->MessageBox(L"The system encountered an unknown error.\r\nPlease re-start the program.",
  154. L"System error", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  155. }
  156. Application->RestoreTopMosts();
  157. //TerminateProcess(GetCurrentProcess(), 0);
  158. }
  159. __finally
  160. {
  161. if(ERROR_SUCCESS != dwRet)
  162. {
  163. lRet = EXCEPTION_CONTINUE_SEARCH;
  164. }
  165. exit(0);
  166. }
  167. return lRet;
  168. }
  169. //---------------------------------------------------------------------------
  170. /*
  171. * Form이 메모리에서 생성될때 호출되는 생성자 이벤트 핸들러
  172. * arguments
  173. * Sender : event handler 객체
  174. * return
  175. * void
  176. */
  177. void __fastcall TFrmCctvOprMain::FormCreate(TObject *Sender)
  178. {
  179. /* 레지스터리 등록 IE 최신버전 */
  180. String sExeName = ExtractFileName(Application->ExeName);
  181. ITSMap_Init(sExeName);
  182. //SetUnhandledExceptionFilter(HelperExceptionFilter);
  183. Application->ShowMainForm = false;
  184. try {
  185. Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
  186. } catch(...) { ShowMessage("LoadFromResourceName failed"); }
  187. //DeleteLogFiles((PTCHAR)g_sLogDir.c_str(), 30, (PTCHAR)"*.*");
  188. //WindowState = wsMaximized;
  189. // 종료조건이 있는경우..
  190. //Application->Terminate();
  191. //return;
  192. Application->ShowMainForm = true;
  193. Application->OnHint = OnAppHint;
  194. ImgAlarm->Visible = false;
  195. ImgAlarmNormal->Visible = true;
  196. }
  197. //---------------------------------------------------------------------------
  198. void __fastcall TFrmCctvOprMain::FormShow(TObject *Sender)
  199. {
  200. Application->ProcessMessages();
  201. g_AppCfg.lMainWinHandle = (long)Handle;
  202. /*
  203. * 프로그램 초기화 작업
  204. */
  205. InitStatusBar();
  206. if (g_pLOGIN)
  207. {
  208. GetUserMenuRight(g_pLOGIN->sUserId, g_pLOGIN->sUserRightId);
  209. }
  210. TmrOnShow->Enabled = true;
  211. }
  212. //---------------------------------------------------------------------------
  213. /*
  214. * 프로그램 기동후 최초에 수행된다.
  215. * arguments
  216. *
  217. * return
  218. * void
  219. */
  220. void __fastcall TFrmCctvOprMain::TmrOnShowTimer(TObject *Sender)
  221. {
  222. TmrOnShow->Enabled = false;
  223. Application->ProcessMessages();
  224. //폴링작업 객체 초기화
  225. FPollTraffic.Cycle = (60*1000*2)+11; // 정보제공구간소통정보
  226. FPollVmsMsg.Cycle = (60*1000*2)+15; // VMS Message
  227. FPollVmsState.Cycle = (60*1000*2)+ 1; // 시설물상태정보
  228. FPollPrcsState.Cycle = (60*1000*2)+ 3; // 프로세스상태정보
  229. FPollIncident.Cycle = (60*1000*2)+ 5; // 돌발정보
  230. FPollTraffic.IsPolling = true;
  231. FPollVmsMsg.IsPolling = true;
  232. FPollVmsState.IsPolling = true;
  233. FPollPrcsState.IsPolling = true;
  234. FPollIncident.IsPolling = true;
  235. TFrmInitialize *FrmInitialize = new TFrmInitialize(this);
  236. FrmInitialize->FThreadId = g_AppCfg.thr.dwThreadId;
  237. FrmInitialize->ShowModal();
  238. UpdateVmsCommStatus(true);
  239. int nPort = 4602;
  240. TItsProcess *pPrcs = ItsProcessManager->FLists.Find(g_AppCfg.sProcessId);
  241. if (!pPrcs)
  242. {
  243. if (g_AppCfg.sLang == "kr")
  244. {
  245. Application->MessageBox(L"통신프로세스를 초기화 하지 못하였습니다.\r\n환경설정에서 시스템ID를 확인하세요.\r\n프로그램을 종료합니다.",
  246. L"프로그램 통신오류_1", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  247. }
  248. else
  249. {
  250. Application->MessageBox(L"Failed to initialize communication process.\r\nPlease check your system ID in preferences.\r\nExit the program.",
  251. L"Program communication error_1", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  252. }
  253. g_AppCfg.bAppClose = true;
  254. Close();
  255. return;
  256. }
  257. nPort = pPrcs->PRGM_PORT.ToIntDef(4602);
  258. nPort += 1; //VMS운영단말은 DB에 저장되어 있지 않기 때문에 포트번호를 1 증가시켜 통신한다.
  259. int nResult = CComm_Initialize((long)Handle, g_AppCfg.sProcessId, "UOT", nPort, g_AppCfg.sLogDay);
  260. if (VERR_NONE != nResult)
  261. {
  262. if (g_AppCfg.sLang == "kr")
  263. {
  264. Application->MessageBox(L"통신프로세스를 초기화 하지 못하였습니다.\r\n환경설정에서 시스템ID를 확인하세요.\r\n프로그램을 종료합니다.",
  265. L"프로그램 통신오류_1", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  266. }
  267. else
  268. {
  269. Application->MessageBox(L"Failed to initialize communication process.\r\nPlease check your system ID in preferences.\r\nExit the program.",
  270. L"Program communication error_1", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  271. }
  272. g_AppCfg.bAppClose = true;
  273. Close();
  274. return;
  275. }
  276. FOR_STL(TItsProcess*, pObj, ItsProcessManager->FLists)
  277. {
  278. if (pObj->DEL_YN == "Y") continue;
  279. AnsiString sProcessId = AnsiString(pObj->SYST_ID);
  280. AnsiString sSystemTp = AnsiString(pObj->SYST_TYPE);
  281. AnsiString sIpAddress = AnsiString(pObj->SYST_IP_1);
  282. AnsiString sUdpPort = AnsiString(pObj->PRGM_PORT);
  283. if (CComm_AddProcess(sProcessId, sSystemTp, sIpAddress, sUdpPort) >= 0)
  284. {
  285. if ("UOT" == sSystemTp)
  286. {
  287. nPort = sUdpPort.ToIntDef(0);
  288. CComm_AddProcess(sProcessId, sSystemTp, sIpAddress, AnsiString(nPort+3));
  289. }
  290. }
  291. }
  292. if (VERR_NONE != CComm_Open())
  293. {
  294. if (g_AppCfg.sLang == "kr")
  295. {
  296. Application->MessageBox(L"통신프로세스를 초기화 하지 못하였습니다.\r\n환경설정에서 시스템ID를 확인하세요.\r\n프로그램을 종료합니다.",
  297. L"프로그램 통신오류_3", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  298. }
  299. else
  300. {
  301. Application->MessageBox(L"Failed to initialize communication process.\r\nPlease check your system ID in preferences.\r\nExit the program.",
  302. L"Program communication error_3", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  303. }
  304. g_AppCfg.bAppClose = true;
  305. Close();
  306. return;
  307. }
  308. UpdateInterCommStatus(true);
  309. Application->ProcessMessages();
  310. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex = ITSDb_IsOpen() ? 8 : 7;
  311. //TODO NITS0000MClick((TObject *)NITS0000M); //메인화면을 프로그램 기동과 동시에 호출하는 경우
  312. #if 0
  313. if (g_AppCfg.AutoLogout.LogoutExit)
  314. {
  315. Application->MessageBox(L"이전 프로그램은 자동로그아웃으로 종료되었습니다.\r\n프로그램을 실행합니다.",
  316. L"프로그램 실행정보", MB_OK|MB_ICONQUESTION|MB_APPLMODAL);
  317. }
  318. #endif
  319. g_AppCfg.AutoLogout.LogoutExit = false;
  320. TmrAppState->Enabled = true;
  321. TmrPolling->Enabled = true;
  322. TmrCommTimeout->Enabled = true;
  323. INT_VMS_STATE_REQ Req;
  324. memset((char*)&Req, 0x00, sizeof(Req));
  325. Req.Count = 0;
  326. Req.Type = vms_state_all;
  327. CComm_VmsStateReq(&Req);
  328. }
  329. //---------------------------------------------------------------------------
  330. /*
  331. * 작업스레드 생성
  332. * arguments
  333. *
  334. * return
  335. * void
  336. */
  337. bool __fastcall TFrmCctvOprMain::StartJobThread()
  338. {
  339. TThreadPolling *pPollingThread = new TThreadPolling(false);
  340. if (pPollingThread)
  341. {
  342. pPollingThread->OnTerminate = OnPollingThreadDone;
  343. g_AppCfg.thr.pThread = (TThread *)pPollingThread;
  344. g_AppCfg.thr.dwThreadId = pPollingThread->ThreadID;
  345. g_AppCfg.thr.nHandle = pPollingThread->Handle;
  346. //pPollingThread->Resume();
  347. return true;
  348. }
  349. return false;
  350. }
  351. //---------------------------------------------------------------------------
  352. /*
  353. * 작업스레드 종료
  354. * arguments
  355. *
  356. * return
  357. * void
  358. */
  359. void __fastcall TFrmCctvOprMain::TerminateJobThread()
  360. {
  361. if (g_AppCfg.thr.bRunning)
  362. {
  363. PostJobMessage(WM_THREAD, WM_QUIT);
  364. }
  365. Sleep(500);
  366. try
  367. {
  368. if (g_AppCfg.thr.bRunning)
  369. {
  370. TThreadPolling *pThread = (TThreadPolling *)g_AppCfg.thr.pThread;
  371. pThread->Terminate();
  372. //pThread->WaitFor();
  373. }
  374. g_AppCfg.thr.pThread = NULL;
  375. g_AppCfg.thr.dwThreadId = 0;
  376. g_AppCfg.thr.nHandle = 0;
  377. g_AppCfg.thr.bRunning = false;
  378. }
  379. catch(...)
  380. {
  381. }
  382. }
  383. //---------------------------------------------------------------------------
  384. /*
  385. * Form이 닫히기 전에 프로그램의 종료여부를 확인한다.
  386. * arguments
  387. *
  388. * return
  389. * void
  390. */
  391. void __fastcall TFrmCctvOprMain::FormCloseQuery(TObject *Sender, bool &CanClose)
  392. {
  393. // 폼이 닫히기 전에 수행해야 할 모뮬 기술
  394. // 프로그램 종료를 사용자가 확인할 수 있도록...
  395. if (!g_AppCfg.bAppClose)
  396. {
  397. #if 0
  398. String strMsg;
  399. strMsg = "";
  400. strMsg = "[ " + g_AppCfg.sTitle + " ]\r\n\n";
  401. strMsg+= FrmLang->cxLabel1->Caption;
  402. if(Application->MessageBox(strMsg.c_str(),
  403. FrmLang->cxLabel2->Caption.c_str(),
  404. MB_YESNO|MB_ICONQUESTION) == IDYES)
  405. {
  406. /*
  407. * 화면관련 작업을 못하도록 여기에 코드를 적자...
  408. */
  409. ITSDb_ApplicationTerm();
  410. g_AppCfg.bAppClose = true;
  411. }
  412. #else
  413. ITSDb_ApplicationTerm();
  414. g_AppCfg.bAppClose = true;
  415. #endif
  416. CanClose = false;
  417. }
  418. }
  419. //---------------------------------------------------------------------------
  420. /*
  421. * Form을 닫을때 호출되는 event 메서드
  422. * arguments
  423. * Sender : event handler 객체
  424. * Action : TCloseAction 객체
  425. * return
  426. * void
  427. */
  428. void __fastcall TFrmCctvOprMain::FormClose(TObject *Sender, TCloseAction &Action)
  429. {
  430. CommClose();
  431. Action = caFree;
  432. }
  433. //---------------------------------------------------------------------------
  434. /*
  435. * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
  436. * Form과 DataModule class를 delete시킨다.
  437. * arguments
  438. *
  439. * return
  440. * void
  441. */
  442. void __fastcall TFrmCctvOprMain::CommClose()
  443. {
  444. try
  445. {
  446. CComm_Close();
  447. CloseAllWindow();
  448. ITSSkin_Term();
  449. CMM_SaveForm(g_sFormsDir, this);
  450. WriteConfigInfo(g_AppCfg.sConfigFile, "APPLICATION", "LOGDAY", Now().FormatString("dd"));
  451. ::CoUninitialize();
  452. }
  453. catch(...)
  454. {
  455. }
  456. }
  457. //---------------------------------------------------------------------------
  458. /*
  459. * 열려있는 모든 Form Window들을 닫는다.
  460. * parameter
  461. * Sender : Event를 보낸 객체
  462. * return
  463. * None
  464. */
  465. void __fastcall TFrmCctvOprMain::CloseAllWindow()
  466. {
  467. int ii;
  468. if (g_AppCfg.bTermChildProg)
  469. {
  470. // 실행시킨 프로그램을 종료시킨다.
  471. for (ii = 0; ii < MAX_EXEPROGRAM; ii++)
  472. {
  473. if (g_RunProgram[ii].AClassName == "")
  474. continue;
  475. TermItsProgram(g_RunProgram[ii].AClassName, "");
  476. }
  477. }
  478. //실행중인 화면을 종료 시킨다.
  479. try {
  480. for (ii = 0; ii < Screen->FormCount; ii++)
  481. {
  482. if (Screen->Forms[ii] != this)
  483. {
  484. if (::IsWindow(Screen->Forms[ii]->Handle))
  485. {
  486. String sFormName = Screen->Forms[ii]->Name;
  487. if (sFormName == "ITSSkin") continue;
  488. if (sFormName == "FrmSkin") continue;
  489. if (sFormName == "FrmLang") continue;
  490. if (sFormName.SubString(1, 11) == "PlugInChart") continue;
  491. if (Screen->Forms[ii]->Owner == this ||
  492. Screen->Forms[ii]->Owner == Application)
  493. {
  494. Screen->Forms[ii]->Close();
  495. WaitForSingleObject(Screen->Forms[ii]->Handle, 500);
  496. }
  497. }
  498. }
  499. }
  500. } catch(...) {}
  501. }
  502. //---------------------------------------------------------------------------
  503. void __fastcall TFrmCctvOprMain::CloseChildWindow()
  504. {
  505. int ii;
  506. //실행중인 화면을 종료 시킨다.
  507. try {
  508. for (ii = 0; ii < Screen->FormCount; ii++)
  509. {
  510. if (Screen->Forms[ii] != this)
  511. {
  512. if (::IsWindow(Screen->Forms[ii]->Handle))
  513. {
  514. String sFormName = Screen->Forms[ii]->Name;
  515. if (sFormName == "ITSSkin") continue;
  516. if (sFormName == "FrmSkin") continue;
  517. if (sFormName == "FrmLang") continue;
  518. if (sFormName.SubString(1, 11) == "PlugInChart") continue;
  519. if (Screen->Forms[ii]->Owner == this ||
  520. Screen->Forms[ii]->Owner == Application ||
  521. Screen->Forms[ii]->FormStyle == fsMDIChild)
  522. {
  523. Screen->Forms[ii]->Close();
  524. WaitForSingleObject(Screen->Forms[ii]->Handle, 500);
  525. }
  526. }
  527. }
  528. }
  529. } catch(...) {}
  530. }
  531. //---------------------------------------------------------------------------
  532. /*
  533. * 매1초 마다 주기적으로 실행되는 타이머
  534. * arguments
  535. * Sender : event handler 객체
  536. * return
  537. * void
  538. */
  539. void __fastcall TFrmCctvOprMain::TmrAppStateTimer(TObject *Sender)
  540. {
  541. /*
  542. * 타이머가 1초간격으로 응용프로그램의 상태를 체크하고
  543. * 응용프로그램의 상태를 주기적으로 체크하여 필요한 조치를 수행한다.
  544. */
  545. if (g_AppCfg.bAppClose)
  546. {
  547. TmrAppState->Enabled = false;
  548. TmrPolling->Enabled = false;
  549. UserLogout(); // 로그아웃
  550. TerminateJobThread();
  551. ITSDb_Close();
  552. Close(); // 응용프로그램 종료
  553. }
  554. else
  555. {
  556. TmrAppState->Enabled = false;
  557. UpdateStatusBar();
  558. if (g_AppCfg.AutoLogout.Enabled)
  559. {
  560. FLogoutTick++;
  561. if (FLogoutTick > (g_AppCfg.AutoLogout.IntervalMin*60))
  562. {
  563. //자동로그아웃처리
  564. g_AppCfg.bAppClose = true;
  565. g_AppCfg.AutoLogout.LogoutExit = true;
  566. }
  567. }
  568. TmrAppState->Enabled = true;
  569. }
  570. }
  571. //---------------------------------------------------------------------------
  572. void __fastcall TFrmCctvOprMain::UpdateInterCommStatus(bool AOk)
  573. {
  574. int nImgIdx = 8;
  575. if (AOk == false) nImgIdx = 7;
  576. if (((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbComm]->PanelStyle)->ImageIndex != nImgIdx)
  577. {
  578. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbComm]->PanelStyle)->ImageIndex = nImgIdx;
  579. }
  580. }
  581. //---------------------------------------------------------------------------
  582. void __fastcall TFrmCctvOprMain::UpdateVmsCommStatus(bool ADb)
  583. {
  584. if (ADb)
  585. {
  586. FOR_STL(TItsProcess*, pPrcs, ItsProcessManager->FLists)
  587. {
  588. if (pPrcs->SYST_TYPE == "VMS")
  589. {
  590. if (pPrcs->FCommStatus == "1")
  591. {
  592. FCommServerState = vms_normal;
  593. }
  594. else
  595. {
  596. FCommServerState = vms_error;
  597. }
  598. break;
  599. }
  600. }
  601. }
  602. int nImgIdx = 8;
  603. if (FCommServerState == vms_error) nImgIdx = 7;
  604. if (((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbVmsComm]->PanelStyle)->ImageIndex != nImgIdx)
  605. {
  606. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbVmsComm]->PanelStyle)->ImageIndex = nImgIdx;
  607. }
  608. }
  609. //---------------------------------------------------------------------------
  610. void __fastcall TFrmCctvOprMain::UpdateStatusBar()
  611. {
  612. try
  613. {
  614. dxStatusBar->Panels->Items[isbTime]->Text = Now().FormatString(STR_DATETIME);
  615. #if 0
  616. if (ITSDb_IsOpen())
  617. {
  618. if (((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex != 8)
  619. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex = 8;
  620. }
  621. else
  622. {
  623. if (((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex != 7)
  624. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex = 7;
  625. }
  626. #endif
  627. }
  628. catch(...)
  629. {
  630. }
  631. }
  632. //---------------------------------------------------------------------------
  633. void __fastcall TFrmCctvOprMain::DebugMsg(String AMsg)
  634. {
  635. dxStatusBar->Panels->Items[isbMsg]->Text = " " + AMsg;
  636. dxStatusBar->Panels->Items[isbMsg]->StatusBarControl->Refresh();
  637. TmrDebugHide->Enabled = false;
  638. TmrDebugHide->Enabled = true;
  639. LOGINFO(AnsiString(AMsg).c_str());
  640. }
  641. //---------------------------------------------------------------------------
  642. void __fastcall TFrmCctvOprMain::TmrDebugHideTimer(TObject *Sender)
  643. {
  644. dxStatusBar->Panels->Items[isbMsg]->Text = "";
  645. dxStatusBar->Panels->Items[isbMsg]->StatusBarControl->Refresh();
  646. TmrDebugHide->Enabled = false;
  647. }
  648. //---------------------------------------------------------------------------
  649. void __fastcall TFrmCctvOprMain::InitStatusBar()
  650. {
  651. try
  652. {
  653. dxStatusBar->Panels->Items[isbGisPos]->Text = "";
  654. dxStatusBar->Panels->Items[isbTime]->Text = Now().FormatString(STR_DATETIME);
  655. if (g_pLOGIN)
  656. {
  657. dxStatusBar->Panels->Items[isbUser]->Text = g_pLOGIN->sUserId;
  658. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbUser]->PanelStyle)->ImageIndex = 9;
  659. }
  660. dxStatusBar->Panels->Items[isbHint]->Text = "";
  661. dxStatusBar->Panels->Items[isbMsg]->Text = "";
  662. UpdateStatusBar();
  663. }
  664. catch(...)
  665. {
  666. }
  667. }
  668. //---------------------------------------------------------------------------
  669. bool __fastcall TFrmCctvOprMain::GetUserMenuRight(String AUserId, String AUserRight)
  670. {
  671. String sQry;
  672. TADOQuery *pADO = NULL;
  673. try
  674. {
  675. sQry = "SELECT OPERSYST_MENU_ID \r\n"
  676. " FROM TB_USER_GROP_MENU_ATHR \r\n"
  677. " WHERE ATHR_YN = 'N' \r\n"
  678. " AND GROP_ID = (SELECT GROP_ID \r\n"
  679. " FROM TB_USER_INFR \r\n"
  680. " WHERE USER_ID = :p01) \r\n";
  681. try
  682. {
  683. pADO = new TADOQuery(NULL);
  684. pADO->Close();
  685. pADO->Connection = ITSDb_GetConnection();
  686. ITSDb_SQLText(pADO, sQry);
  687. ITSDb_SQLBind(pADO, "p01", AUserId);
  688. ITSDb_SQLOpen(pADO);
  689. for( ; !pADO->Eof; pADO->Next())
  690. {
  691. String sMenuId = pADO->FieldByName("OPERSYST_MENU_ID")->AsString;
  692. try
  693. {
  694. int nCompnentCnt = this->ComponentCount;
  695. for (int ii = 0; ii < nCompnentCnt; ii++)
  696. {
  697. String sClassName = this->Components[ii]->ClassName();
  698. if(sClassName == "TdxBarLargeButton")
  699. {
  700. TdxBarLargeButton *pMenu = (TdxBarLargeButton *)this->Components[ii];
  701. if (pMenu->Name == sMenuId)
  702. {
  703. pMenu->Enabled = false;
  704. break;
  705. }
  706. }
  707. }
  708. }
  709. catch(...)
  710. {
  711. }
  712. }
  713. }
  714. catch(EDatabaseError &E)
  715. {
  716. DBERRORLOG("TFrmMain::GetUserMenuRight", String(E.ClassName()), E.Message, sQry);
  717. throw Exception(String(E.ClassName()) + E.Message);
  718. }
  719. catch(Exception &e)
  720. {
  721. DBERRORLOG("TFrmMain::GetUserMenuRight", String(e.ClassName()), e.Message, sQry);
  722. throw Exception(String(e.ClassName()) + e.Message);
  723. }
  724. }
  725. __finally
  726. {
  727. if (pADO)
  728. {
  729. pADO->Close();
  730. delete pADO;
  731. }
  732. }
  733. return true;
  734. }
  735. //---------------------------------------------------------------------------
  736. HWND __fastcall TFrmCctvOprMain::FindChildWindow(String sFormName)
  737. {
  738. int nFormCnt = Screen->FormCount;
  739. for (int ii = 0; ii < nFormCnt; ii++)
  740. {
  741. TForm *pForm = Screen->Forms[ii];
  742. String sTmpFormName = pForm->Name.SubString(1, sFormName.Length());
  743. if (sTmpFormName == sFormName)
  744. {
  745. return pForm->Handle;
  746. }
  747. }
  748. return NULL;
  749. }
  750. //---------------------------------------------------------------------------
  751. void __fastcall TFrmCctvOprMain::OnSkinClick(TObject *Sender)
  752. {
  753. TdxBarButton *pMenu = (TdxBarButton*)Sender;
  754. try {
  755. dxSkinController1->SkinName = pMenu->Caption;
  756. dxSkinController1->Refresh();
  757. //ITSSkin_SetName(dxSkinController1->SkinName);
  758. } catch(...) {}
  759. }
  760. //---------------------------------------------------------------------------
  761. void __fastcall TFrmCctvOprMain::TmrPollingTimer(TObject *Sender)
  762. {
  763. TmrPolling->Enabled = false;
  764. DWORD dwTick = GetTickCount();
  765. UpdateThreadStatus(true); //작업스레드 실행 확인
  766. // 프로세스상태정보
  767. if (FPollPrcsState.IsPolling && FPollPrcsState.IsPollingTime(dwTick))
  768. {
  769. FPollPrcsState.Polling = dwTick;
  770. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_00);
  771. DebugMsg(">>> Process Status Request");//">>> 프로세스 상태 조회 요청");
  772. }
  773. // VMS상태정보
  774. if (FPollVmsState.IsPolling && FPollVmsState.IsPollingTime(dwTick))
  775. {
  776. FPollVmsState.Polling = dwTick;
  777. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_01);
  778. DebugMsg(">>> VMS Status Request");//">>> VMS 상태 조회 요청");
  779. }
  780. // VMS Message
  781. if (FPollVmsMsg.IsPolling && FPollVmsMsg.IsPollingTime(dwTick))
  782. {
  783. FPollVmsMsg.Polling = dwTick;
  784. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_02);
  785. DebugMsg(">>> VMS Display Message Request");//">>> VMS 표출메시지 조회 요청");
  786. }
  787. // 소통정보
  788. if (FPollTraffic.IsPolling && FPollTraffic.IsPollingTime(dwTick))
  789. {
  790. SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
  791. FPollTraffic.Polling = dwTick;
  792. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_03);
  793. DebugMsg(">>> Traffic Request");//">>> 소통정보 조회 요청");
  794. }
  795. // 돌발정보
  796. if (FPollIncident.IsPolling && FPollIncident.IsPollingTime(dwTick))
  797. {
  798. FPollIncident.Polling = dwTick;
  799. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_05);
  800. DebugMsg(">>> Incident Request");//">>> 돌발정보 조회 요청");
  801. }
  802. if (!g_AppCfg.bAppClose) TmrPolling->Enabled = true;
  803. }
  804. //---------------------------------------------------------------------------
  805. /*
  806. * 작업스레드로 작업 메시지를 전송한다.
  807. * arguments
  808. *
  809. * return
  810. * void
  811. */
  812. bool __fastcall TFrmCctvOprMain::PostJobMessage(UINT nMsg, int WParam/*=0*/, int LParam/*=0*/)
  813. {
  814. int nRes;
  815. //if (g_AppCfg.bDebug) ITSUtil_Trace("PostJobMessage: Msg: %02X, WParam: %02X, LParam: %02X", nMsg, WParam, LParam);
  816. if (g_AppCfg.thr.dwThreadId)
  817. {
  818. for (int ii = 0; ii < 3; ii++)
  819. {
  820. if (PostThreadMessageW(g_AppCfg.thr.dwThreadId, nMsg, WParam, LParam))
  821. {
  822. nRes = 0;
  823. return true;
  824. }
  825. else
  826. {
  827. nRes = GetLastError();
  828. if (ERROR_INVALID_THREAD_ID == nRes)
  829. {
  830. Sleep(500);
  831. continue;
  832. }
  833. }
  834. }
  835. }
  836. return false;
  837. }
  838. //---------------------------------------------------------------------------
  839. void __fastcall TFrmCctvOprMain::dxSkinChooserGalleryItem1SkinChanged(TObject *Sender, const UnicodeString ASkinName)
  840. {
  841. g_AppCfg.sSkinName = ASkinName;
  842. WriteConfigInfo(g_AppCfg.sConfigFile, "APPLICATION", "SKINNAME", g_AppCfg.sSkinName);
  843. SetColorScheme(ASkinName);
  844. }
  845. //---------------------------------------------------------------------------
  846. void __fastcall TFrmCctvOprMain::SetColorScheme(String ASkinName)
  847. {
  848. Ribbon->ColorSchemeName = ASkinName;
  849. dxSkinController1->SkinName = ASkinName;
  850. dxSkinController1->Refresh();
  851. dxTabbedMDIManager1->LookAndFeel->SkinName = ASkinName;
  852. dxStatusBar->Invalidate();
  853. //Panel1->Color = Ribbon->ColorScheme->GetPartColor(rfspRibbonForm);
  854. //Ribbon.ColorSchemeName := AName;
  855. //SkinChooserSelectSkinName(AName);
  856. //Panel1.Color := Ribbon.ColorScheme.GetPartColor(rfspRibbonForm);
  857. //dxStatusBar.Invalidate;
  858. }
  859. //---------------------------------------------------------------------------
  860. void __fastcall TFrmCctvOprMain::ExecuteItsProgram(String AClassName, String AExeName, String AOption)
  861. {
  862. HWND hExeForm = FindWindow(AClassName.c_str(), NULL);
  863. if (hExeForm)
  864. {
  865. SetWindowPos(hExeForm, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
  866. }
  867. else
  868. {
  869. String sExeName = "";
  870. String sExeParam= "";
  871. //if (!ReadConfigInfo(g_AppCfg.sConfigFile, "PROGRAM", AOption, sExeName))
  872. {
  873. sExeName = AExeName;
  874. sExeParam= g_pLOGIN->sUserId;
  875. }
  876. ShellExecute(Handle, NULL, sExeName.c_str(), sExeParam.c_str(), NULL, SW_SHOWNORMAL);
  877. }
  878. }
  879. //---------------------------------------------------------------------------
  880. void __fastcall TFrmCctvOprMain::TermItsProgram(String AClassName, String AExeName)
  881. {
  882. HWND hExeForm = FindWindow(AClassName.c_str(), NULL);
  883. if (hExeForm)
  884. {
  885. POST_MSG(hExeForm, WM_CLOSE, 0, 0);
  886. }
  887. }
  888. //---------------------------------------------------------------------------
  889. /*
  890. * EXE 프로그램 실행시킴
  891. */
  892. void __fastcall TFrmCctvOprMain::OnRunProgramClick(TObject *Sender)
  893. {
  894. TdxBarLargeButton *pButton = (TdxBarLargeButton*)Sender;
  895. int nIdx = pButton->Tag;
  896. if (nIdx < 0 || nIdx >= MAX_EXEPROGRAM) return;
  897. if (g_RunProgram[nIdx].AClassName == "") return;
  898. ExecuteItsProgram(g_RunProgram[nIdx].AClassName, g_RunProgram[nIdx].AExeName, g_RunProgram[nIdx].AOption);
  899. }
  900. //---------------------------------------------------------------------------
  901. /*
  902. * Application Hint Display Event Handler
  903. * arguments
  904. *
  905. * return
  906. *
  907. */
  908. void __fastcall TFrmCctvOprMain::OnAppHint(TObject *Sender)
  909. {
  910. dxStatusBar->Panels->Items[isbHint]->Text = " " + Application->Hint;
  911. dxStatusBar->Panels->Items[isbHint]->StatusBarControl->Refresh();
  912. }
  913. //---------------------------------------------------------------------------
  914. /*
  915. * Application Exception Event Handler
  916. * arguments
  917. *
  918. * return
  919. *
  920. */
  921. void __fastcall TFrmCctvOprMain::OnAppException(TObject *Sender, Exception *exception)
  922. {
  923. if (g_AppCfg.bDebug) ITSUtil_Trace("OnAppException");
  924. String sClassName = (NULL != Sender) ? Sender->ClassName() : String("Unknown_Class");
  925. String sErrMsg = (NULL != exception) ? exception->Message : String("Unknown_Error");
  926. String sError = sClassName + " : " + sErrMsg;
  927. //Application->ShowException(&exception);
  928. Application->NormalizeTopMosts();
  929. Application->MessageBox(sError.c_str(), L"System Error", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  930. Application->RestoreTopMosts();
  931. }
  932. //---------------------------------------------------------------------------
  933. void __fastcall TFrmCctvOprMain::UpdateThreadStatus(bool ARequest, bool APing/*=true*/)
  934. {
  935. return;
  936. try
  937. {
  938. if (APing) if (ARequest) PostJobMessage(WM_THREAD, WP_PING);
  939. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbStatus]->PanelStyle)->ImageIndex = ARequest ? 7 : 8;
  940. dxStatusBar->Panels->Items[isbDb]->StatusBarControl->Refresh();
  941. }
  942. catch(...)
  943. {
  944. }
  945. }
  946. //---------------------------------------------------------------------------
  947. void __fastcall TFrmCctvOprMain::UpdateDbStatus(bool ASelect)
  948. {
  949. try
  950. {
  951. ((TdxStatusBarTextPanelStyle*)dxStatusBar->Panels->Items[isbDb]->PanelStyle)->ImageIndex = ASelect ? 7 : 8;
  952. dxStatusBar->Panels->Items[isbDb]->StatusBarControl->Refresh();
  953. }
  954. catch(...)
  955. {
  956. }
  957. }
  958. //---------------------------------------------------------------------------
  959. /*
  960. * Application Event Message Handler
  961. * arguments
  962. *
  963. * return
  964. *
  965. */
  966. void __fastcall TFrmCctvOprMain::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
  967. {
  968. switch(Msg.message)
  969. {
  970. case WM_THREAD:
  971. switch(Msg.wParam)
  972. {
  973. case WP_PING:
  974. UpdateThreadStatus(false); //스레드 핑 확인
  975. break;
  976. case WP_PARAM_TRAFFIC:
  977. break;
  978. case WP_DB_SELECT_START:
  979. UpdateDbStatus(true);
  980. break;
  981. case WP_DB_SELECT_OK:
  982. case WP_DB_SELECT_ERROR:
  983. case WP_DB_SELECT_CANCEL:
  984. UpdateDbStatus(false);
  985. if (Msg.wParam == WP_DB_SELECT_OK)
  986. {
  987. OnRefreshMessage(Msg.wParam, Msg.lParam);
  988. }
  989. break;
  990. }
  991. break;
  992. case WM_DATABASE_REFRESH:
  993. OnDatabaseMessage(Msg.wParam, Msg.lParam);
  994. break;
  995. case WM_PLUGINFORM:
  996. OnRefreshMessage(Msg.wParam, Msg.lParam);
  997. break;
  998. case WM_MOUSEMOVE:
  999. case WM_KEYDOWN:
  1000. case WM_KEYUP:
  1001. FLogoutTick = 0;
  1002. break;
  1003. }
  1004. }
  1005. //---------------------------------------------------------------------------
  1006. void __fastcall TFrmCctvOprMain::OnRefreshMessage(WPARAM AWParam, LPARAM ALParam)
  1007. {
  1008. HWND hWnd;
  1009. if (AWParam == WP_DB_SELECT_OK)
  1010. {
  1011. DWORD dwTick = GetTickCount();
  1012. switch(ALParam)
  1013. {
  1014. case LP_MSG_00: DebugMsg("<<< Process Status Request Completed."/*"<<< 프로세스 상태 조회 완료"*/); FPollPrcsState.Polling = dwTick; break;
  1015. case LP_MSG_01: DebugMsg("<<< VMS Status Request Completed."/*"<<< VMS 상태 조회 완료"*/); FPollVmsState.Polling = dwTick; break;
  1016. case LP_MSG_02: DebugMsg("<<< VMS Display Message Request Completed."/*"<<< VMS 표출메시지 조회 완료"*/); FPollVmsMsg.Polling = dwTick; break;
  1017. case LP_MSG_03: DebugMsg("<<< Traffic Request Completed."/*"<<< 소통정보 조회 완료"*/); FPollTraffic.Polling = dwTick; break;
  1018. case LP_MSG_05: DebugMsg("<<< Incident Request Completed."/*"<<< 돌발정보 조회 완료"*/); FPollIncident.Polling = dwTick; break;
  1019. }
  1020. if (ALParam == LP_MSG_00)
  1021. {
  1022. UpdateVmsCommStatus(true);
  1023. }
  1024. else
  1025. if (ALParam == LP_MSG_02)
  1026. {
  1027. RefreshVmsMessage(WM_VMS_FORM_REFRESH);
  1028. }
  1029. else
  1030. if (ALParam == LP_MSG_05)
  1031. {
  1032. RefreshVmsMessage(WM_VMS_INCIDENT_REFRESH);
  1033. }
  1034. else
  1035. {
  1036. RefreshVmsMessage(WM_VMS_STATE_REFRESH);
  1037. }
  1038. #if 0
  1039. if (NVMS0000M->Enabled)
  1040. {
  1041. hWnd = FindChildWindow("VMS0000M");
  1042. if (hWnd) POST_MSG(hWnd, WM_MAINFORM, AWParam, ALParam);
  1043. }
  1044. #endif
  1045. #if 0
  1046. if (ALParam == LP_MSG_11)
  1047. {
  1048. //시설물 상태정보 업데이트
  1049. ShowFacilityStatus();
  1050. }
  1051. #endif
  1052. }
  1053. else
  1054. {
  1055. LOGERROR("DB Thread failed: %02X[%02X]", ALParam, AWParam);
  1056. }
  1057. }
  1058. //---------------------------------------------------------------------------
  1059. void __fastcall TFrmCctvOprMain::OnDatabaseMessage(WPARAM AWParam, LPARAM ALParam)
  1060. {
  1061. #if 0
  1062. HWND hWnd;
  1063. switch(AWParam)
  1064. {
  1065. case WP_MSG_01: //소통등급변경
  1066. case WP_MSG_02: //돌발정보변경(오보/등록/해제)
  1067. if (NITS0000M->Enabled)
  1068. {
  1069. hWnd = FindChildWindow("ITS0000M");
  1070. if (hWnd) POST_MSG(hWnd, WM_MAINFORM, AWParam, ALParam);
  1071. }
  1072. break;
  1073. case WP_MSG_03: //시설물 정보 변경
  1074. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_14);
  1075. //hWnd = FindChildWindow("ITS0000M");
  1076. //if (hWnd) POST_MSG(hWnd, WM_MAINFORM, AWParam, ALParam);
  1077. break;
  1078. case WP_MSG_04: // IDB0070M-휴일정보
  1079. case WP_MSG_05: // FrmLinkGradeSet-구간등급변경
  1080. case WP_MSG_06: // IDB0060M - 소통등급
  1081. case WP_MSG_07: // IDB0050M -교통파라미터
  1082. //NodeLinkChangeReq(AnsiString("UTP01")); //통합교통정보가공시스템으로 정보변경 내용을 전송
  1083. break;
  1084. case WP_MSG_09: // IDB0100M
  1085. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_09); //작업스레드에서 읽어 처리하도록 한다.
  1086. break;
  1087. case WP_MSG_14: // DSRM010M -DSRC-RSE 관리
  1088. PostJobMessage(WM_THREAD, WP_PARAM_TRAFFIC, LP_MSG_14); //작업스레드에서 읽어 처리하도록 한다.
  1089. break;
  1090. default:
  1091. LOGERROR("Unknown Database Msg: %02X[%02X]", ALParam, AWParam);
  1092. break;
  1093. }
  1094. #endif
  1095. }
  1096. //---------------------------------------------------------------------------
  1097. void __fastcall TFrmCctvOprMain::OnUdpDataRecvMessage(TMessage &Msg)
  1098. {
  1099. int nResult;
  1100. IPC_MSG_DATA *RcvData = (IPC_MSG_DATA*)Msg.LParam;
  1101. INT_SENDER *Sender = &RcvData->Sender;
  1102. INT_PACKET *Pkt = &RcvData->Pkt;
  1103. INT_HEAD *head = &Pkt->head;
  1104. INT_DATA *data = &Pkt->data;
  1105. char *pData = &Pkt->Data[0];
  1106. BYTE OpCode = head->OPCode;
  1107. LOGINFO("*** OPR Client Req: %s.%d", CComm_ulong2ip(Sender->IP), Sender->Port);
  1108. String sMsg = "";
  1109. String sVmsNmbr = "";
  1110. TmrCommTimeout->Enabled = false;
  1111. //FCommServerState = vms_normal;
  1112. UpdateVmsCommStatus(false);
  1113. UpdateInterCommStatus(true);
  1114. switch(OpCode)
  1115. {
  1116. case INT_OP_PG_STATE_RES:
  1117. {
  1118. DebugMsg("*** VMS Process Stauts Recvieved");//"*** VMS 프로세스 상태정보 수신");
  1119. INT_PG_STATE_RES *ARes = (INT_PG_STATE_RES*)pData;
  1120. for (int ii = 0; ii < ARes->Count && ii < INT_MAX_PG_STATE; ii++)
  1121. {
  1122. if (ARes->Unit[ii].Type == INT_ID_VMS_SERVER)
  1123. {
  1124. FCommServerState = ARes->Unit[ii].Action;
  1125. UpdateVmsCommStatus(false);
  1126. FPollPrcsState.Polling = GetTickCount(); //프로세스상태정보 조회 타이머 리셋
  1127. break;
  1128. }
  1129. }
  1130. }
  1131. break;
  1132. case INT_OP_VMS_STATE_RES:
  1133. {
  1134. #if 0
  1135. char szVmsNmbr[INT_VMS_MAX_ID+1];
  1136. INT_VMS_STATE_RES *ARes = (INT_VMS_STATE_RES*)pData;
  1137. sMsg = "";
  1138. //sMsg.printf(L"*** VMS 제어기 상태정보 수신: %d EA", ARes->Count);
  1139. sMsg.printf(L"*** VMS Controller Status Received: %d EA", ARes->Count);
  1140. DebugMsg(sMsg);
  1141. for (int ii = 0; ii < ARes->Count && ii < INT_MAX_VMS_STATE; ii++)
  1142. {
  1143. sMsg = "";
  1144. String sVmsNmbr;
  1145. INT_VMS_STATE *pVms = &ARes->Unit[ii];
  1146. sprintf(szVmsNmbr, "%.*s", INT_VMS_MAX_ID, (char*)pVms->VmsId);
  1147. sVmsNmbr = String(szVmsNmbr);
  1148. TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsNmbr);
  1149. if (pObj)
  1150. {
  1151. VmsStatusCopy(&pObj->WSTATE, pVms);
  1152. if (pObj->WSTATE.OprMode == 'A') pObj->OPER_MODE = "A";
  1153. else if (pObj->WSTATE.OprMode == 'B') pObj->OPER_MODE = "B";
  1154. else pObj->OPER_MODE = "F";
  1155. //pObj->VMS_PHSE_CHNG_CYCL = pObj->WSTATE.ScheduledMessageOperatingTime;
  1156. pObj->VMS_CMNC_ERR_BASS_VAL = pObj->WSTATE.ModuleOperatingTemperature;
  1157. pObj->FAN_MTNS_TMPR = pObj->WSTATE.FanOperatingTemperature;
  1158. pObj->HETR_MTNS_TMPR = pObj->WSTATE.HeaterOperatingTemperature;
  1159. pObj->VMS_MODL_ERR_RATE = pObj->WSTATE.ModuleBasicFailureRate;
  1160. pObj->CheckRunState();
  1161. if (pObj->WSTATE.Comm != vms_normal)
  1162. {
  1163. pObj->VmsMsg->OFFER_YN = false;
  1164. }
  1165. }
  1166. else
  1167. {
  1168. sMsg.printf(L"INT_OP_VMS_STATE_RES VMS not found: %s", sVmsNmbr.c_str());
  1169. DebugMsg(sMsg);
  1170. }
  1171. }
  1172. RefreshVmsMessage(WM_VMS_STATE_REFRESH);
  1173. FPollVmsState.Polling = GetTickCount();
  1174. #endif
  1175. }
  1176. break;
  1177. case INT_OP_VMS_FORM_SAVE:
  1178. {
  1179. FPollVmsMsg.Reset(); //VMS메시지 조회 타이머 리셋
  1180. char szDateTime[INT_VMS_MAX_DATETIME+1];
  1181. INT_VMS_FORM_SAVE_REQ *AReq = (INT_VMS_FORM_SAVE_REQ*)pData;
  1182. sprintf(szDateTime, "%.*s", INT_VMS_MAX_DATETIME, (char*)AReq->Date);
  1183. String sDateTime = String(szDateTime);
  1184. sMsg = "";
  1185. //sMsg.printf(L"*** VMS 폼생성 완료 메시지 수신: %s", sDateTime.c_str());
  1186. sMsg.printf(L"*** VMS Form Create Message Received: %s", sDateTime.c_str());
  1187. DebugMsg(sMsg);
  1188. }
  1189. break;
  1190. }
  1191. TmrCommTimeout->Enabled = true;
  1192. }
  1193. //---------------------------------------------------------------------------
  1194. void __fastcall TFrmCctvOprMain::RefreshVmsMessage(int AMsg, WPARAM AWParam/*=0*/, LPARAM ALParam/*=0*/)
  1195. {
  1196. HWND hWnd;
  1197. if (NVMS0000M->Enabled)
  1198. {
  1199. hWnd = FindChildWindow("VMS0000M");
  1200. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1201. }
  1202. if (NCTV0100M->Enabled)
  1203. {
  1204. hWnd = FindChildWindow("CTV0100M");
  1205. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1206. }
  1207. if (NVMS0200M->Enabled)
  1208. {
  1209. hWnd = FindChildWindow("VMS0200M");
  1210. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1211. }
  1212. if (NCTV0300M->Enabled)
  1213. {
  1214. hWnd = FindChildWindow("CTV0300M");
  1215. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1216. }
  1217. #if 0
  1218. if (NVMS0400M->Enabled)
  1219. {
  1220. hWnd = FindChildWindow("VMS0400M");
  1221. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1222. }
  1223. #endif
  1224. if (NCTV0500M->Enabled)
  1225. {
  1226. hWnd = FindChildWindow("CTV0500M");
  1227. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1228. }
  1229. if (NVMS0600M->Enabled)
  1230. {
  1231. hWnd = FindChildWindow("VMS0600M");
  1232. if (hWnd) POST_MSG(hWnd, AMsg, AWParam, ALParam);
  1233. }
  1234. }
  1235. //---------------------------------------------------------------------------
  1236. void __fastcall TFrmCctvOprMain::OnPollingThreadDone(TObject *Sender)
  1237. {
  1238. LOGINFO("*** Polling thead terminated ***");
  1239. g_AppCfg.thr.bRunning = false;
  1240. }
  1241. //---------------------------------------------------------------------------
  1242. void __fastcall TFrmCctvOprMain::ShowFacilityStatus()
  1243. {
  1244. // HWND hWnd = FindChildWindow("ITS0000M");
  1245. // if (hWnd) POST_MSG(hWnd, WM_MAINFORM, AWParam, ALParam);
  1246. return;
  1247. #if 0
  1248. bool bShow = false;
  1249. try
  1250. {
  1251. try
  1252. {
  1253. ItsFacilityManager->FLists.Lock();
  1254. FOR_STL(TItsFacility*, pFacility, ItsFacilityManager->FLists)
  1255. {
  1256. if (pFacility->DEL_YN == "Y") continue;
  1257. if (pFacility->FCLT_TYPE == "DSRC")
  1258. {
  1259. if (pFacility->FCollCntBase > pFacility->FCollCntCurr)
  1260. {
  1261. bShow = true;
  1262. break;
  1263. }
  1264. }
  1265. if (pFacility->FComm != "1")
  1266. {
  1267. bShow = true;
  1268. break;
  1269. }
  1270. else
  1271. {
  1272. try
  1273. {
  1274. String sValue = pFacility->FCBoxTmpr;
  1275. int nValue = 0;
  1276. if (TryStrToInt(sValue, nValue))
  1277. {
  1278. if (nValue > g_AppCfg.Temp.AlarmValue)
  1279. {
  1280. bShow = true;
  1281. break;
  1282. }
  1283. }
  1284. } catch(...) {}
  1285. }
  1286. }
  1287. }
  1288. __finally
  1289. {
  1290. ItsFacilityManager->FLists.UnLock();
  1291. }
  1292. }
  1293. catch(...)
  1294. {
  1295. }
  1296. if (!bShow)
  1297. {
  1298. LblAlarm->Style->Font->Color = clBlack;
  1299. LblAlarm->Caption = "알람정보";
  1300. ImgAlarm->Visible = false;
  1301. ImgAlarmNormal->Visible = true;
  1302. try {
  1303. if (ImgAlarm->Picture->Graphic->ClassName() == "TGIFImage")
  1304. ((TGIFImage *)ImgAlarm->Picture->Graphic)->Animate = false;
  1305. } catch(...) {}
  1306. return;
  1307. }
  1308. ImgAlarmNormal->Visible = false;
  1309. ImgAlarm->Visible = true;
  1310. try {
  1311. if (ImgAlarm->Picture->Graphic->ClassName() == "TGIFImage")
  1312. ((TGIFImage *)ImgAlarm->Picture->Graphic)->Animate = true;
  1313. } catch(...) {}
  1314. LblAlarm->Caption = "알람발생";
  1315. LblAlarm->Style->Font->Color = clRed;
  1316. if (!g_AppCfg.Alarm.Enabled) return;
  1317. if (!g_AppCfg.Alarm.Window) return;
  1318. #endif
  1319. }
  1320. //---------------------------------------------------------------------------
  1321. void __fastcall TFrmCctvOprMain::NTST0000MClick(TObject *Sender)
  1322. {
  1323. #if 0
  1324. String sExeName = "Project1.exe";
  1325. String sParam = "\"" + g_pLOGIN->sUserId + "\" \"" + g_pLOGIN->sUserId + "\"";
  1326. //ShellExecute(NULL,"open", "C:\\myprocess.exe", "\"my argument 1 containing spaces\" \"my argument 2\"","C:\\",SW_SHOWNORMAL);
  1327. ShellExecute(Handle, NULL, sExeName.c_str(), sParam.c_str(), NULL, SW_SHOWNORMAL);
  1328. #endif
  1329. }
  1330. //---------------------------------------------------------------------------
  1331. void __fastcall TFrmCctvOprMain::NCTV0100MClick(TObject *Sender)
  1332. {
  1333. if (g_AppCfg.bOnlyOneScreen) CloseChildWindow();
  1334. FORMSHOW(CTV0100M);
  1335. }
  1336. //---------------------------------------------------------------------------
  1337. void __fastcall TFrmCctvOprMain::NCTV0300MClick(TObject *Sender)
  1338. {
  1339. if (g_AppCfg.bOnlyOneScreen) CloseChildWindow();
  1340. FORMSHOW(CTV0300M);
  1341. }
  1342. //---------------------------------------------------------------------------
  1343. void __fastcall TFrmCctvOprMain::NCTV0500MClick(TObject *Sender)
  1344. {
  1345. if (g_AppCfg.bOnlyOneScreen) CloseChildWindow();
  1346. FORMSHOW(CTV0500M);
  1347. }
  1348. //---------------------------------------------------------------------------
  1349. void __fastcall TFrmCctvOprMain::TmrCommTimeoutTimer(TObject *Sender)
  1350. {
  1351. //통신타임아웃
  1352. TmrCommTimeout->Enabled = false;
  1353. UpdateInterCommStatus(false);
  1354. FCommServerState = vms_error;
  1355. UpdateVmsCommStatus(false);
  1356. LOGINFO("xxx VMS Communication Time out xxx");
  1357. }
  1358. //---------------------------------------------------------------------------
  1359. void __fastcall TFrmCctvOprMain::ApplicationEvents1Restore(TObject *Sender)
  1360. {
  1361. //화면 재생
  1362. }
  1363. //---------------------------------------------------------------------------
  1364. void __fastcall TFrmCctvOprMain::ApplicationEvents1Minimize(TObject *Sender)
  1365. {
  1366. //화면 정지
  1367. }
  1368. //---------------------------------------------------------------------------
  1369. void __fastcall TFrmCctvOprMain::OnMenuMouseMove(TObject *Sender, TShiftState Shift, int X,
  1370. int Y)
  1371. {
  1372. ::SetCursor(Screen->Cursors[crHandPoint]);
  1373. }
  1374. //---------------------------------------------------------------------------
  1375. void __fastcall TFrmCctvOprMain::ApplicationEvents1SettingChange(TObject *Sender, int Flag,
  1376. const UnicodeString Section, int &Result)
  1377. {
  1378. DateSeparator = '-';
  1379. TimeSeparator = ':';
  1380. ShortDateFormat = "yyyy-MM-dd";
  1381. ShortTimeFormat = "HH:NN:SS";
  1382. LongTimeFormat = "HH:NN:SS";
  1383. cxFormatController()->BeginUpdate();
  1384. cxFormatController()->UseDelphiDateTimeFormats = true;
  1385. cxFormatController()->EndUpdate();
  1386. cxFormatController()->GetFormats();
  1387. cxFormatController()->NotifyListeners();
  1388. }
  1389. //---------------------------------------------------------------------------
  1390. void __fastcall TFrmCctvOprMain::NCTVM100MClick(TObject *Sender)
  1391. {
  1392. FORMSHOW(CTVM100M);
  1393. }
  1394. //---------------------------------------------------------------------------