FrmMainF.cpp 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008
  1. //---------------------------------------------------------------------------
  2. #define WIN32_LEAN_AND_MEAN
  3. #include <DateUtils.hpp>
  4. #include "ITSNetF.h"
  5. #include <vcl.h>
  6. #pragma hdrstop
  7. #include <psapi.h>
  8. #include <windows.h>
  9. #include <stdio.h>
  10. #include <time.h>
  11. //---------------------------------------------------------------------------
  12. #include "AppGlobalF.h"
  13. #include "VmsUtilsF.h"
  14. #include "FrmMainF.h"
  15. #include "MainCommF.h"
  16. #include "FrmOptionF.h"
  17. #include "FrmSysLogF.h"
  18. #include "FrmCommLogF.h"
  19. #include "FrmControllerInfoF.h"
  20. #include "FrmNetworkF.h"
  21. #include "LogThreadF.h"
  22. #include "DbmThreadF.h"
  23. #include "DbmReadThreadF.h"
  24. #include "JobThreadF.h"
  25. #include "DMAdoDbF.h"
  26. #include "PacketHandllingF.h"
  27. #include "ClientSessionManagerF.h"
  28. //---------------------------------------------------------------------------
  29. #include "CDSProcessF.h"
  30. #include "CDSCtlrF.h"
  31. #include "CDSImageF.h"
  32. #include "CDSFormF.h"
  33. #include "CDSIfscF.h"
  34. #include "CDSFontF.h"
  35. #include "CDSColorF.h"
  36. #include "CDSAtmpF.h"
  37. #include "CDSSafeF.h"
  38. #include "CDSParkF.h"
  39. #include "CDSManagerF.h"
  40. //---------------------------------------------------------------------------
  41. #pragma package(smart_init)
  42. #pragma link "IdAntiFreeze"
  43. #pragma link "IdAntiFreezeBase"
  44. #pragma link "IdBaseComponent"
  45. #pragma link "IdComponent"
  46. #pragma link "IdUDPBase"
  47. #pragma link "IdUDPServer"
  48. #pragma resource "*.dfm"
  49. TItsMap<int, TItsThread*> G_Threads;
  50. typedef std::map<int, TItsThread*>::iterator thrIterator;
  51. TVmsCommMain *VmsCommMain;
  52. //---------------------------------------------------------------------------
  53. __fastcall TVmsCommMain::TVmsCommMain(TComponent* Owner)
  54. : TForm(Owner)
  55. {
  56. Application->OnException = OnAppException;
  57. ::CoInitialize(NULL);
  58. FServerRun = false;
  59. g_AppCfg.bAppLoad = false;
  60. g_AppCfg.bAppClose = false;
  61. Caption = " " + g_AppCfg.sTitle + " - " + Now().FormatString("yyyy-MM-dd hh:nn:ss");
  62. pnlTraf->Caption = "-";
  63. ClientSessionManager = new TClientSessionManager();
  64. CDSProcessManager = new TCDSProcessManager();
  65. CDSCtlrManager = new TCDSCtlrManager();
  66. CDSFormManager = new TCDSFormManager();
  67. CDSImageManager = new TCDSImageManager();
  68. CDSIfscManager = new TCDSIfscManager();
  69. CDSFontManager = new TCDSFontManager();
  70. CDSAtmpManager = new TCDSAtmpManager();
  71. #if 0
  72. CDSSafeManager = new TCDSSafeManager();
  73. #else
  74. CDSSafeManager = NULL;
  75. #endif
  76. #if 1
  77. CDSParkManager = new TCDSParkManager();
  78. #else
  79. CDSParkManager = NULL;
  80. #endif
  81. CDSManager = new TCDSManager();
  82. #if 0
  83. //VMS 소통정보를 가공해햐 하는 경우
  84. CDSVmsIfscTrafManager = new TCDSVmsIfscTrafManager();
  85. #else
  86. CDSVmsIfscTrafManager = NULL;
  87. #endif
  88. FCurrMin = StrToInt(Now().FormatString("nn"));;
  89. FCur1MinComm = FCurrMin;
  90. FCur1MinRun = FCurrMin;
  91. FCur5Min = FCurrMin;
  92. FCurrHour = -1;
  93. FCurrSec = -1;
  94. FTimeSyncDay = -1;
  95. FTimeSyncMin = -1;
  96. FUnitSttsHsMin = -1;
  97. FCtlrSttsHsMin = -1;
  98. FCtlrSttsReqMin= -1;
  99. FFirstRunning = true;
  100. FOneMinCycle = false;
  101. m_dtProgBoot = Now();
  102. m_dtChkDbAlive = Now();
  103. FrmCommLog = new TFrmCommLog(Application);
  104. FrmNetwork = new TFrmNetwork(Application);
  105. FrmVmsLog = new TFrmVmsLog(Application);
  106. }
  107. //---------------------------------------------------------------------------
  108. void __fastcall TVmsCommMain::OnAppException(TObject *Sender, Exception *exception)
  109. {
  110. AnsiString sClassName = (NULL != Sender) ? AnsiString(Sender->ClassName()) : AnsiString("Unknown_Class");
  111. AnsiString sErrCls = (NULL != exception) ? AnsiString(exception->ClassName()) : AnsiString("Unknown_Error");
  112. AnsiString sErrMsg = (NULL != exception) ? AnsiString(exception->Message) : AnsiString("Unknown_Error");
  113. if (g_AppCfg.bAppClose)
  114. {
  115. LOGERROR("Program Close Exception Terminated. %s.%s.%s", sClassName.c_str(), sErrCls.c_str(), sErrMsg.c_str());
  116. }
  117. else
  118. {
  119. LOGERROR("Program Exception Terminated. %s.%s.%s", sClassName.c_str(), sErrCls.c_str(), sErrMsg.c_str());
  120. }
  121. Close();
  122. }
  123. //---------------------------------------------------------------------------
  124. void __fastcall TVmsCommMain::FormCreate(TObject *Sender)
  125. {
  126. Application->ShowMainForm = false;
  127. try {
  128. Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
  129. } catch(...) { ShowMessage("LoadFromResourceName failed"); }
  130. g_AppCfg.lMainWinHandle = (long)Handle;
  131. FrmSysLog = new TFrmSysLog(pnlLog);
  132. FrmSysLog->Parent = pnlLog;
  133. FrmSysLog->Show();
  134. FrmControllerInfo = new TFrmControllerInfo(pnlController);
  135. FrmControllerInfo->Parent = pnlController;
  136. FrmControllerInfo->Show();
  137. char szLogMsg[MAX_LOG_BUFFER];
  138. if (!g_logQ.Create("phvmsLog", MAX_LOGQ_BUFF))
  139. {
  140. sprintf(szLogMsg, "Log Q Create failed. Program abnormal terminate.");
  141. AbnormalTerminate(szLogMsg);
  142. Close();
  143. Close();
  144. }
  145. if (!g_dbmQ.Create("phvmsDbm", MAX_DBMQ_BUFF))
  146. {
  147. sprintf(szLogMsg, "Dbm Q Create failed. Program abnormal terminate.");
  148. AbnormalTerminate(szLogMsg);
  149. Close();
  150. Close();
  151. }
  152. if (!g_dbmReadQ.Create("phvmsReadDbm", MAX_DBMQ_BUFF))
  153. {
  154. sprintf(szLogMsg, "Dbm Read Q Create failed. Program abnormal terminate.");
  155. AbnormalTerminate(szLogMsg);
  156. Close();
  157. Close();
  158. }
  159. if (!g_jobQ.Create("phvmsJob", MAX_JOBQ_BUFF))
  160. {
  161. sprintf(szLogMsg, "Job Q Create failed. Program abnormal terminate.");
  162. AbnormalTerminate(szLogMsg);
  163. Close();
  164. Close();
  165. }
  166. Application->ShowMainForm = true;
  167. }
  168. //---------------------------------------------------------------------------
  169. void __fastcall TVmsCommMain::FormShow(TObject *Sender)
  170. {
  171. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  172. Refresh();
  173. tmrAppState->Enabled = true;
  174. }
  175. //---------------------------------------------------------------------------
  176. void __fastcall TVmsCommMain::FormCloseQuery(TObject *Sender, bool &CanClose)
  177. {
  178. if (!g_AppCfg.bAppClose)
  179. {
  180. String strMsg;
  181. strMsg = Caption + "\r\n\r\nAre you sure you want to exit the program?\r\nIf the Process Manager is running the program will be restarted automatically!!!";
  182. //if (Application->MessageBox(strMsg.c_str(), L"Confirm program exit", MB_YESNO|MB_ICONQUESTION) == IDYES)
  183. {
  184. FServerRun = false;
  185. g_AppCfg.bAppClose = true;
  186. }
  187. CanClose = false;
  188. }
  189. }
  190. //---------------------------------------------------------------------------
  191. void __fastcall TVmsCommMain::FormClose(TObject *Sender, TCloseAction &Action)
  192. {
  193. CommClose();
  194. ::CoUninitialize();
  195. Action = caFree;
  196. VmsCommMain = NULL;
  197. }
  198. //---------------------------------------------------------------------------
  199. void __fastcall TVmsCommMain::CommClose()
  200. {
  201. try
  202. {
  203. g_AppCfg.bAppClose = true;
  204. APP_WriteConfigInfo("LOG", "LOGDAY", Now().FormatString("dd"), g_AppCfg.sConfigFile);
  205. if (IdUDPCenterServer->Active == true)
  206. {
  207. IdUDPCenterServer->Active = false;
  208. for (int ii = 0; ii < IdUDPCenterServer->Bindings->Count; ii++)
  209. {
  210. IdUDPCenterServer->Bindings->Items[ii]->Free();
  211. }
  212. }
  213. #if 0
  214. if (FrmCommLog) FrmCommLog->Close();
  215. if (FrmNetwork)
  216. {
  217. FrmNetwork->Stop();
  218. FrmNetwork->Close();
  219. }
  220. #endif
  221. }
  222. catch(Exception &e)
  223. {
  224. }
  225. }
  226. //---------------------------------------------------------------------------
  227. void __fastcall TVmsCommMain::AbnormalTerminate(char* AMsg)
  228. {
  229. for (int ii = 0; ii < 5; ii++)
  230. {
  231. ITSLog->LogWrite(NULL, eLOG_ERROR, AMsg);
  232. if (FrmSysLog != NULL) FrmSysLog->reMsg->Lines->Add(Now().FormatString("hh:nn:ss") + " " + String(AMsg));
  233. Refresh();
  234. Application->ProcessMessages();
  235. Sleep(1000);
  236. }
  237. }
  238. //---------------------------------------------------------------------------
  239. bool __fastcall TVmsCommMain::InitApplication()
  240. {
  241. int nResult;
  242. String sTitle, sMsg;
  243. char szLogMsg[MAX_LOG_BUFFER];
  244. Application->ProcessMessages();
  245. if (JobThreadStart() == false)
  246. {
  247. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  248. sprintf(szLogMsg, "Job Thread Create failed. Program abnormal terminate.");
  249. AbnormalTerminate(szLogMsg);
  250. return false;
  251. }
  252. MINFO("MAIN=============> Program initialize start..."); // Q 생성후 메시지 출력함
  253. DWORD dwTick = GetTickCount();
  254. TDMAdoDb *FDb = new TDMAdoDb(NULL);
  255. try
  256. {
  257. dwTick = GetTickCount();
  258. MINFO("MAIN=============> Database connect...");
  259. if (!FDb->Connect(g_AppCfg.db.sConnectStr))
  260. {
  261. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  262. sprintf(szLogMsg, "MAIN=============> Database connect failed. Program abnormal terminate.");
  263. AbnormalTerminate(szLogMsg);
  264. return false;
  265. }
  266. MINFO("MAIN=============> Database connect...END, %u ms.", GetTickCount()-dwTick);
  267. if (CDSProcessManager)
  268. {
  269. dwTick = GetTickCount();
  270. MINFO("MAIN=============> Process Information initialize...");
  271. if (CDSProcessManager->LoadUnitInfo(FDb->GetConnection()) < 0)
  272. {
  273. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  274. sprintf(szLogMsg, "MAIN=============> Process Information initialize failed. Program abnormal terminate.");
  275. AbnormalTerminate(szLogMsg);
  276. return false;
  277. }
  278. MINFO("MAIN=============> Process Information initialize...END, %u ms.", GetTickCount()-dwTick);
  279. }
  280. if (CDSCtlrManager)
  281. {
  282. dwTick = GetTickCount();
  283. MINFO("MAIN=============> Controller Information initialize...");
  284. if (CDSCtlrManager->LoadCtlrInfo(FDb->GetConnection()) < 0)
  285. {
  286. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  287. sprintf(szLogMsg, "MAIN=============> Controller Information initialize failed. Program abnormal terminate.");
  288. AbnormalTerminate(szLogMsg);
  289. return false;
  290. }
  291. MINFO("MAIN=============> Controller Information initialize...END, %u ms.", GetTickCount()-dwTick);
  292. }
  293. // 제어기 정보를 로딩한 후 바로 부가 정보를 로딩해서 설정해 놓는다.
  294. LoadStuffingVms();
  295. LoadVideoVms();
  296. if (CDSFontManager)
  297. {
  298. dwTick = GetTickCount();
  299. MINFO("MAIN=============> VMS Font Information initialize...");
  300. if (CDSFontManager->LoadFontInfo(FDb->GetConnection()) < 0)
  301. {
  302. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  303. sprintf(szLogMsg, "MAIN=============> VMS Font Information initialize failed. Program abnormal terminate.");
  304. AbnormalTerminate(szLogMsg);
  305. return false;
  306. }
  307. MINFO("MAIN=============> VMS Font Information initialize...END, %u ms.", GetTickCount()-dwTick);
  308. }
  309. if (CDSIfscManager)
  310. {
  311. dwTick = GetTickCount();
  312. MINFO("MAIN=============> VMS Ifsc Information initialize...");
  313. if (CDSIfscManager->LoadVmsIfscInfo(FDb->GetConnection()) < 0)
  314. {
  315. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  316. sprintf(szLogMsg, "MAIN=============> VMS Ifsc Information initialize failed. Program abnormal terminate.");
  317. AbnormalTerminate(szLogMsg);
  318. return false;
  319. }
  320. MINFO("MAIN=============> VMS Ifsc Information initialize...END, %u ms.", GetTickCount()-dwTick);
  321. }
  322. if (CDSImageManager)
  323. {
  324. dwTick = GetTickCount();
  325. MINFO("MAIN=============> VMS Image Information initialize...");
  326. if (CDSImageManager->LoadVmsSymbolInfo(FDb->GetConnection()) < 0)
  327. {
  328. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  329. sprintf(szLogMsg, "MAIN=============> VMS Image Information initialize failed. Program abnormal terminate.");
  330. AbnormalTerminate(szLogMsg);
  331. return false;
  332. }
  333. MINFO("MAIN=============> VMS Image Information initialize...END, %u ms.", GetTickCount()-dwTick);
  334. }
  335. if (CDSAtmpManager)
  336. {
  337. dwTick = GetTickCount();
  338. MINFO("MAIN=============> VMS Atmp Information initialize...");
  339. if (CDSAtmpManager->LoadAtmpInfo(FDb->GetConnection()) < 0)
  340. {
  341. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  342. sprintf(szLogMsg, "MAIN=============> VMS Atmp Information initialize failed. Program abnormal terminate.");
  343. AbnormalTerminate(szLogMsg);
  344. return false;
  345. }
  346. MINFO("MAIN=============> VMS Atmp Information initialize...END, %u ms.", GetTickCount()-dwTick);
  347. }
  348. if (CDSFormManager)
  349. {
  350. dwTick = GetTickCount();
  351. MINFO("MAIN=============> VMS Form Information initialize...");
  352. if (CDSFormManager->LoadVmsFormInfo(FDb->GetConnection()) < 0)
  353. {
  354. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  355. sprintf(szLogMsg, "MAIN=============> VMS Form Information initialize failed. Program abnormal terminate.");
  356. AbnormalTerminate(szLogMsg);
  357. return false;
  358. }
  359. MINFO("MAIN=============> VMS Form Information initialize...END, %u ms.", GetTickCount()-dwTick);
  360. }
  361. if (CDSVmsIfscTrafManager)
  362. {
  363. dwTick = GetTickCount();
  364. MINFO("MAIN=============> VMS Ifsc Traf Information initialize...");
  365. if (CDSVmsIfscTrafManager->InitVmsIfscTraffic(FDb->GetConnection()) < 0)
  366. {
  367. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  368. sprintf(szLogMsg, "MAIN=============> VMS IFSC TRAF Information initialize failed. Program abnormal terminate.");
  369. AbnormalTerminate(szLogMsg);
  370. return false;
  371. }
  372. MINFO("MAIN=============> VMS Ifsc Traf Information initialize...END, %u ms.", GetTickCount()-dwTick);
  373. }
  374. }
  375. __finally
  376. {
  377. if (FDb)
  378. {
  379. FDb->Close();
  380. }
  381. SAFE_DELETE(FDb);
  382. }
  383. ClientSessionManager->Init(CDSCtlrManager->FLists.Size()*2);
  384. FrmControllerInfo->UpdateCtlrList();
  385. MINFO("MAIN=============> Center communication initialize...");
  386. TCDSProcess *pPrcs = CDSProcessManager->FLists.Find(g_AppCfg.sSystemId);
  387. if (!pPrcs)
  388. {
  389. sMsg.printf(L"MAIN=============> Center process information not found: %s, error %d", g_AppCfg.sSystemId.c_str(), nResult);
  390. MERROR(AnsiString(sMsg).c_str());
  391. return false;
  392. }
  393. g_AppCfg.comm.nCenterPort = pPrcs->PRGM_PORT.ToIntDef(g_AppCfg.comm.nCenterPort); // 디비에 설정된 포트를 사용
  394. //통신초기화를 최초 수행한 후 디비읽어서 처리
  395. nResult = CComm_Initialize((long)VmsCommMain->Handle, g_AppCfg.sSystemId, "VMS", g_AppCfg.comm.nCenterPort, g_AppCfg.sLogDay);
  396. if (VERR_NONE != nResult)
  397. {
  398. sMsg.printf(L"MAIN=============> Center communication initialize failed: error %d", nResult);
  399. MERROR(AnsiString(sMsg).c_str());
  400. return false;
  401. }
  402. FOR_STL(TCDSProcess*, pObj, CDSProcessManager->FLists)
  403. {
  404. if (pObj->DEL_YN == "Y") continue;
  405. if (g_AppCfg.sSystemId == pObj->SYST_ID)
  406. {
  407. //자기자신은 목록에 추가하지 않는다...
  408. continue;
  409. }
  410. if (CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, pObj->PRGM_PORT) >= 0)
  411. {
  412. if ("UOT" == pObj->SYST_TYPE)
  413. {
  414. int nPort = pObj->PRGM_PORT.ToIntDef(0);
  415. CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+1)); /* VMS 운영단말 */
  416. #if 0
  417. CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+2)); /* CCTV 운영단말 */
  418. CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+3)); /* VDS 운영단말 */
  419. #endif
  420. }
  421. }
  422. }
  423. if (VERR_NONE != CComm_Open())
  424. {
  425. sMsg.printf(L"MAIN=============> Center communication open failed: error %d", nResult);
  426. MERROR(AnsiString(sMsg).c_str());
  427. return false;
  428. }
  429. g_SysInfo->RunSts = state_normal;
  430. g_SysInfo->ComSts = state_error;
  431. g_SysInfo->DbmSts = state_normal;
  432. FServerRun = true;
  433. m_dtChkDbAlive = Now(); // 데이터베이스 연결 체크 타이머
  434. m_dtChkVmsJob = Now(); // VMS 작업 및 주기작업
  435. m_dtProvider = Now()-1; // 정보제공 타이머
  436. m_dtTrafProvider = Now()-1;
  437. m_dtTimeOut = Now();
  438. COMM_MakeBasisTime(m_tTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime);
  439. //APP_PostDbThreadWriteMessage(dbm_save_unit_stts);
  440. APP_PostDbThreadWriteMessage(dbm_dnld_form_init);
  441. //통신서버 시작
  442. Sleep(500);
  443. tbConnectClick(this);
  444. MINFO("MAIN=============> Program initialize success...[Completed]");
  445. return true;
  446. }
  447. //---------------------------------------------------------------------------
  448. void __fastcall TVmsCommMain::LoadStuffingVms()
  449. {
  450. TStringList *slFile = NULL;
  451. String sCfgFile = g_sCfgDir + "StuffingVMS.inf";
  452. try
  453. {
  454. slFile = new TStringList;
  455. slFile->Clear();
  456. slFile->LoadFromFile(sCfgFile);
  457. for (int ii = 0; ii < slFile->Count; ii++)
  458. {
  459. AnsiString CTLR_NMBR = slFile->Strings[ii].Trim();
  460. if (CTLR_NMBR == "") continue;
  461. if (CTLR_NMBR == "\r\n") continue;
  462. TCDSCtlr* pObj = CDSCtlrManager->FLists.Find(CTLR_NMBR);
  463. if (pObj)
  464. {
  465. pObj->IsDle = false;
  466. }
  467. }
  468. }
  469. catch(Exception &e)
  470. {
  471. }
  472. delete slFile;
  473. }
  474. //---------------------------------------------------------------------------
  475. void __fastcall TVmsCommMain::LoadVideoVms()
  476. {
  477. TStringList *slFile = NULL;
  478. String sCfgFile = g_sCfgDir + "VideoVMS.inf";
  479. try
  480. {
  481. slFile = new TStringList;
  482. slFile->Clear();
  483. slFile->LoadFromFile(sCfgFile);
  484. for (int ii = 0; ii < slFile->Count; ii++)
  485. {
  486. AnsiString CTLR_NMBR = slFile->Strings[ii].Trim();
  487. if (CTLR_NMBR == "") continue;
  488. if (CTLR_NMBR == "\r\n") continue;
  489. TCDSCtlr* pObj = CDSCtlrManager->FLists.Find(CTLR_NMBR);
  490. if (pObj)
  491. {
  492. pObj->IsVideo = true;
  493. }
  494. }
  495. }
  496. catch(Exception &e)
  497. {
  498. }
  499. delete slFile;
  500. }
  501. //---------------------------------------------------------------------------
  502. void __fastcall TVmsCommMain::tmrAppStateTimer(TObject *Sender)
  503. {
  504. tmrAppState->Enabled = false;
  505. plTime->Caption = Now().FormatString("yyyy-MM-dd hh:nn:ss");
  506. if (!g_AppCfg.bAppLoad)
  507. {
  508. if (!InitApplication())
  509. {
  510. g_AppCfg.bAppClose = true;
  511. Close();
  512. return;
  513. }
  514. // 초기화작업완료
  515. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  516. g_AppCfg.bAppLoad = true; // 프로그램이 로딩되었음을 확인
  517. tmrAppState->Interval = 990; // 프로그램 상태점검주기=1초
  518. tmrAppState->Enabled = true;
  519. // 타임아웃 타이머 초기정보 설정
  520. tmrProvide->Enabled = false;
  521. int nProvideRemain = SecondOfTheDay(Now());
  522. nProvideRemain %= g_AppCfg.nTrafficCycleTime;
  523. nProvideRemain = g_AppCfg.nTrafficCycleTime - nProvideRemain + g_AppCfg.nTrafficBasisTime;
  524. tmrProvide->Interval = nProvideRemain * 1000;
  525. tmrProvide->Enabled = true;
  526. m_dtTimeOut = Now();
  527. m_dtProgBoot = Now();
  528. return;
  529. }
  530. if (g_AppCfg.bAppClose)
  531. {
  532. // 응용프로그램 종료
  533. TerminateApplication();
  534. JobThreadStop();
  535. Close();
  536. return;
  537. }
  538. g_AppCfg.lMainWinHandle = (long)Handle;
  539. plRemain->Caption = String((tmrProvide->Interval / 1000) - COMM_TimeDiff(m_dtTimeOut));
  540. UpdateProcessStatePanel();
  541. FCurrDay = StrToInt(Now().FormatString("dd"));
  542. FCurrHour = StrToInt(Now().FormatString("hh"));
  543. FCurrMin = StrToInt(Now().FormatString("nn"));
  544. FCurrSec = StrToInt(Now().FormatString("ss"));
  545. if (!(FCurrSec % 5))
  546. {
  547. CheckCommState(); //통신상태정보 체크
  548. }
  549. // 0시 3분에 시각 동기화 명령을 전송하자
  550. if (FCurrDay != FTimeSyncDay
  551. && FCurrMin != FTimeSyncMin
  552. && FCurrMin == 3
  553. && FCurrHour == 0)
  554. {
  555. FTimeSyncDay = FCurrDay;
  556. FTimeSyncMin = FCurrMin;
  557. #if 0
  558. SendTimeSync();
  559. #endif
  560. }
  561. // 프로세스 상태정보 이력 DB 입력
  562. if (FCurrSec > 1 && (FUnitSttsHsMin != FCurrMin))
  563. {
  564. //매 1분마다 상태정보 업데이트 하고 상태정보 업데이트 하는 곳에서 5분주기로 이력정보를 저장한다.
  565. FUnitSttsHsMin = FCurrMin;
  566. MINFO("MAIN=============> Save UNIT STTS");
  567. APP_PostDbThreadWriteMessage(dbm_save_unit_stts);
  568. }
  569. // 제어기 상태정보 요청
  570. if (FCurrSec > 20 && (FCtlrSttsReqMin != FCurrMin))
  571. {
  572. //매 1분마다 상태정보 요청한다.
  573. FCtlrSttsReqMin = FCurrMin;
  574. MINFO("MAIN=============> Req CTLR STTS");
  575. g_jobQ.PushBlocking(eVmsStatusReqAll);
  576. }
  577. // 제어기 상태정보 이력 DB 입력
  578. if (FCurrSec > 30 && (FCtlrSttsHsMin != FCurrMin))
  579. {
  580. //매 1분마다 상태정보 업데이트 하고 상태정보 업데이트 하는 곳에서 5분주기로 이력정보를 저장한다.
  581. FCtlrSttsHsMin = FCurrMin;
  582. MINFO("MAIN=============> Save CTLR STTS");
  583. APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts_all);
  584. }
  585. if (FCurrSec > 40)
  586. {
  587. if (g_SysInfo->RunSts == state_normal && COMM_TimeDiff(m_dtChkVmsJob) > 60)
  588. {
  589. //VMS 주기적인 작업을 데이터베이스에서 조회
  590. MINFO("MAIN=============> Check VMS Job Schedule");
  591. APP_PostDbThreadReadMessage(dbm_load_onoff_time);
  592. //APP_PostDbThreadWriteMessage(dbm_load_download_job);
  593. m_dtChkVmsJob = Now();
  594. }
  595. }
  596. //if (FCurrSec > 10)
  597. {
  598. if (g_SysInfo->RunSts == state_normal && COMM_TimeDiff(m_dtChkDbAlive) > 120)
  599. {
  600. //서버가 연결상태이고 DB 작업이 1분이상 경과된 경우 디비 연결상태를 체크한다.
  601. MINFO("MAIN=============> Check Database Alive");
  602. APP_PostDbThreadReadMessage(dbm_check_db_alive);
  603. m_dtChkDbAlive = Now();
  604. }
  605. }
  606. if (FFirstRunning && (COMM_TimeDiff(m_dtProgBoot) > 60)) {
  607. // 최초 프로그램 기동후 60 초 이내에 메시지 표출이 안된 경우 최초 메시지 다운로드한다.
  608. SendVmsTrafficProvide(3);
  609. }
  610. CheckProvideTimeout();
  611. JobThreadCheck();
  612. #if 0
  613. g_logQ.PushBlocking(Q_TICK);
  614. g_dbmQ.PushBlocking(Q_TICK);
  615. g_dbmReadQ.PushBlocking(Q_TICK);
  616. #endif
  617. g_jobQ.PushBlocking(Q_TICK); //접속한 클라이언트 작업을 위해 스레드를 깨운다.
  618. tmrAppState->Enabled = true;
  619. }
  620. //---------------------------------------------------------------------------
  621. void __fastcall TVmsCommMain::AutoClose()
  622. {
  623. g_AppCfg.bAppClose = true;
  624. //Close();
  625. }
  626. //---------------------------------------------------------------------------
  627. void __fastcall TVmsCommMain::tbConnectClick(TObject *Sender)
  628. {
  629. g_AppCfg.bThrExit = false;
  630. //FrmNetwork->Show();
  631. if (FrmNetwork->Start())
  632. {
  633. FServerRun = true;
  634. tbConnect->Enabled = false;
  635. tbDisconnect->Enabled = true;
  636. }
  637. }
  638. //---------------------------------------------------------------------------
  639. void __fastcall TVmsCommMain::tbDisconnectClick(TObject *Sender)
  640. {
  641. FServerRun = false;
  642. g_jobQ.PushBlocking(eTcpCloseAll);
  643. FrmNetwork->Stop();
  644. tbDisconnect->Enabled = false;
  645. tbConnect->Enabled = true;
  646. }
  647. //---------------------------------------------------------------------------
  648. void __fastcall TVmsCommMain::tbOptionsClick(TObject *Sender)
  649. {
  650. FrmOption = new TFrmOption(this);
  651. FrmOption->Left = VmsCommMain->Left + 80;
  652. FrmOption->Top = VmsCommMain->Top + 80;
  653. FrmOption->ShowModal();
  654. if (FrmOption->FUpdate)
  655. {
  656. try
  657. {
  658. ITSLog->FLogCfg = g_LogCfg;
  659. CtlrItr it;
  660. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  661. {
  662. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  663. if (!pObj->FDispLog)
  664. {
  665. pObj->FCLog->FLogCfg = g_LogCfg;
  666. pObj->FSLog->FLogCfg = g_LogCfg;
  667. }
  668. }
  669. }
  670. catch(Exception &e)
  671. {
  672. }
  673. }
  674. delete FrmOption;
  675. FrmOption = NULL;
  676. }
  677. //---------------------------------------------------------------------------
  678. void __fastcall TVmsCommMain::CheckCommState()
  679. {
  680. //g_SysInfo->RunSts = (FServerRun && DMManager->TcpServer->Active) ? state_normal : state_error;
  681. g_SysInfo->RunSts = (FServerRun) ? state_normal : state_error;
  682. if (g_SysInfo->RunSts == state_normal)
  683. {
  684. if (CDSCtlrManager->Total == CDSCtlrManager->Normal) g_SysInfo->ComSts = state_normal;
  685. else g_SysInfo->ComSts = state_error;
  686. }
  687. else
  688. {
  689. g_SysInfo->ComSts = state_error;
  690. }
  691. }
  692. //---------------------------------------------------------------------------
  693. void __fastcall TVmsCommMain::UpdateProcessStatePanel()
  694. {
  695. plStateAction->Color = (g_SysInfo->RunSts == state_normal) ? clGreen : clRed;
  696. plStateComm->Color = (g_SysInfo->ComSts == state_normal) ? clGreen : clRed;
  697. plStateDb->Color = (g_SysInfo->DbmSts == state_normal) ? clGreen : clRed;
  698. }
  699. //---------------------------------------------------------------------------
  700. void __fastcall TVmsCommMain::OnWMDbReadThreadMessage(TMessage &Msg)
  701. {
  702. int nCommand = (int)Msg.WParam;
  703. int nResult = (int)Msg.LParam;
  704. ReplyMessage(0);
  705. if (nCommand == dbm_job_start)
  706. {
  707. FDbReadJob = nResult;
  708. FDbReadTick = GetTickCount();
  709. tmrDbRead->Enabled = false;
  710. tmrDbRead->Enabled = true;
  711. return;
  712. }
  713. tmrDbRead->Enabled = false;
  714. switch(nCommand)
  715. {
  716. case dbm_status:
  717. g_SysInfo->DbmSts = nResult >= 0 ? state_normal : state_error;
  718. break;
  719. case dbm_dnld_form_init:
  720. MINFO("MAIN=============> VMS Message init start event");
  721. MakeVmsProvideForm();
  722. break;
  723. case dbm_dnld_form_cycle:
  724. case dbm_dnld_form_mode:
  725. MINFO("MAIN=============> VMS Message create start event");
  726. MakeVmsProvideForm();
  727. APP_PostDbThreadWriteMessage(dbm_save_form_download);
  728. break;
  729. case dbm_save_form_download:
  730. MINFO("MAIN=============> VMS Message download start event");
  731. //VMS 제어기에 VMS폼 스케쥴을 다운로드 하도록 이벤트 전송
  732. g_jobQ.PushBlocking(eVmsFormDownload);
  733. //클라이언트로 VMS폼 스케쥴이 저장되었다는 이벤트를 전송
  734. CDSManager->SendVmsDownloadForm();
  735. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  736. break;
  737. case dbm_initialize:
  738. break;
  739. }
  740. DWORD dwJobTick = GetTickCount() - FDbReadTick;
  741. switch(nCommand) {
  742. case dbm_dnld_form_init:
  743. case dbm_save_unit_stts:
  744. case dbm_save_unit_stts_hs:
  745. case dbm_save_ctlr_stts:
  746. case dbm_save_ctlr_stts_all:
  747. case dbm_save_ctlr_stts_hs:
  748. case dbm_dnld_form_cycle:
  749. case dbm_dnld_form_mode:
  750. case dbm_load_onoff_time:
  751. case dbm_load_download_job:
  752. case dbm_save_form_download:
  753. case dbm_provide_result:
  754. case dbm_parma_res:
  755. case dbm_master_symbol_image:
  756. case dbm_master_symbol_traffic:
  757. case dbm_master_form:
  758. case dbm_master_vms_ifsc:
  759. if (dwJobTick > g_AppCfg.DbDelayTick) {
  760. AnsiString dbJobName = APP_GetDbJobName(FDbReadJob);
  761. FrmVmsLog->LogMsg(dbJobName + ", R: " + String(dwJobTick) + " ms.");
  762. }
  763. break;
  764. }
  765. m_dtChkDbAlive = Now(); // 데이터베이스 작업 성공/실패 여부와 상관없이 체크타이머 초기화
  766. }
  767. //---------------------------------------------------------------------------
  768. void __fastcall TVmsCommMain::OnWMDbWriteThreadMessage(TMessage &Msg)
  769. {
  770. int nCommand = (int)Msg.WParam;
  771. int nResult = (int)Msg.LParam;
  772. ReplyMessage(0);
  773. if (nCommand == dbm_job_start)
  774. {
  775. FDbWriteJob = nResult;
  776. FDbWriteTick = GetTickCount();
  777. tmrDbWrite->Enabled = false;
  778. tmrDbWrite->Enabled = true;
  779. return;
  780. }
  781. tmrDbWrite->Enabled = false;
  782. switch(nCommand)
  783. {
  784. case dbm_status:
  785. g_SysInfo->DbmSts = nResult >= 0 ? state_normal : state_error;
  786. break;
  787. case dbm_dnld_form_init:
  788. MINFO("MAIN=============> VMS Message init start event");
  789. MakeVmsProvideForm();
  790. break;
  791. case dbm_dnld_form_cycle:
  792. case dbm_dnld_form_mode:
  793. MINFO("MAIN=============> VMS Message create start event");
  794. MakeVmsProvideForm();
  795. APP_PostDbThreadWriteMessage(dbm_save_form_download);
  796. break;
  797. case dbm_save_form_download:
  798. MINFO("MAIN=============> VMS Message download start event");
  799. //VMS 제어기에 VMS폼 스케쥴을 다운로드 하도록 이벤트 전송
  800. g_jobQ.PushBlocking(eVmsFormDownload);
  801. //클라이언트로 VMS폼 스케쥴이 저장되었다는 이벤트를 전송
  802. CDSManager->SendVmsDownloadForm();
  803. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  804. break;
  805. case dbm_initialize:
  806. break;
  807. }
  808. DWORD dwJobTick = GetTickCount() - FDbWriteTick;
  809. switch(nCommand) {
  810. case dbm_dnld_form_init:
  811. case dbm_save_unit_stts:
  812. case dbm_save_unit_stts_hs:
  813. case dbm_save_ctlr_stts:
  814. case dbm_save_ctlr_stts_all:
  815. case dbm_save_ctlr_stts_hs:
  816. case dbm_dnld_form_cycle:
  817. case dbm_dnld_form_mode:
  818. case dbm_load_onoff_time:
  819. case dbm_load_download_job:
  820. case dbm_save_form_download:
  821. case dbm_provide_result:
  822. case dbm_parma_res:
  823. case dbm_master_symbol_image:
  824. case dbm_master_symbol_traffic:
  825. case dbm_master_form:
  826. case dbm_master_vms_ifsc:
  827. if (dwJobTick > g_AppCfg.DbDelayTick) {
  828. AnsiString dbJobName = APP_GetDbJobName(FDbWriteJob);
  829. FrmVmsLog->LogMsg(dbJobName + ", W: " + String(dwJobTick) + " ms.");
  830. }
  831. break;
  832. }
  833. m_dtChkDbAlive = Now(); // 데이터베이스 작업 성공/실패 여부와 상관없이 체크타이머 초기화
  834. }
  835. //---------------------------------------------------------------------------
  836. void __fastcall TVmsCommMain::OnWMUserMessage(TMessage &Msg)
  837. {
  838. ReplyMessage(0);
  839. if ((int)Msg.WParam == WM_WINDOW_RESTORE)
  840. {
  841. Application->Restore();
  842. Application->BringToFront();
  843. return;
  844. }
  845. }
  846. //---------------------------------------------------------------------------
  847. void __fastcall TVmsCommMain::OnTcpThreadMessage(TMessage &Msg)
  848. {
  849. TCDSCtlr *pObj = (TCDSCtlr*)Msg.LParam;
  850. CTLR_STTS stts;
  851. switch(Msg.WParam)
  852. {
  853. case WM_TCP_SERVER_STTS: // 클라이언트의 연결 또는 연결종료시 수신 메시지
  854. try
  855. {
  856. if (pObj->Server.commState == comm_open)
  857. {
  858. pObj->dwConnectCnt++;
  859. MINFO("MAIN=============> VMS Connect Event: %s", pObj->CTLR_NMBR.c_str());
  860. }
  861. else
  862. {
  863. MINFO("MAIN=============> VMS Closed Event: %s", pObj->CTLR_NMBR.c_str());
  864. }
  865. } catch(Exception &e) {}
  866. FrmControllerInfo->UpdateServerState((int)pObj);
  867. stts.Type = 1;
  868. stts.ObjPtr = (void*)pObj;
  869. APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts, sizeof(stts), &stts);
  870. break;
  871. case WM_CTLR_STATE_STTS: // 연결된 제어기로 부터 상태정보를 수신할시
  872. //try
  873. //{
  874. // MINFO("MAIN VMS State Event: %s", pObj->CTLR_NMBR.c_str());
  875. //} catch(Exception &e) {}
  876. FrmControllerInfo->UpdateClientState((int)pObj);
  877. stts.Type = 0;
  878. stts.ObjPtr = (void*)pObj;
  879. APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts, sizeof(stts), &stts);
  880. break;
  881. }
  882. }
  883. //---------------------------------------------------------------------------
  884. void __fastcall TVmsCommMain::OnPanelRefreshMessage(TMessage &Msg)
  885. {
  886. TColor color = (TColor)Msg.LParam;
  887. switch(Msg.WParam)
  888. {
  889. case 0: plStateLog->Color = color; plStateLog->Refresh(); break;
  890. case 1: plStateDbmRead->Color = color; plStateDbmRead->Refresh(); break;
  891. case 2: plStateDbm->Color = color; plStateDbm->Refresh(); break;
  892. case 3: plStateJob->Color = color; plStateJob->Refresh(); break;
  893. }
  894. }
  895. //---------------------------------------------------------------------------
  896. void __fastcall TVmsCommMain::tmrProvideTimer(TObject *Sender)
  897. {
  898. SendVmsTrafficProvide(1);
  899. }
  900. //---------------------------------------------------------------------------
  901. void __fastcall TVmsCommMain::ResetProviderTimer()
  902. {
  903. tmrProvide->Enabled = false;
  904. tmrProvide->Interval = g_AppCfg.nTrafficCycleTime * 1000;
  905. m_dtTimeOut = Now();
  906. tmrProvide->Enabled = true;
  907. }
  908. //---------------------------------------------------------------------------
  909. void __fastcall TVmsCommMain::OnUdpDataRecvMessage(TMessage &Msg)
  910. {
  911. int nResult;
  912. IPC_MSG_DATA *RcvData = (IPC_MSG_DATA*)Msg.LParam;
  913. INT_SENDER *Sender = &RcvData->Sender;
  914. INT_PACKET *Pkt = &RcvData->Pkt;
  915. INT_HEAD *head = &Pkt->head;
  916. INT_DATA *data = &Pkt->data;
  917. char *pData = &Pkt->data.Data[0];
  918. BYTE OpCode = head->OpCode;
  919. MINFO("MAIN=============> Center Msg: %s.%d, OpCode: %02X, From: %02X, To: %02X", CComm_ulong2ip(Sender->IP), Sender->Port, OpCode, head->SendId, head->RecvId);
  920. switch(OpCode)
  921. {
  922. case INT_OP_TRAFFIC_CHANGE:
  923. MINFO("MAIN=============> INT_OP_TRAFFIC_CHANGE");
  924. CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
  925. SendVmsTrafficProvide(0);
  926. break;
  927. case INT_OP_VMS_POWER_CTL: //전광판 On/Off
  928. {
  929. INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pData;
  930. MINFO("MAIN=============> INT_OP_VMS_POWER_CTL: %.*s %d, %s, %d", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId, pReq->Command);
  931. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  932. if (!pCDSCtlr) break;
  933. if (!pCDSCtlr->FSession) break;
  934. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  935. pMsg->Type = eVmsStatusControl;
  936. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  937. pMsg->Buff[0] = 0x01;
  938. pMsg->Buff[1] = (BYTE)pReq->Command;
  939. pMsg->Len = 2;
  940. g_jobQ.PushBlocking((DWORD)pMsg);
  941. }
  942. break;
  943. case INT_OP_VMS_RESET:
  944. {
  945. INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pData;
  946. MINFO("MAIN=============> INT_OP_VMS_RESET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
  947. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  948. if (!pCDSCtlr) break;
  949. if (!pCDSCtlr->FSession) break;
  950. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  951. pMsg->Type = eVmsStatusControl;
  952. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  953. pMsg->Buff[0] = 0x02;
  954. pMsg->Len = 1;
  955. g_jobQ.PushBlocking((DWORD)pMsg);
  956. }
  957. break;
  958. case INT_OP_VMS_LUMINANCE_CTL: //휘도설정
  959. {
  960. INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pData;
  961. MINFO("MAIN=============> INT_OP_VMS_LUMINANCE_CTL: %.*s %d, %s, %02X", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId, pReq->BrghMode);
  962. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  963. if (!pCDSCtlr) break;
  964. if (!pCDSCtlr->FSession) break;
  965. BYTE cmdVal = 0x00;
  966. switch(pReq->BrghMode)
  967. {
  968. case 0x00: //주간
  969. cmdVal = pReq->BrghWeekStep;
  970. break;
  971. case 0x01: //야간
  972. cmdVal = pReq->BrghNghtStep;
  973. break;
  974. case 0x02: //자동
  975. cmdVal = 0x00;
  976. break;
  977. default: return;
  978. }
  979. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  980. pMsg->Type = eVmsStatusControl;
  981. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  982. pMsg->Buff[0] = 0x06;
  983. pMsg->Buff[1] = (BYTE)pReq->BrghMode;
  984. pMsg->Buff[2] = cmdVal;
  985. pMsg->Len = 3;
  986. g_jobQ.PushBlocking((DWORD)pMsg);
  987. }
  988. break;
  989. case INT_OP_VMS_PARA_SET: //환경설정 정보 설정
  990. {
  991. INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
  992. MINFO("MAIN=============> INT_OP_VMS_PARA_SET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
  993. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  994. if (!pCDSCtlr) break;
  995. if (!pCDSCtlr->FSession) break;
  996. //도형식에는 설정정보가 없고 문자식에만 설정하는 프로토콜이 있음
  997. //현재 적용하지 않았음.........
  998. //적용할 경우 VMS유형(AObj->PROTOCOL_VER == 1) 확인해서 처리해야함
  999. //함체 PAN/HEATER 온도 설정
  1000. //Download Parameter
  1001. #if 0
  1002. SIGNT_CONFIG_SET set;
  1003. set.VMS_CTLR_NMBR = pCDSCtlr->CTLR_NMBR.ToIntDef(0);
  1004. set.FanRunTmpr = pReq->FanRunTmpr;
  1005. set.HetrRunTmpr = pReq->HetrRunTmpr;
  1006. memcpy(set.PanlOnTime, pReq->DispStrTm, 4);
  1007. memcpy(set.PanlOffTime, pReq->DispEndTm, 4);
  1008. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1009. pMsg->Type = eVmsConfigSet;
  1010. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  1011. memcpy(pMsg->Buff, (char*)&set, sizeof(SIGNT_CONFIG_SET));
  1012. g_jobQ.PushBlocking((DWORD)pMsg);
  1013. #endif
  1014. }
  1015. break;
  1016. case INT_OP_VMS_PARAM_REQ:
  1017. {
  1018. INT_VMS_PARAM_REQ *pReq = (INT_VMS_PARAM_REQ*)pData;
  1019. MINFO("MAIN=============> INT_OP_VMS_PARAM_REQ: %d", pReq->Count);
  1020. for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
  1021. {
  1022. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
  1023. if (!pCDSCtlr) continue;
  1024. if (!pCDSCtlr->FSession) continue;
  1025. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1026. pMsg->Type = eVmsParamReq;
  1027. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  1028. g_jobQ.PushBlocking((DWORD)pMsg);
  1029. }
  1030. }
  1031. break;
  1032. case INT_OP_VMS_IMMEDIATE_SCN_DNLD:
  1033. {
  1034. INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ *pReq = (INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ*)pData;
  1035. MINFO("MAIN=============> INT_OP_VMS_IMMEDIATE_SCN_DNLD: %.*s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId);
  1036. for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
  1037. {
  1038. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
  1039. if (!pObj) continue;
  1040. if (!pObj->FSession) continue;
  1041. CDSCtlrManager->InitProvide(pObj);
  1042. #if 0
  1043. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1044. pMsg->Type = eVmsScenarioDownload;
  1045. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  1046. g_jobQ.PushBlocking((DWORD)pMsg);
  1047. #endif
  1048. }
  1049. APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
  1050. //APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
  1051. }
  1052. break;
  1053. case INT_OP_VMS_MODE:
  1054. {
  1055. INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pData;
  1056. MINFO("MAIN=============> INT_OP_VMS_MODE: %.*s %s, %s, %d EA.", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId, pReq->Count);
  1057. //모든 VMS에 메시지다운로드 플래그 비활성화 시킴
  1058. //CDSCtlrManager->InitProvide(false);
  1059. //수신한 VMS에 대하여 다운로드 플래그 활성화 시킴
  1060. for(int ii = 0; ii < pReq->Count && ii < INT_VMS_MAX_MODE; ii++)
  1061. {
  1062. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->Unit[ii].VMS_CTLR_NMBR));
  1063. if (!pObj) continue;
  1064. if (pObj->Server.useFlag != use_enable) continue;
  1065. if (pObj->CTRLMODE->Control == pReq->Unit[ii].Mode)
  1066. pObj->FModeChange = false;
  1067. else
  1068. pObj->FModeChange = true;
  1069. pObj->CTRLMODE->Control = pReq->Unit[ii].Mode;
  1070. pObj->DSTATE.OprMode = pObj->CTRLMODE->Control;
  1071. pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
  1072. if (pObj->CTRLMODE->Control == 'A') pObj->OPER_MODE = "A";
  1073. else if (pObj->CTRLMODE->Control == 'B') pObj->OPER_MODE = "B";
  1074. else pObj->OPER_MODE = "F";
  1075. //pObj->FProvide = true;
  1076. CDSCtlrManager->InitProvide(pObj);
  1077. }
  1078. FrmControllerInfo->UpdateCtlrList();
  1079. APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
  1080. }
  1081. break;
  1082. case INT_OP_VMS_STATE_REQ:
  1083. MINFO("MAIN=============> INT_OP_VMS_STATE_REQ");
  1084. CDSCtlrManager->SendCtlrSttsAll();
  1085. break;
  1086. case INT_OP_VMS_IMAGE_SYMBOL:
  1087. MINFO("MAIN=============> INT_OP_VMS_IMAGE_SYMBOL");
  1088. APP_PostDbThreadReadMessage(dbm_master_symbol_image);
  1089. break;
  1090. case INT_OP_VMS_IMAGE_TRAFFIC:
  1091. MINFO("MAIN=============> INT_OP_VMS_IMAGE_TRAFFIC");
  1092. APP_PostDbThreadReadMessage(dbm_master_symbol_traffic);
  1093. break;
  1094. case INT_OP_VMS_FORM_UPDATE:
  1095. MINFO("MAIN=============> INT_OP_VMS_FORM_UPDATE");
  1096. APP_PostDbThreadReadMessage(dbm_master_form);
  1097. break;
  1098. case INT_OP_VMS_IFSC_UPDATE:
  1099. MINFO("MAIN=============> INT_OP_VMS_IFSC_UPDATE");
  1100. APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
  1101. break;
  1102. case INT_ID_TRAFFIC_SERVER:
  1103. MINFO("MAIN=============> INT_ID_TRAFFIC_SERVER");
  1104. break;
  1105. default:
  1106. MINFO("MAIN INT_UNKNOWN: %02X", OpCode);
  1107. break;
  1108. }
  1109. }
  1110. //---------------------------------------------------------------------------
  1111. #if 0
  1112. void __fastcall TVmsCommMain::ClientResponse(int Flag, REQ_INFO_STRUCT *pReq, int error, void *pData)
  1113. {
  1114. #ifdef CENTERCOMM
  1115. BYTE ErrCode;
  1116. int sResult;
  1117. switch(error)
  1118. {
  1119. case SYS_ERR_NONE: break;
  1120. case SYS_ERR_OTHER: ErrCode = INT_ERROR_OTHER; break;
  1121. case SYS_ERR_INTERNAL: ErrCode = INT_ERROR_SYSTEM; break;
  1122. case SYS_ERR_MEMORY: ErrCode = INT_ERROR_SYSTEM; break;
  1123. case SYS_ERR_DATABASE: ErrCode = INT_ERROR_SYSTEM; break;
  1124. case SYS_ERR_RESET: ErrCode = INT_ERROR_SYSTEM; break;
  1125. case SYS_ERR_START: ErrCode = INT_ERROR_SYSTEM; break;
  1126. case SYS_ERR_OFFLINE: ErrCode = INT_ERROR_OFFLINE; break;
  1127. case SYS_ERR_NO_RES: ErrCode = INT_ERROR_NO_RESPONSE; break;
  1128. case SYS_ERR_ACCESS: ErrCode = INT_ERROR_PROCESS; break;
  1129. case SYS_ERR_INVALID: ErrCode = INT_ERROR_OTHER; break;
  1130. case SYS_ERR_UNKNOWN: ErrCode = INT_ERROR_UNKNOWN_CODE; break;
  1131. case SYS_ERR_WRITE_LENGTH: ErrCode = INT_ERROR_OTHER; break;
  1132. case SYS_ERR_PACKET_SIZE_LARGE: ErrCode = INT_ERROR_OTHER; break;
  1133. case SYS_ERR_INVALID_TAG: ErrCode = INT_ERROR_OTHER; break;
  1134. case SYS_ERR_CRC: ErrCode = INT_ERROR_OTHER; break;
  1135. case SYS_ERR_LENGTH: ErrCode = INT_ERROR_LENGTH; break;
  1136. case SYS_ERR_ADDRESS: ErrCode = INT_ERROR_ADDRESS; break;
  1137. case SYS_ERR_HEADER_OPTIONS: ErrCode = INT_ERROR_HEADER; break;
  1138. case SYS_ERR_UNKNOWN_COMMAND: ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
  1139. case SYS_ERR_RECEIVE_TIMEOUT: ErrCode = INT_ERROR_OTHER; break;
  1140. case SYS_ERR_DATA_SIZE: ErrCode = INT_ERROR_DISCORD; break;
  1141. case SYS_ERR_MISMATCH: ErrCode = INT_ERROR_OTHER; break;
  1142. case SYS_ERR_INVALID_PARA: ErrCode = INT_ERROR_INVALID_DATA; break;
  1143. case SYS_ERR_MOVEMENT: ErrCode = INT_ERROR_MOVEMENT; break;
  1144. case SYS_ERR_UNAUTHORIZED: ErrCode = INT_ERROR_UNAUTHORIZED; break;
  1145. default: ErrCode = INT_ERROR_OTHER; break;
  1146. }
  1147. if (Flag == SEND_ACK)
  1148. {
  1149. INT_ACK_RES Ack;
  1150. memset(&Ack, 0x00, sizeof(Ack));
  1151. Ack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1152. Ack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1153. Ack.MsgSeq = pReq->MsgSeq;
  1154. if ((sResult = AckRes(&Ack, pReq->ProcessID)) != UDP_ERR_NONE)
  1155. {
  1156. MERROR("MAIN AckRes fail %d", sResult);
  1157. }
  1158. }
  1159. else
  1160. if (Flag == SEND_NACK)
  1161. {
  1162. INT_NACK_RES Nack;
  1163. memset(&Nack, 0x00, sizeof(Nack));
  1164. Nack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1165. Nack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1166. Nack.MsgSeq = pReq->MsgSeq;
  1167. Nack.ErrCode = ErrCode;
  1168. if ((sResult = NackRes(&Nack, pReq->ProcessID)) != UDP_ERR_NONE)
  1169. {
  1170. MERROR("MAIN NackRes fail %d", sResult);
  1171. }
  1172. }
  1173. #endif
  1174. }
  1175. //---------------------------------------------------------------------------
  1176. #endif
  1177. bool __fastcall TVmsCommMain::CheckBasisTime(char *p, int Cycle, int Basis)
  1178. {
  1179. char cTime[15];
  1180. COMM_MakeBasisTime(cTime, Cycle, Basis);
  1181. if (memcmp(p, cTime, 14) != 0)
  1182. {
  1183. memcpy(p, cTime, 14);
  1184. return true;
  1185. }
  1186. return false;
  1187. }
  1188. //---------------------------------------------------------------------------
  1189. void __fastcall TVmsCommMain::CheckProvideTimeout()
  1190. {
  1191. VMS_PROVIDE_RESULE ProvideSave;
  1192. VMS_PROVIDE_RESULE DownLoadSave;
  1193. memset(&ProvideSave, 0x00, sizeof(ProvideSave));
  1194. memset(&DownLoadSave, 0x00, sizeof(DownLoadSave));
  1195. ProvideSave.Type = provide_form;
  1196. ProvideSave.Count = 0;
  1197. DownLoadSave.Type = provide_download;
  1198. DownLoadSave.Count = 0;
  1199. int nCheckVmsCount = 0;
  1200. CtlrItr it;
  1201. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1202. {
  1203. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1204. if (pObj->Server.useFlag != use_enable) continue;
  1205. bool isCtrlMode = COMM_TimeDiff(pObj->CTRLMODE->pTimer) > VMS_PROVIDE_TIMEOUT;
  1206. if ((pObj->DOWNLOAD->SaveFlag == false) &&
  1207. (COMM_TimeDiff(pObj->DOWNLOAD->dTimer) > VMS_DOWNLOAD_TIMEOUT))
  1208. {
  1209. DownLoadSave.pObj[DownLoadSave.Count++] = (void *)pObj;
  1210. pObj->DOWNLOAD->SaveFlag = true;
  1211. pObj->DOWNLOAD->dTimer = Now();
  1212. }
  1213. if ((pObj->CTRLMODE->SaveFlag == false) && isCtrlMode)
  1214. {
  1215. nCheckVmsCount++;
  1216. ProvideSave.pObj[ProvideSave.Count++] = (void *)pObj;
  1217. pObj->CTRLMODE->SaveFlag = true;
  1218. pObj->CTRLMODE->pTimer = Now();
  1219. MINFO("MAIN=============> VMS Download Timeout Form VMS NMBR: %s", pObj->CTLR_NMBR.c_str());
  1220. }
  1221. // 패킷크기가 채워졌으면 DB 작업스레드로 전송
  1222. if (ProvideSave.Count >= MAX_VMS_PROVIDE_RESULT)
  1223. {
  1224. MINFO("MAIN=============> VMS Download Timeout Form Save: %d EA.", ProvideSave.Count);
  1225. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
  1226. ProvideSave.Count = 0;
  1227. }
  1228. if (DownLoadSave.Count >= MAX_VMS_PROVIDE_RESULT)
  1229. {
  1230. MINFO("MAIN=============> VMS Download Timeout Form Data: %d EA.", DownLoadSave.Count);
  1231. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
  1232. DownLoadSave.Count = 0;
  1233. }
  1234. }
  1235. // 실패작업이 존재하면 DB 작업스레드로 전송
  1236. if (ProvideSave.Count > 0)
  1237. {
  1238. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
  1239. }
  1240. if (DownLoadSave.Count > 0)
  1241. {
  1242. MINFO("MAIN=============> VMS Download Timeout Data Save: %d EA.", DownLoadSave.Count);
  1243. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
  1244. }
  1245. if (nCheckVmsCount > 0) {
  1246. MINFO("MAIN=============> VMS Download Timeout Form Save: VMS(%d), %d EA.", nCheckVmsCount, ProvideSave.Count);
  1247. }
  1248. }
  1249. //---------------------------------------------------------------------------
  1250. void __fastcall TVmsCommMain::SendTimeSync()
  1251. {
  1252. CtlrItr it;
  1253. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1254. {
  1255. TCDSCtlr *pCDSCtlr = (TCDSCtlr*)it->second;
  1256. if (pCDSCtlr->Server.useFlag != use_enable) continue;
  1257. if (pCDSCtlr->FSession)
  1258. {
  1259. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1260. pMsg->Type = eVmsStatusControl;
  1261. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  1262. pMsg->Buff[0] = 0x04;
  1263. memcpy(&pMsg->Buff[1], AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), 14);
  1264. pMsg->Len = 1+14;
  1265. g_jobQ.PushBlocking((DWORD)pMsg);
  1266. // 제어기가 연결되어 있으면 전송
  1267. MINFO("MAIN=============> SendTimeSync command send: %s", pCDSCtlr->CTLR_NMBR.c_str());
  1268. }
  1269. }
  1270. }
  1271. //---------------------------------------------------------------------------
  1272. bool __fastcall TVmsCommMain::CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi)
  1273. {
  1274. bool result;
  1275. HANDLE hProcess;
  1276. PROCESS_MEMORY_COUNTERS pmc;
  1277. size_t uSize;
  1278. DWORD HandleCount, ThreadCount, GdiCount;
  1279. HANDLE hProcessSnap;
  1280. PROCESSENTRY32 pe32;
  1281. DWORD ProcessId;
  1282. result = false;
  1283. uSize = 0;
  1284. HandleCount = 0;
  1285. ThreadCount = 0;
  1286. GdiCount = 0;
  1287. hProcess = GetCurrentProcess();
  1288. if (hProcess != NULL)
  1289. {
  1290. if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
  1291. {
  1292. uSize = pmc.WorkingSetSize/1024;
  1293. if ((MaxMemory != 0) && (uSize > MaxMemory))
  1294. {
  1295. MERROR("MAIN=============> Memory usage exceeds standards!!!...[%d][%d]", MaxMemory, uSize);
  1296. result = true;
  1297. }
  1298. }
  1299. if ( GetProcessHandleCount( hProcess, &HandleCount) )
  1300. {
  1301. if ((MaxHandle != 0) && (HandleCount > MaxHandle))
  1302. {
  1303. MERROR("MAIN=============> Window handle exceed standards!!!...[%d][%d]", MaxHandle, HandleCount);
  1304. result = true;
  1305. }
  1306. }
  1307. ProcessId = GetCurrentProcessId();
  1308. if ((hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )) != INVALID_HANDLE_VALUE)
  1309. {
  1310. pe32.dwSize = sizeof( PROCESSENTRY32 );
  1311. if ( Process32First( hProcessSnap, &pe32 ) )
  1312. {
  1313. do
  1314. {
  1315. if (pe32.th32ProcessID == ProcessId)
  1316. {
  1317. ThreadCount = pe32.cntThreads;
  1318. if ((MaxThread != 0) && (ThreadCount > MaxThread))
  1319. {
  1320. MERROR("MAIN=============> Criteria exceeded thread!!!...[%d][%d]", MaxThread, ThreadCount);
  1321. result = true;
  1322. }
  1323. break;
  1324. }
  1325. } while( Process32Next( hProcessSnap, &pe32 ) );
  1326. }
  1327. CloseHandle( hProcessSnap );
  1328. }
  1329. GdiCount = GetGuiResources( hProcess, GR_GDIOBJECTS);
  1330. if ((MaxGdi != 0) && (GdiCount > MaxGdi))
  1331. {
  1332. MERROR("MAIN=============> GDI Objects exceeding standards!!!...[%d][%d]", MaxGdi, GdiCount);
  1333. result = true;
  1334. }
  1335. CloseHandle( hProcess );
  1336. }
  1337. try
  1338. {
  1339. FMemSize = uSize;
  1340. plMemory->Caption = FormatFloat("##,##0", uSize) ;// + " KB";
  1341. plHandle->Caption = FormatFloat("##,##0", HandleCount);// + " EA";
  1342. plThread->Caption = FormatFloat("##,##0", ThreadCount);// + " EA";
  1343. plGdi->Caption = FormatFloat("##,##0", GdiCount) ;// + " EA";
  1344. #if 0
  1345. MINFO("MAIN=============> Memory: %s, Haldle: %s, Thread: %s, GDI: %s",
  1346. AnsiString(plMemory->Caption).c_str(),
  1347. AnsiString(plHandle->Caption).c_str(),
  1348. AnsiString(plThread->Caption).c_str(),
  1349. AnsiString(plGdi->Caption).c_str()
  1350. );
  1351. #endif
  1352. } catch (Exception &e) {}
  1353. return result;
  1354. }
  1355. //---------------------------------------------------------------------------
  1356. void __fastcall TVmsCommMain::Panel16DblClick(TObject *Sender)
  1357. {
  1358. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  1359. }
  1360. //---------------------------------------------------------------------------
  1361. void __fastcall TVmsCommMain::plStateDbDblClick(TObject *Sender)
  1362. {
  1363. APP_PostDbThreadReadMessage(dbm_master_symbol_image);
  1364. APP_PostDbThreadReadMessage(dbm_master_form);
  1365. APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
  1366. }
  1367. //---------------------------------------------------------------------------
  1368. void __fastcall TVmsCommMain::plStateCommDblClick(TObject *Sender)
  1369. {
  1370. AnsiString VMS_IFSC_ID;
  1371. int SECT_LNGT;
  1372. TItsMap<int, TObjectId*> FLists;
  1373. TItsMap<AnsiString, TVmsIfscGrad*> FGrads;
  1374. VMS_TRAF traf;
  1375. int SPED; // N NUMBER(3) Y 0 속도
  1376. int TRVL_HH; // N NUMBER(6) Y 0 통행 시간
  1377. AnsiString CMTR_GRAD_CD; // N VARCHAR2(7) Y 소통 등급 코드
  1378. if (!CDSVmsIfscTrafManager) return;
  1379. FOR_STL(TCDSVmsIfscTraf*, pObj, CDSVmsIfscTrafManager->FVmsIfscLists)
  1380. {
  1381. int objValid = pObj->IsValid == false ? 0 : 1;
  1382. MINFO("VMS_IFSC_ID: %s, SECT_LNGT: %5d, VALID: %d, Objects: %d, SPED: %3d, TRVL_HH: %4d, GRAD_CD: %s",
  1383. pObj->VMS_IFSC_ID, pObj->SECT_LNGT, objValid, pObj->FLists.Size(), pObj->traf.SPED, pObj->traf.TRVL_HH, pObj->traf.CMTR_GRAD_CD);
  1384. FOR_STL(TVmsIfscGrad*, pGrad, pObj->FGrads)
  1385. {
  1386. int gradValid = pGrad->IsValid == false ? 0 : 1;
  1387. MINFO(" GRAD_CD: %s, VALID: %d, LWSTSPED: %3d, HGHSSPED: %3d", pGrad->CMTR_GRAD_CD, gradValid, pGrad->LWSTSPED, pGrad->HGHSSPED);
  1388. }
  1389. int ii = 1;
  1390. FOR_STL(TObjectId*, pID, pObj->FLists)
  1391. {
  1392. int idValid = pID->IsValid == false ? 0 : 1;
  1393. TCDSIfscTraf* pIfsc = CDSVmsIfscTrafManager->FIfscTrafLists.Find(pID->ID);
  1394. if (pIfsc)
  1395. {
  1396. MINFO(" %2d: IFSC_ID: %s, SECT_LNGT: %5d, VALID: %d, SPED: %3d, TRVL_HH: %4d", ii, pIfsc->IFSC_ID, pIfsc->SECT_LNGT, idValid, pIfsc->SPED, pIfsc->TRVL_HH);
  1397. }
  1398. else
  1399. {
  1400. MINFO(" %2d: IFSC_ID: %s, Not Found", ii, pID->ID);
  1401. }
  1402. ii++;
  1403. }
  1404. MINFO("");
  1405. }
  1406. }
  1407. //---------------------------------------------------------------------------
  1408. void __fastcall TVmsCommMain::plStateActionDblClick(TObject *Sender)
  1409. {
  1410. plStateAction->Enabled = false;
  1411. tmrRunProvide->Enabled = false;
  1412. tmrRunProvide->Enabled = true;
  1413. CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
  1414. CtlrItr it;
  1415. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1416. {
  1417. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1418. if (!pObj->FSession) continue;
  1419. CDSCtlrManager->InitProvide(pObj);
  1420. }
  1421. APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
  1422. }
  1423. //---------------------------------------------------------------------------
  1424. void __fastcall TVmsCommMain::tmrRunProvideTimer(TObject *Sender)
  1425. {
  1426. tmrRunProvide->Enabled = false;
  1427. plStateAction->Enabled = true;
  1428. }
  1429. //---------------------------------------------------------------------------
  1430. bool __fastcall TVmsCommMain::JobThreadStart()
  1431. {
  1432. int nThreadCnt = 0;
  1433. if (true)
  1434. {
  1435. LogThread = new TLogThread();
  1436. if (!LogThread) return false;
  1437. LogThread->FPnlState = plStateLog;
  1438. LogThread->FTmrDb = NULL;
  1439. LogThread->Name = "LogThread";
  1440. LogThread->Execute();
  1441. G_Threads.Push(nThreadCnt++, LogThread);
  1442. }
  1443. if (true)
  1444. {
  1445. DbmThread = new TDbmThread();
  1446. if (!DbmThread) return false;
  1447. DbmThread->FPnlState = plStateDbm;
  1448. DbmThread->FTmrDb = tmrDbWrite;
  1449. DbmThread->Name = "DbmThread";
  1450. DbmThread->Execute();
  1451. G_Threads.Push(nThreadCnt++, DbmThread);
  1452. }
  1453. if (true)
  1454. {
  1455. DbmReadThread = new TDbmReadThread();
  1456. if (!DbmReadThread) return false;
  1457. DbmReadThread->FPnlState = plStateDbmRead;
  1458. DbmReadThread->FTmrDb = tmrDbRead;
  1459. DbmReadThread->Name = "DbmReadThread";
  1460. DbmReadThread->Execute();
  1461. G_Threads.Push(nThreadCnt++, DbmReadThread);
  1462. }
  1463. if (true)
  1464. {
  1465. JobThread = new TJobThread();
  1466. if (!JobThread) return false;
  1467. JobThread->FPnlState = plStateJob;
  1468. JobThread->FTmrDb = NULL;
  1469. JobThread->Name = "JobThread";
  1470. JobThread->Execute();
  1471. G_Threads.Push(nThreadCnt++, JobThread);
  1472. }
  1473. return true;
  1474. }
  1475. //---------------------------------------------------------------------------
  1476. void __fastcall TVmsCommMain::JobThreadCheck()
  1477. {
  1478. int nTermCnt = 0;
  1479. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
  1480. {
  1481. TItsThread *pObj = (TItsThread*)it->second;
  1482. if (pObj->IsTerm())
  1483. {
  1484. pObj->Execute();
  1485. nTermCnt++;
  1486. }
  1487. }
  1488. }
  1489. //---------------------------------------------------------------------------
  1490. void __fastcall TVmsCommMain::JobThreadStop()
  1491. {
  1492. g_AppCfg.bThrExit = true;
  1493. g_jobQ.PushBlocking(Q_CLOSE);
  1494. g_dbmQ.PushBlocking(Q_CLOSE);
  1495. g_dbmReadQ.PushBlocking(Q_CLOSE);
  1496. g_logQ.PushBlocking(Q_CLOSE);
  1497. HANDLE handles[50];
  1498. int nWaits = 0;
  1499. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
  1500. {
  1501. TItsThread *pObj = (TItsThread*)it->second;
  1502. if (!pObj->IsTerm())
  1503. {
  1504. //pObj->Terminate(2000);
  1505. handles[nWaits++] = pObj->Handle;
  1506. }
  1507. }
  1508. WaitForMultipleObjects(nWaits, handles, true, 1000);
  1509. G_Threads.RemoveAll();
  1510. }
  1511. //---------------------------------------------------------------------------
  1512. void __fastcall TVmsCommMain::TerminateApplication()
  1513. {
  1514. MERROR("MAIN=============> Program terminated start");
  1515. SendTerminal();
  1516. CComm_Close();
  1517. MERROR("MAIN=============> Program terminated end");
  1518. g_logQ.PushBlocking(Q_CLOSE);
  1519. for (int ii = 0; ii < 50; ii++)
  1520. {
  1521. Sleep(30);
  1522. Application->ProcessMessages();
  1523. if (g_AppCfg.bThrJobExit) break;
  1524. }
  1525. }
  1526. //---------------------------------------------------------------------------
  1527. void __fastcall TVmsCommMain::SendTerminal()
  1528. {
  1529. int result;
  1530. MINFO("MAIN=============> SendTerminal");
  1531. // 동작, 통신, DB 모두 이상 처리
  1532. g_SysInfo->RunSts = state_error;
  1533. g_SysInfo->ComSts = state_error;
  1534. g_SysInfo->DbmSts = state_error;
  1535. // 모든 시설물 통신 오프라인 처리
  1536. CtlrItr it;
  1537. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1538. {
  1539. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1540. if (!pObj->Used) continue;
  1541. pObj->Server.thrState = thr_stop;
  1542. pObj->Client.thrState = thr_stop;
  1543. pObj->Server.commState = comm_close;
  1544. pObj->Client.commState = comm_close;
  1545. }
  1546. INT_PG_STATE_RES PgState;
  1547. memset(&PgState, 0x00, sizeof(PgState));
  1548. PgState.Count = 1;
  1549. PgState.Unit[0].Type = INT_ID_VMS_SERVER;
  1550. PgState.Unit[0].DB = g_SysInfo->DbmSts;
  1551. PgState.Unit[0].Comm = g_SysInfo->ComSts;
  1552. PgState.Unit[0].Action = g_SysInfo->RunSts;
  1553. result = CComm_CmmProcessStateNotify(&PgState);
  1554. TDMAdoDb *FDb = new TDMAdoDb(NULL);
  1555. try
  1556. {
  1557. if (FDb->Connect(g_AppCfg.db.sConnectStr))
  1558. {
  1559. CDSProcessManager->SaveUnitStts(FDb->GetConnection());
  1560. CDSCtlrManager->SaveCtlrSttsAll(FDb->GetConnection());
  1561. }
  1562. }
  1563. __finally
  1564. {
  1565. if (FDb)
  1566. {
  1567. FDb->Close();
  1568. }
  1569. SAFE_DELETE(FDb);
  1570. }
  1571. }
  1572. //---------------------------------------------------------------------------
  1573. int __fastcall TVmsCommMain::SendVmsThreadMessage(BYTE *AVmsId, IPC_MSG_DATA *ARcvData, BYTE AOpCode, char *AData)
  1574. {
  1575. #if 0
  1576. AnsiString sVmsId;
  1577. IPCUDPPACKET *pPI = NULL;
  1578. sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
  1579. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(sVmsId);
  1580. if (!pObj)
  1581. {
  1582. return VERR_NOTFOUND_VMS;
  1583. }
  1584. if (pObj->Server.commState != comm_close)
  1585. {
  1586. return VERR_OFFLINE;
  1587. }
  1588. if (!pObj->pPackQueue)
  1589. {
  1590. return VERR_INTERNAL;
  1591. }
  1592. pPI = new IPCUDPPACKET;
  1593. if (pPI == NULL) return VERR_MEMORY_ALLOC;
  1594. pPI->Sender.IP = ARcvData->Sender.IP;
  1595. pPI->Sender.Port = ARcvData->Sender.Port;
  1596. pPI->RecvId = ARcvData->Pkt.head.SendId;
  1597. pPI->OPCode = AOpCode;
  1598. pPI->Size = (int)ARcvData->Pkt.head.Length;
  1599. if (pPI->Size > 0)
  1600. {
  1601. pPI->Data = new char[pPI->Size];
  1602. if (!pPI->Data)
  1603. {
  1604. delete pPI;
  1605. return VERR_INTERNAL;
  1606. }
  1607. CopyMemory(pPI->Data, AData, pPI->Size);
  1608. }
  1609. pObj->pPackQueue->Add((void*)pPI);
  1610. #endif
  1611. return VERR_NONE;
  1612. }
  1613. //---------------------------------------------------------------------------
  1614. void __fastcall TVmsCommMain::plTimeDblClick(TObject *Sender)
  1615. {
  1616. if (!FrmNetwork->Showing) {
  1617. FrmNetwork->Show();
  1618. }
  1619. }
  1620. //---------------------------------------------------------------------------
  1621. void __fastcall TVmsCommMain::SendVmsTrafficProvide(int AType)
  1622. {
  1623. /*
  1624. * 정주기, 교통정보메시지 수신, 긴급차량우선신호 알람, 최초 기동시에 호출되는 함수임.
  1625. */
  1626. String sType = "NONE";
  1627. switch(AType) {
  1628. case 0: sType = "TRAF"; break;
  1629. case 1: sType = "TIME"; break;
  1630. case 2: sType = "EVEH"; break; // Not Used
  1631. case 3: sType = "INIT"; break;
  1632. }
  1633. MINFO("MAIN=============> VMS Traffic Event Acitve, %s Event Running(dbm_check_evehicle_alarm).", AnsiString(sType).c_str());
  1634. if (AType == 0 || AType == 1) {
  1635. ResetProviderTimer();
  1636. }
  1637. if (AType == 0) {
  1638. // 통신으로 정보가공완료 메시지를 수신한 후 VMS 메시지를 생성하는 경우
  1639. m_dtTrafProvider = Now();
  1640. }
  1641. else if (AType == 1) {
  1642. // 타임아웃 이벤트를 수신하였으나 1분 이내 통신 메시지 가공을 처리하였을 경우 타임아웃 메시지는 처리하지 않는다.
  1643. if (COMM_TimeDiff(m_dtTrafProvider) <= 60) {
  1644. MINFO("MAIN=============> VMS Traffic Event Acitve, Time Out Running. Before TRAF Event Processing...");
  1645. return;
  1646. }
  1647. }
  1648. FFirstRunning = false;
  1649. APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
  1650. m_dtProvider = Now(); // 정보제공 타이머
  1651. pnlTraf->Caption = sType + ": " + m_dtProvider.FormatString("yyyy-mm-dd hh:nn:ss");
  1652. FrmVmsLog->LogTraffic(Now().FormatString("yyyyMMdd"), pnlTraf->Caption);
  1653. }
  1654. //---------------------------------------------------------------------------
  1655. void __fastcall TVmsCommMain::plRemainDblClick(TObject *Sender)
  1656. {
  1657. APP_ReLoadConfigInfo();
  1658. }
  1659. //---------------------------------------------------------------------------
  1660. void __fastcall TVmsCommMain::pnlTrafDblClick(TObject *Sender)
  1661. {
  1662. if (!FrmVmsLog->Showing) {
  1663. FrmVmsLog->Show();
  1664. }
  1665. }
  1666. //---------------------------------------------------------------------------
  1667. void __fastcall TVmsCommMain::tmrDbWriteTimer(TObject *Sender)
  1668. {
  1669. tmrDbWrite->Enabled = false;
  1670. AnsiString dbJobName = APP_GetDbJobName(tmrDbWrite->Tag);
  1671. FrmVmsLog->LogMsg("Dbms Write Hang: " + dbJobName);
  1672. MERROR("MAINxxxxxxxxxxxx=> DBMS Write Job Hang Error: %s", dbJobName.c_str());
  1673. RestartApplication("DbmReadThread");
  1674. }
  1675. //---------------------------------------------------------------------------
  1676. void __fastcall TVmsCommMain::tmrDbReadTimer(TObject *Sender)
  1677. {
  1678. tmrDbRead->Enabled = false;
  1679. AnsiString dbJobName = APP_GetDbJobName(tmrDbRead->Tag);
  1680. FrmVmsLog->LogMsg("Dbms Read Hang: " + dbJobName);
  1681. MERROR("MAINxxxxxxxxxxxx=> DBMS Job Read Hang Error: %s", dbJobName.c_str());
  1682. RestartApplication("DbmThread");
  1683. }
  1684. //---------------------------------------------------------------------------
  1685. void __fastcall TVmsCommMain::RestartApplication(String AHangJobName)
  1686. {
  1687. #if 0
  1688. bool bRestart = false;
  1689. String sRestart;
  1690. if (APP_ReadConfigInfo("APPLICATION", "RESTART", sRestart)) {
  1691. if (sRestart.UpperCase() == "TRUE")
  1692. {
  1693. bRestart = true;
  1694. }
  1695. }
  1696. if (bRestart) {
  1697. MERROR("Restart Application: Cause.... By %s", AnsiString(AHangJobName).c_str());
  1698. String sRestartApp = g_sAppDir + "RestarterApp.exe";
  1699. if (FileExists(sRestartApp))
  1700. {
  1701. try {
  1702. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it) {
  1703. TItsThread *pObj = (TItsThread*)it->second;
  1704. if (pObj->Name == AHangJobName)
  1705. {
  1706. TDbmThread *dbmThread = (TDbmThread*)pObj;
  1707. dbmThread->CloseDb();
  1708. }
  1709. }
  1710. TerminateApplication();
  1711. JobThreadStop();
  1712. } catch(Exception &e) {
  1713. }
  1714. ShellExecute(NULL, NULL, AnsiString(sRestartApp).c_str(), NULL, NULL, SW_SHOWNORMAL);
  1715. g_AppCfg.bAppClose = true;
  1716. Close();
  1717. }
  1718. else {
  1719. MERROR("Restart Application: Not Found RestarterApp.exe.");
  1720. }
  1721. }
  1722. #endif
  1723. }
  1724. //---------------------------------------------------------------------------
  1725. void __fastcall TVmsCommMain::tobMenuDblClick(TObject *Sender)
  1726. {
  1727. if (Splitter1->Visible) {
  1728. Splitter1->Visible = false;
  1729. pnlLog->Visible = false;
  1730. FrmSysLog->chkLogPause->Checked = true;
  1731. //pnlController->Align = alClient;
  1732. //pnlLog->Align = alClient;
  1733. }
  1734. else {
  1735. //pnlController->Align = alTop;
  1736. pnlLog->Visible = true;
  1737. Splitter1->Visible = true;
  1738. //pnlLog->Align = alClient;
  1739. }
  1740. }
  1741. //---------------------------------------------------------------------------