FrmMainF.cpp 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802
  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 Ifsc Information initialize...");
  299. if (CDSIfscManager->LoadVmsIfscInfo(FDb->GetConnection()) < 0)
  300. {
  301. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  302. sprintf(szLogMsg, "MAIN===================> VMS Ifsc Information initialize failed. Program abnormal terminate.");
  303. AbnormalTerminate(szLogMsg);
  304. return false;
  305. }
  306. MINFO("MAIN===================> VMS Ifsc Information initialize...END, %u ms.", GetTickCount()-dwTick);
  307. }
  308. if (CDSImageManager)
  309. {
  310. dwTick = GetTickCount();
  311. MINFO("MAIN===================> VMS Image Information initialize...");
  312. if (CDSImageManager->LoadVmsSymbolInfo(FDb->GetConnection()) < 0)
  313. {
  314. memset(szLogMsg, 0x00, sizeof(szLogMsg));
  315. sprintf(szLogMsg, "MAIN===================> VMS Image Information initialize failed. Program abnormal terminate.");
  316. AbnormalTerminate(szLogMsg);
  317. return false;
  318. }
  319. MINFO("MAIN===================> VMS Image 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. switch(Msg.WParam)
  752. {
  753. case 0: plStateLog->Color = color; plStateLog->Refresh(); break;
  754. case 1: plStateDbmRead->Color = color; plStateDbmRead->Refresh(); break;
  755. case 2: plStateDbm->Color = color; plStateDbm->Refresh(); break;
  756. case 3: plStateJob->Color = color; plStateJob->Refresh(); break;
  757. }
  758. }
  759. //---------------------------------------------------------------------------
  760. void __fastcall TVmsCommMain::tmrProvideTimer(TObject *Sender)
  761. {
  762. SendVmsTrafficProvide(1);
  763. }
  764. //---------------------------------------------------------------------------
  765. void __fastcall TVmsCommMain::ResetProviderTimer()
  766. {
  767. tmrProvide->Enabled = false;
  768. tmrProvide->Interval = g_AppCfg.nTrafficCycleTime * 1000;
  769. m_dtTimeOut = Now();
  770. tmrProvide->Enabled = true;
  771. }
  772. //---------------------------------------------------------------------------
  773. void __fastcall TVmsCommMain::OnUdpDataRecvMessage(TMessage &Msg)
  774. {
  775. int nResult;
  776. IPC_MSG_DATA *RcvData = (IPC_MSG_DATA*)Msg.LParam;
  777. INT_SENDER *Sender = &RcvData->Sender;
  778. INT_PACKET *Pkt = &RcvData->Pkt;
  779. INT_HEAD *head = &Pkt->head;
  780. INT_DATA *data = &Pkt->data;
  781. char *pData = &Pkt->data.Data[0];
  782. BYTE OpCode = head->OpCode;
  783. MINFO("MAIN===================> Center Msg: %s.%d, OpCode: %02X, From: %02X, To: %02X", CComm_ulong2ip(Sender->IP), Sender->Port, OpCode, head->SendId, head->RecvId);
  784. switch(OpCode)
  785. {
  786. case INT_OP_TRAFFIC_CHANGE:
  787. MINFO("MAIN===================> INT_OP_TRAFFIC_CHANGE");
  788. CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
  789. SendVmsTrafficProvide(0);
  790. break;
  791. case INT_OP_VMS_POWER_CTL: //전광판 On/Off
  792. {
  793. INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pData;
  794. 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);
  795. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  796. if (!pCDSCtlr) break;
  797. if (!pCDSCtlr->FSession) break;
  798. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  799. pMsg->Type = eVmsStatusControl;
  800. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  801. pMsg->Buff[0] = 0x01;
  802. pMsg->Buff[1] = (BYTE)pReq->Command;
  803. pMsg->Len = 2;
  804. g_jobQ.PushBlocking((DWORD)pMsg);
  805. }
  806. break;
  807. case INT_OP_VMS_RESET:
  808. {
  809. INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pData;
  810. MINFO("MAIN===================> INT_OP_VMS_RESET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
  811. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  812. if (!pCDSCtlr) break;
  813. if (!pCDSCtlr->FSession) break;
  814. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  815. pMsg->Type = eVmsStatusControl;
  816. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  817. pMsg->Buff[0] = 0x02;
  818. pMsg->Len = 1;
  819. g_jobQ.PushBlocking((DWORD)pMsg);
  820. }
  821. break;
  822. case INT_OP_VMS_LUMINANCE_CTL: //휘도설정
  823. {
  824. INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pData;
  825. 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);
  826. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  827. if (!pCDSCtlr) break;
  828. if (!pCDSCtlr->FSession) break;
  829. BYTE cmdVal = 0x00;
  830. switch(pReq->BrghMode)
  831. {
  832. case 0x00: //주간
  833. cmdVal = pReq->BrghWeekStep;
  834. break;
  835. case 0x01: //야간
  836. cmdVal = pReq->BrghNghtStep;
  837. break;
  838. case 0x02: //자동
  839. cmdVal = 0x00;
  840. break;
  841. default: return;
  842. }
  843. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  844. pMsg->Type = eVmsStatusControl;
  845. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  846. pMsg->Buff[0] = 0x06;
  847. pMsg->Buff[1] = (BYTE)pReq->BrghMode;
  848. pMsg->Buff[2] = cmdVal;
  849. pMsg->Len = 3;
  850. g_jobQ.PushBlocking((DWORD)pMsg);
  851. }
  852. break;
  853. case INT_OP_VMS_PARA_SET: //환경설정 정보 설정
  854. {
  855. INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
  856. MINFO("MAIN===================> INT_OP_VMS_PARA_SET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
  857. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
  858. if (!pCDSCtlr) break;
  859. if (!pCDSCtlr->FSession) break;
  860. //도형식에는 설정정보가 없고 문자식에만 설정하는 프로토콜이 있음
  861. //현재 적용하지 않았음.........
  862. //적용할 경우 VMS유형(AObj->PROTOCOL_VER == 1) 확인해서 처리해야함
  863. //함체 PAN/HEATER 온도 설정
  864. //Download Parameter
  865. #if 0
  866. SIGNT_CONFIG_SET set;
  867. set.VMS_CTLR_NMBR = pCDSCtlr->CTLR_NMBR.ToIntDef(0);
  868. set.FanRunTmpr = pReq->FanRunTmpr;
  869. set.HetrRunTmpr = pReq->HetrRunTmpr;
  870. memcpy(set.PanlOnTime, pReq->DispStrTm, 4);
  871. memcpy(set.PanlOffTime, pReq->DispEndTm, 4);
  872. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  873. pMsg->Type = eVmsConfigSet;
  874. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  875. memcpy(pMsg->Buff, (char*)&set, sizeof(SIGNT_CONFIG_SET));
  876. g_jobQ.PushBlocking((DWORD)pMsg);
  877. #endif
  878. }
  879. break;
  880. case INT_OP_VMS_PARAM_REQ:
  881. {
  882. INT_VMS_PARAM_REQ *pReq = (INT_VMS_PARAM_REQ*)pData;
  883. MINFO("MAIN===================> INT_OP_VMS_PARAM_REQ: %d", pReq->Count);
  884. for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
  885. {
  886. TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
  887. if (!pCDSCtlr) continue;
  888. if (!pCDSCtlr->FSession) continue;
  889. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  890. pMsg->Type = eVmsParamReq;
  891. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  892. g_jobQ.PushBlocking((DWORD)pMsg);
  893. }
  894. }
  895. break;
  896. case INT_OP_VMS_IMMEDIATE_SCN_DNLD:
  897. {
  898. INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ *pReq = (INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ*)pData;
  899. MINFO("MAIN===================> INT_OP_VMS_IMMEDIATE_SCN_DNLD: %.*s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId);
  900. for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
  901. {
  902. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
  903. if (!pObj) continue;
  904. if (!pObj->FSession) continue;
  905. CDSCtlrManager->InitProvide(pObj);
  906. #if 0
  907. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  908. pMsg->Type = eVmsScenarioDownload;
  909. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  910. g_jobQ.PushBlocking((DWORD)pMsg);
  911. #endif
  912. }
  913. APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
  914. //APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
  915. }
  916. break;
  917. case INT_OP_VMS_MODE:
  918. {
  919. INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pData;
  920. MINFO("MAIN===================> INT_OP_VMS_MODE: %.*s %s, %s, %d EA.", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId, pReq->Count);
  921. //수신한 VMS에 대하여 다운로드 플래그 활성화 시킴
  922. for(int ii = 0; ii < pReq->Count && ii < INT_VMS_MAX_MODE; ii++)
  923. {
  924. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->Unit[ii].VMS_CTLR_NMBR));
  925. if (!pObj) continue;
  926. if (pObj->Server.useFlag != use_enable) continue;
  927. if (pObj->CTRLMODE->Control == pReq->Unit[ii].Mode)
  928. pObj->FModeChange = false;
  929. else
  930. pObj->FModeChange = true;
  931. pObj->CTRLMODE->Control = pReq->Unit[ii].Mode;
  932. pObj->DSTATE.OprMode = pObj->CTRLMODE->Control;
  933. pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
  934. if (pObj->CTRLMODE->Control == 'A') pObj->OPER_MODE = "A";
  935. else if (pObj->CTRLMODE->Control == 'B') pObj->OPER_MODE = "B";
  936. else pObj->OPER_MODE = "F";
  937. //pObj->FProvide = true;
  938. CDSCtlrManager->InitProvide(pObj);
  939. }
  940. FrmControllerInfo->UpdateCtlrList();
  941. APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
  942. }
  943. break;
  944. case INT_OP_VMS_STATE_REQ:
  945. MINFO("MAIN===================> INT_OP_VMS_STATE_REQ");
  946. CDSCtlrManager->SendCtlrSttsAll();
  947. break;
  948. case INT_OP_VMS_IMAGE_SYMBOL:
  949. MINFO("MAIN===================> INT_OP_VMS_IMAGE_SYMBOL");
  950. APP_PostDbThreadReadMessage(dbm_master_symbol_image);
  951. break;
  952. case INT_OP_VMS_IMAGE_TRAFFIC:
  953. MINFO("MAIN===================> INT_OP_VMS_IMAGE_TRAFFIC");
  954. APP_PostDbThreadReadMessage(dbm_master_symbol_traffic);
  955. break;
  956. case INT_OP_VMS_FORM_UPDATE:
  957. MINFO("MAIN===================> INT_OP_VMS_FORM_UPDATE");
  958. APP_PostDbThreadReadMessage(dbm_master_form);
  959. break;
  960. case INT_OP_VMS_IFSC_UPDATE:
  961. MINFO("MAIN===================> INT_OP_VMS_IFSC_UPDATE");
  962. APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
  963. break;
  964. default:
  965. MINFO("MAIN===================> INT_UNKNOWN: %02X", OpCode);
  966. break;
  967. }
  968. }
  969. //---------------------------------------------------------------------------
  970. #if 0
  971. void __fastcall TVmsCommMain::ClientResponse(int Flag, REQ_INFO_STRUCT *pReq, int error, void *pData)
  972. {
  973. #ifdef CENTERCOMM
  974. BYTE ErrCode;
  975. int sResult;
  976. switch(error)
  977. {
  978. case SYS_ERR_NONE: break;
  979. case SYS_ERR_OTHER: ErrCode = INT_ERROR_OTHER; break;
  980. case SYS_ERR_INTERNAL: ErrCode = INT_ERROR_SYSTEM; break;
  981. case SYS_ERR_MEMORY: ErrCode = INT_ERROR_SYSTEM; break;
  982. case SYS_ERR_DATABASE: ErrCode = INT_ERROR_SYSTEM; break;
  983. case SYS_ERR_RESET: ErrCode = INT_ERROR_SYSTEM; break;
  984. case SYS_ERR_START: ErrCode = INT_ERROR_SYSTEM; break;
  985. case SYS_ERR_OFFLINE: ErrCode = INT_ERROR_OFFLINE; break;
  986. case SYS_ERR_NO_RES: ErrCode = INT_ERROR_NO_RESPONSE; break;
  987. case SYS_ERR_ACCESS: ErrCode = INT_ERROR_PROCESS; break;
  988. case SYS_ERR_INVALID: ErrCode = INT_ERROR_OTHER; break;
  989. case SYS_ERR_UNKNOWN: ErrCode = INT_ERROR_UNKNOWN_CODE; break;
  990. case SYS_ERR_WRITE_LENGTH: ErrCode = INT_ERROR_OTHER; break;
  991. case SYS_ERR_PACKET_SIZE_LARGE: ErrCode = INT_ERROR_OTHER; break;
  992. case SYS_ERR_INVALID_TAG: ErrCode = INT_ERROR_OTHER; break;
  993. case SYS_ERR_CRC: ErrCode = INT_ERROR_OTHER; break;
  994. case SYS_ERR_LENGTH: ErrCode = INT_ERROR_LENGTH; break;
  995. case SYS_ERR_ADDRESS: ErrCode = INT_ERROR_ADDRESS; break;
  996. case SYS_ERR_HEADER_OPTIONS: ErrCode = INT_ERROR_HEADER; break;
  997. case SYS_ERR_UNKNOWN_COMMAND: ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
  998. case SYS_ERR_RECEIVE_TIMEOUT: ErrCode = INT_ERROR_OTHER; break;
  999. case SYS_ERR_DATA_SIZE: ErrCode = INT_ERROR_DISCORD; break;
  1000. case SYS_ERR_MISMATCH: ErrCode = INT_ERROR_OTHER; break;
  1001. case SYS_ERR_INVALID_PARA: ErrCode = INT_ERROR_INVALID_DATA; break;
  1002. case SYS_ERR_MOVEMENT: ErrCode = INT_ERROR_MOVEMENT; break;
  1003. case SYS_ERR_UNAUTHORIZED: ErrCode = INT_ERROR_UNAUTHORIZED; break;
  1004. default: ErrCode = INT_ERROR_OTHER; break;
  1005. }
  1006. if (Flag == SEND_ACK)
  1007. {
  1008. INT_ACK_RES Ack;
  1009. memset(&Ack, 0x00, sizeof(Ack));
  1010. Ack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1011. Ack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1012. Ack.MsgSeq = pReq->MsgSeq;
  1013. if ((sResult = AckRes(&Ack, pReq->ProcessID)) != UDP_ERR_NONE)
  1014. {
  1015. MERROR("MAIN===================> AckRes fail %d", sResult);
  1016. }
  1017. }
  1018. else
  1019. if (Flag == SEND_NACK)
  1020. {
  1021. INT_NACK_RES Nack;
  1022. memset(&Nack, 0x00, sizeof(Nack));
  1023. Nack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1024. Nack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1025. Nack.MsgSeq = pReq->MsgSeq;
  1026. Nack.ErrCode = ErrCode;
  1027. if ((sResult = NackRes(&Nack, pReq->ProcessID)) != UDP_ERR_NONE)
  1028. {
  1029. MERROR("MAIN===================> NackRes fail %d", sResult);
  1030. }
  1031. }
  1032. #endif
  1033. }
  1034. //---------------------------------------------------------------------------
  1035. #endif
  1036. bool __fastcall TVmsCommMain::CheckBasisTime(char *p, int Cycle, int Basis)
  1037. {
  1038. char cTime[15];
  1039. COMM_MakeBasisTime(cTime, Cycle, Basis);
  1040. if (memcmp(p, cTime, 14) != 0)
  1041. {
  1042. memcpy(p, cTime, 14);
  1043. return true;
  1044. }
  1045. return false;
  1046. }
  1047. //---------------------------------------------------------------------------
  1048. void __fastcall TVmsCommMain::CheckProvideTimeout()
  1049. {
  1050. VMS_PROVIDE_RESULE ProvideSave;
  1051. VMS_PROVIDE_RESULE DownLoadSave;
  1052. memset(&ProvideSave, 0x00, sizeof(ProvideSave));
  1053. memset(&DownLoadSave, 0x00, sizeof(DownLoadSave));
  1054. ProvideSave.Type = provide_form;
  1055. ProvideSave.Count = 0;
  1056. DownLoadSave.Type = provide_download;
  1057. DownLoadSave.Count = 0;
  1058. int nCheckVmsCount = 0;
  1059. CtlrItr it;
  1060. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1061. {
  1062. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1063. if (pObj->Server.useFlag != use_enable) continue;
  1064. bool isCtrlMode = COMM_TimeDiff(pObj->CTRLMODE->pTimer) > VMS_PROVIDE_TIMEOUT;
  1065. if ((pObj->DOWNLOAD->SaveFlag == false) &&
  1066. (COMM_TimeDiff(pObj->DOWNLOAD->dTimer) > VMS_DOWNLOAD_TIMEOUT))
  1067. {
  1068. DownLoadSave.pObj[DownLoadSave.Count++] = (void *)pObj;
  1069. pObj->DOWNLOAD->SaveFlag = true;
  1070. pObj->DOWNLOAD->dTimer = Now();
  1071. }
  1072. if ((pObj->CTRLMODE->SaveFlag == false) && isCtrlMode)
  1073. {
  1074. nCheckVmsCount++;
  1075. ProvideSave.pObj[ProvideSave.Count++] = (void *)pObj;
  1076. pObj->CTRLMODE->SaveFlag = true;
  1077. pObj->CTRLMODE->pTimer = Now();
  1078. MINFO("MAIN===================> VMS Download Timeout Form VMS NMBR: %s", pObj->CTLR_NMBR.c_str());
  1079. }
  1080. // 패킷크기가 채워졌으면 DB 작업스레드로 전송
  1081. if (ProvideSave.Count >= MAX_VMS_PROVIDE_RESULT)
  1082. {
  1083. MINFO("MAIN===================> VMS Download Timeout Form Save: %d EA.", ProvideSave.Count);
  1084. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
  1085. ProvideSave.Count = 0;
  1086. }
  1087. if (DownLoadSave.Count >= MAX_VMS_PROVIDE_RESULT)
  1088. {
  1089. MINFO("MAIN===================> VMS Download Timeout Form Data: %d EA.", DownLoadSave.Count);
  1090. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
  1091. DownLoadSave.Count = 0;
  1092. }
  1093. }
  1094. // 실패작업이 존재하면 DB 작업스레드로 전송
  1095. if (ProvideSave.Count > 0)
  1096. {
  1097. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
  1098. }
  1099. if (DownLoadSave.Count > 0)
  1100. {
  1101. MINFO("MAIN===================> VMS Download Timeout Data Save: %d EA.", DownLoadSave.Count);
  1102. APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
  1103. }
  1104. if (nCheckVmsCount > 0) {
  1105. MINFO("MAIN===================> VMS Download Timeout Form Save: VMS(%d), %d EA.", nCheckVmsCount, ProvideSave.Count);
  1106. }
  1107. }
  1108. //---------------------------------------------------------------------------
  1109. void __fastcall TVmsCommMain::SendTimeSync()
  1110. {
  1111. CtlrItr it;
  1112. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1113. {
  1114. TCDSCtlr *pCDSCtlr = (TCDSCtlr*)it->second;
  1115. if (pCDSCtlr->Server.useFlag != use_enable) continue;
  1116. if (pCDSCtlr->FSession)
  1117. {
  1118. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1119. pMsg->Type = eVmsStatusControl;
  1120. pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
  1121. pMsg->Buff[0] = 0x04;
  1122. memcpy(&pMsg->Buff[1], AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), 14);
  1123. pMsg->Len = 1+14;
  1124. g_jobQ.PushBlocking((DWORD)pMsg);
  1125. // 제어기가 연결되어 있으면 전송
  1126. MINFO("MAIN===================> SendTimeSync command send: %s", pCDSCtlr->CTLR_NMBR.c_str());
  1127. }
  1128. }
  1129. }
  1130. //---------------------------------------------------------------------------
  1131. bool __fastcall TVmsCommMain::CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi)
  1132. {
  1133. bool result;
  1134. HANDLE hProcess;
  1135. PROCESS_MEMORY_COUNTERS pmc;
  1136. size_t uSize;
  1137. DWORD HandleCount, ThreadCount, GdiCount;
  1138. HANDLE hProcessSnap;
  1139. PROCESSENTRY32 pe32;
  1140. DWORD ProcessId;
  1141. result = false;
  1142. uSize = 0;
  1143. HandleCount = 0;
  1144. ThreadCount = 0;
  1145. GdiCount = 0;
  1146. hProcess = GetCurrentProcess();
  1147. if (hProcess != NULL)
  1148. {
  1149. if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
  1150. {
  1151. uSize = pmc.WorkingSetSize/1024;
  1152. if ((MaxMemory != 0) && (uSize > MaxMemory))
  1153. {
  1154. MERROR("MAIN===================> Memory usage exceeds standards!!!...[%d][%d]", MaxMemory, uSize);
  1155. result = true;
  1156. }
  1157. }
  1158. if ( GetProcessHandleCount( hProcess, &HandleCount) )
  1159. {
  1160. if ((MaxHandle != 0) && (HandleCount > MaxHandle))
  1161. {
  1162. MERROR("MAIN===================> Window handle exceed standards!!!...[%d][%d]", MaxHandle, HandleCount);
  1163. result = true;
  1164. }
  1165. }
  1166. ProcessId = GetCurrentProcessId();
  1167. if ((hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )) != INVALID_HANDLE_VALUE)
  1168. {
  1169. pe32.dwSize = sizeof( PROCESSENTRY32 );
  1170. if ( Process32First( hProcessSnap, &pe32 ) )
  1171. {
  1172. do
  1173. {
  1174. if (pe32.th32ProcessID == ProcessId)
  1175. {
  1176. ThreadCount = pe32.cntThreads;
  1177. if ((MaxThread != 0) && (ThreadCount > MaxThread))
  1178. {
  1179. MERROR("MAIN===================> Criteria exceeded thread!!!...[%d][%d]", MaxThread, ThreadCount);
  1180. result = true;
  1181. }
  1182. break;
  1183. }
  1184. } while( Process32Next( hProcessSnap, &pe32 ) );
  1185. }
  1186. CloseHandle( hProcessSnap );
  1187. }
  1188. GdiCount = GetGuiResources( hProcess, GR_GDIOBJECTS);
  1189. if ((MaxGdi != 0) && (GdiCount > MaxGdi))
  1190. {
  1191. MERROR("MAIN===================> GDI Objects exceeding standards!!!...[%d][%d]", MaxGdi, GdiCount);
  1192. result = true;
  1193. }
  1194. CloseHandle( hProcess );
  1195. }
  1196. try
  1197. {
  1198. FMemSize = uSize;
  1199. plMemory->Caption = FormatFloat("##,##0", uSize) ;// + " KB";
  1200. plHandle->Caption = FormatFloat("##,##0", HandleCount);// + " EA";
  1201. plThread->Caption = FormatFloat("##,##0", ThreadCount);// + " EA";
  1202. plGdi->Caption = FormatFloat("##,##0", GdiCount) ;// + " EA";
  1203. #if 0
  1204. MINFO("MAIN===================> Memory: %s, Haldle: %s, Thread: %s, GDI: %s",
  1205. AnsiString(plMemory->Caption).c_str(),
  1206. AnsiString(plHandle->Caption).c_str(),
  1207. AnsiString(plThread->Caption).c_str(),
  1208. AnsiString(plGdi->Caption).c_str()
  1209. );
  1210. #endif
  1211. } catch (Exception &e) {}
  1212. return result;
  1213. }
  1214. //---------------------------------------------------------------------------
  1215. void __fastcall TVmsCommMain::Panel16DblClick(TObject *Sender)
  1216. {
  1217. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  1218. }
  1219. //---------------------------------------------------------------------------
  1220. void __fastcall TVmsCommMain::plStateDbDblClick(TObject *Sender)
  1221. {
  1222. APP_PostDbThreadReadMessage(dbm_master_symbol_image);
  1223. APP_PostDbThreadReadMessage(dbm_master_form);
  1224. APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
  1225. }
  1226. //---------------------------------------------------------------------------
  1227. void __fastcall TVmsCommMain::plStateCommDblClick(TObject *Sender)
  1228. {
  1229. AnsiString VMS_IFSC_ID;
  1230. int SECT_LNGT;
  1231. TItsMap<int, TObjectId*> FLists;
  1232. TItsMap<AnsiString, TVmsIfscGrad*> FGrads;
  1233. VMS_TRAF traf;
  1234. int SPED; // N NUMBER(3) Y 0 속도
  1235. int TRVL_HH; // N NUMBER(6) Y 0 통행 시간
  1236. AnsiString CMTR_GRAD_CD; // N VARCHAR2(7) Y 소통 등급 코드
  1237. if (!CDSVmsIfscTrafManager) return;
  1238. FOR_STL(TCDSVmsIfscTraf*, pObj, CDSVmsIfscTrafManager->FVmsIfscLists)
  1239. {
  1240. int objValid = pObj->IsValid == false ? 0 : 1;
  1241. MINFO("VMS_IFSC_ID: %s, SECT_LNGT: %5d, VALID: %d, Objects: %d, SPED: %3d, TRVL_HH: %4d, GRAD_CD: %s",
  1242. pObj->VMS_IFSC_ID, pObj->SECT_LNGT, objValid, pObj->FLists.Size(), pObj->traf.SPED, pObj->traf.TRVL_HH, pObj->traf.CMTR_GRAD_CD);
  1243. FOR_STL(TVmsIfscGrad*, pGrad, pObj->FGrads)
  1244. {
  1245. int gradValid = pGrad->IsValid == false ? 0 : 1;
  1246. MINFO(" GRAD_CD: %s, VALID: %d, LWSTSPED: %3d, HGHSSPED: %3d", pGrad->CMTR_GRAD_CD, gradValid, pGrad->LWSTSPED, pGrad->HGHSSPED);
  1247. }
  1248. int ii = 1;
  1249. FOR_STL(TObjectId*, pID, pObj->FLists)
  1250. {
  1251. int idValid = pID->IsValid == false ? 0 : 1;
  1252. TCDSIfscTraf* pIfsc = CDSVmsIfscTrafManager->FIfscTrafLists.Find(pID->ID);
  1253. if (pIfsc)
  1254. {
  1255. 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);
  1256. }
  1257. else
  1258. {
  1259. MINFO(" %2d: IFSC_ID: %s, Not Found", ii, pID->ID);
  1260. }
  1261. ii++;
  1262. }
  1263. MINFO("");
  1264. }
  1265. }
  1266. //---------------------------------------------------------------------------
  1267. void __fastcall TVmsCommMain::plStateActionDblClick(TObject *Sender)
  1268. {
  1269. plStateAction->Enabled = false;
  1270. tmrRunProvide->Enabled = false;
  1271. tmrRunProvide->Enabled = true;
  1272. CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
  1273. CtlrItr it;
  1274. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1275. {
  1276. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1277. if (!pObj->FSession) continue;
  1278. CDSCtlrManager->InitProvide(pObj);
  1279. }
  1280. APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
  1281. }
  1282. //---------------------------------------------------------------------------
  1283. void __fastcall TVmsCommMain::tmrRunProvideTimer(TObject *Sender)
  1284. {
  1285. tmrRunProvide->Enabled = false;
  1286. plStateAction->Enabled = true;
  1287. }
  1288. //---------------------------------------------------------------------------
  1289. bool __fastcall TVmsCommMain::JobThreadStart()
  1290. {
  1291. int nThreadCnt = 0;
  1292. if (true)
  1293. {
  1294. LogThread = new TLogThread();
  1295. if (!LogThread) return false;
  1296. LogThread->FPnlState = plStateLog;
  1297. LogThread->FTmrDb = tmrDbCheck;
  1298. LogThread->Name = "LogThread";
  1299. LogThread->Execute();
  1300. G_Threads.Push(nThreadCnt++, LogThread);
  1301. }
  1302. if (true)
  1303. {
  1304. DbmThread = new TDbmThread();
  1305. if (!DbmThread) return false;
  1306. DbmThread->FPnlState = plStateDbm;
  1307. DbmThread->FTmrDb = tmrDbCheck;
  1308. DbmThread->Name = "DbmThread";
  1309. DbmThread->Execute();
  1310. G_Threads.Push(nThreadCnt++, DbmThread);
  1311. }
  1312. if (true)
  1313. {
  1314. DbmReadThread = new TDbmReadThread();
  1315. if (!DbmReadThread) return false;
  1316. DbmReadThread->FPnlState = plStateDbmRead;
  1317. DbmReadThread->FTmrDb = tmrDbCheck;
  1318. DbmReadThread->Name = "DbmReadThread";
  1319. DbmReadThread->Execute();
  1320. G_Threads.Push(nThreadCnt++, DbmReadThread);
  1321. }
  1322. if (true)
  1323. {
  1324. JobThread = new TJobThread();
  1325. if (!JobThread) return false;
  1326. JobThread->FPnlState = plStateJob;
  1327. JobThread->FTmrDb = tmrDbCheck;
  1328. JobThread->Name = "JobThread";
  1329. JobThread->Execute();
  1330. G_Threads.Push(nThreadCnt++, JobThread);
  1331. }
  1332. return true;
  1333. }
  1334. //---------------------------------------------------------------------------
  1335. void __fastcall TVmsCommMain::JobThreadCheck()
  1336. {
  1337. int nTermCnt = 0;
  1338. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
  1339. {
  1340. TItsThread *pObj = (TItsThread*)it->second;
  1341. if (pObj->IsTerm())
  1342. {
  1343. pObj->Execute();
  1344. nTermCnt++;
  1345. }
  1346. }
  1347. }
  1348. //---------------------------------------------------------------------------
  1349. void __fastcall TVmsCommMain::JobThreadStop()
  1350. {
  1351. g_AppCfg.bThrExit = true;
  1352. g_jobQ.PushBlocking(Q_CLOSE);
  1353. g_dbmQ.PushBlocking(Q_CLOSE);
  1354. g_dbmReadQ.PushBlocking(Q_CLOSE);
  1355. g_logQ.PushBlocking(Q_CLOSE);
  1356. HANDLE handles[50];
  1357. int nWaits = 0;
  1358. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
  1359. {
  1360. TItsThread *pObj = (TItsThread*)it->second;
  1361. if (!pObj->IsTerm())
  1362. {
  1363. //pObj->Terminate(2000);
  1364. handles[nWaits++] = pObj->Handle;
  1365. }
  1366. }
  1367. WaitForMultipleObjects(nWaits, handles, true, 1000);
  1368. G_Threads.RemoveAll();
  1369. }
  1370. //---------------------------------------------------------------------------
  1371. void __fastcall TVmsCommMain::TerminateApplication()
  1372. {
  1373. MERROR("MAIN===================> Program terminated start");
  1374. SendTerminal();
  1375. CComm_Close();
  1376. MERROR("MAIN===================> Program terminated end");
  1377. g_logQ.PushBlocking(Q_CLOSE);
  1378. for (int ii = 0; ii < 50; ii++)
  1379. {
  1380. Sleep(30);
  1381. Application->ProcessMessages();
  1382. if (g_AppCfg.bThrJobExit) break;
  1383. }
  1384. }
  1385. //---------------------------------------------------------------------------
  1386. void __fastcall TVmsCommMain::SendTerminal()
  1387. {
  1388. int result;
  1389. MINFO("MAIN===================> SendTerminal");
  1390. // 동작, 통신, DB 모두 이상 처리
  1391. g_SysInfo->RunSts = state_error;
  1392. g_SysInfo->ComSts = state_error;
  1393. g_SysInfo->DbmSts = state_error;
  1394. // 모든 시설물 통신 오프라인 처리
  1395. CtlrItr it;
  1396. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1397. {
  1398. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1399. if (!pObj->Used) continue;
  1400. pObj->Server.thrState = thr_stop;
  1401. pObj->Client.thrState = thr_stop;
  1402. pObj->Server.commState = comm_close;
  1403. pObj->Client.commState = comm_close;
  1404. }
  1405. INT_PG_STATE_RES PgState;
  1406. memset(&PgState, 0x00, sizeof(PgState));
  1407. PgState.Count = 1;
  1408. PgState.Unit[0].Type = INT_ID_VMS_SERVER;
  1409. PgState.Unit[0].DB = g_SysInfo->DbmSts;
  1410. PgState.Unit[0].Comm = g_SysInfo->ComSts;
  1411. PgState.Unit[0].Action = g_SysInfo->RunSts;
  1412. result = CComm_CmmProcessStateNotify(&PgState);
  1413. TDMAdoDb *FDb = new TDMAdoDb(NULL);
  1414. try
  1415. {
  1416. if (FDb->Connect(g_AppCfg.db.sConnectStr))
  1417. {
  1418. CDSProcessManager->SaveUnitStts(FDb->GetConnection());
  1419. CDSCtlrManager->SaveCtlrSttsAll(FDb->GetConnection());
  1420. }
  1421. }
  1422. __finally
  1423. {
  1424. if (FDb)
  1425. {
  1426. FDb->Close();
  1427. }
  1428. SAFE_DELETE(FDb);
  1429. }
  1430. }
  1431. //---------------------------------------------------------------------------
  1432. int __fastcall TVmsCommMain::SendVmsThreadMessage(BYTE *AVmsId, IPC_MSG_DATA *ARcvData, BYTE AOpCode, char *AData)
  1433. {
  1434. #if 0
  1435. AnsiString sVmsId;
  1436. IPCUDPPACKET *pPI = NULL;
  1437. sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
  1438. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(sVmsId);
  1439. if (!pObj)
  1440. {
  1441. return VERR_NOTFOUND_VMS;
  1442. }
  1443. if (pObj->Server.commState != comm_close)
  1444. {
  1445. return VERR_OFFLINE;
  1446. }
  1447. if (!pObj->pPackQueue)
  1448. {
  1449. return VERR_INTERNAL;
  1450. }
  1451. pPI = new IPCUDPPACKET;
  1452. if (pPI == NULL) return VERR_MEMORY_ALLOC;
  1453. pPI->Sender.IP = ARcvData->Sender.IP;
  1454. pPI->Sender.Port = ARcvData->Sender.Port;
  1455. pPI->RecvId = ARcvData->Pkt.head.SendId;
  1456. pPI->OPCode = AOpCode;
  1457. pPI->Size = (int)ARcvData->Pkt.head.Length;
  1458. if (pPI->Size > 0)
  1459. {
  1460. pPI->Data = new char[pPI->Size];
  1461. if (!pPI->Data)
  1462. {
  1463. delete pPI;
  1464. return VERR_INTERNAL;
  1465. }
  1466. CopyMemory(pPI->Data, AData, pPI->Size);
  1467. }
  1468. pObj->pPackQueue->Add((void*)pPI);
  1469. #endif
  1470. return VERR_NONE;
  1471. }
  1472. //---------------------------------------------------------------------------
  1473. void __fastcall TVmsCommMain::plTimeDblClick(TObject *Sender)
  1474. {
  1475. if (!FrmNetwork->Showing)
  1476. {
  1477. FrmNetwork->Show();
  1478. }
  1479. }
  1480. //---------------------------------------------------------------------------
  1481. void __fastcall TVmsCommMain::SendVmsTrafficProvide(int AType)
  1482. {
  1483. /*
  1484. * 정주기, 교통정보메시지 수신, 긴급차량우선신호 알람, 최초 기동시에 호출되는 함수임.
  1485. */
  1486. String sType = "NONE";
  1487. switch(AType) {
  1488. case 0: sType = "TRAF"; break;
  1489. case 1: sType = "TIME"; break;
  1490. case 2: sType = "EVEH"; break;
  1491. case 3: sType = "INIT"; break;
  1492. }
  1493. MINFO("MAIN===================> VMS Traffic Event Acitve, %s Event Running(dbm_check_evehicle_alarm).", AnsiString(sType).c_str());
  1494. if (AType == 0 || AType == 1) {
  1495. ResetProviderTimer();
  1496. }
  1497. if (AType == 0) {
  1498. // 통신으로 정보가공완료 메시지를 수신한 후 VMS 메시지를 생성하는 경우
  1499. m_dtTrafProvider = Now();
  1500. }
  1501. else if (AType == 1) {
  1502. // 타임아웃 이벤트를 수신하였으나 1분 이내 통신 메시지 가공을 처리하였을 경우 타임아웃 메시지는 처리하지 않는다.
  1503. if (COMM_TimeDiff(m_dtTrafProvider) <= 60) {
  1504. MINFO("MAIN===================> VMS Traffic Event Acitve, Time Out Running. Before TRAF Event Processing...");
  1505. return;
  1506. }
  1507. }
  1508. FFirstRunning = false;
  1509. m_dtChkEveh = Now(); // 긴급차량우선신호 알람 체크 타이머 초기화
  1510. APP_PostDbThreadWriteMessage((AType == 2) ? dbm_dnld_form_eveh : dbm_dnld_form_cycle);
  1511. m_dtProvider = Now(); // 정보제공 타이머
  1512. pnlTraf->Caption = sType + ": " + m_dtProvider.FormatString("yyyy-mm-dd hh:nn:ss");
  1513. }
  1514. //---------------------------------------------------------------------------
  1515. void __fastcall TVmsCommMain::plRemainDblClick(TObject *Sender)
  1516. {
  1517. APP_ReLoadConfigInfo();
  1518. //tmrDbCheckTimer(NULL);
  1519. }
  1520. //---------------------------------------------------------------------------
  1521. void __fastcall TVmsCommMain::tmrDbCheckTimer(TObject *Sender)
  1522. {
  1523. tmrDbCheck->Enabled = false;
  1524. AnsiString dbJobName = APP_GetDbJobName(tmrDbCheck->Tag);
  1525. MERROR("MAIN=xxxxxxxxxxxxxxxxx=> DBMS Job Hang Error: %s", dbJobName.c_str());
  1526. #if 0
  1527. bool bRestart = false;
  1528. String sRestart;
  1529. if (APP_ReadConfigInfo("APPLICATION", "RESTART", sRestart))
  1530. {
  1531. if (sRestart.UpperCase() == "TRUE")
  1532. {
  1533. bRestart = true;
  1534. }
  1535. }
  1536. if (bRestart)
  1537. {
  1538. MERROR("DBMS Job Hang Error: Server Self Die....");
  1539. String sRestartApp = g_sAppDir + "RestarterApp.exe";
  1540. if (FileExists(sRestartApp))
  1541. {
  1542. try {
  1543. for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
  1544. {
  1545. TItsThread *pObj = (TItsThread*)it->second;
  1546. if (pObj->Name == "DbmThread")
  1547. {
  1548. TDbmThread *dbmThread = (TDbmThread*)pObj;
  1549. dbmThread->CloseDb();
  1550. }
  1551. }
  1552. TerminateApplication();
  1553. JobThreadStop();
  1554. } catch(Exception &e) {
  1555. }
  1556. ShellExecute(NULL, NULL, AnsiString(sRestartApp).c_str(), NULL, NULL, SW_SHOWNORMAL);
  1557. g_AppCfg.bAppClose = true;
  1558. Close();
  1559. }
  1560. }
  1561. #endif
  1562. }
  1563. //---------------------------------------------------------------------------