FrmMainF.cpp 61 KB

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