FrmMainF.cpp 65 KB

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