FrmMainF.cpp 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <psapi.h>
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <time.h>
  8. //---------------------------------------------------------------------------
  9. #include "AppGlobalF.h"
  10. #include "VmsDataTypeF.h"
  11. #include "FrmMainF.h"
  12. #include "DMCOMMF.h"
  13. #include "CommThread.h"
  14. #include "FrmOptionF.h"
  15. #include "FrmSysLogF.h"
  16. #include "FrmVmsInfoF.h"
  17. //---------------------------------------------------------------------------
  18. #pragma package(smart_init)
  19. #pragma link "IdAntiFreeze"
  20. #pragma link "IdAntiFreezeBase"
  21. #pragma link "IdBaseComponent"
  22. #pragma link "IdComponent"
  23. #pragma link "IdUDPBase"
  24. #pragma link "IdUDPServer"
  25. #pragma resource "*.dfm"
  26. TFrmMain *FrmMain;
  27. //---------------------------------------------------------------------------
  28. __fastcall TFrmMain::TFrmMain(TComponent* Owner)
  29. : TForm(Owner)
  30. {
  31. ::CoInitialize(NULL);
  32. FServerRun = false;
  33. FTickState = 0;
  34. g_AppCfg.bAppLoad = false;
  35. g_AppCfg.bAppClose = false;
  36. Caption = " " + g_AppCfg.sTitle + " ";
  37. VmsManager = new TVmsCtlrManager();
  38. ImageManager = new TCDSImageManager();
  39. FormManager = new TCDSFormManager();
  40. IfscManager = new TCDSIfscManager();
  41. //int size1 = sizeof(INT_VMS_FORM_DOWNLOAD);
  42. //int size2 = sizeof(INT_VMS_FORM_DOWNLOAD_REQ);
  43. //ShowMessage(String(size1));
  44. //ShowMessage(String(size2));
  45. }
  46. //---------------------------------------------------------------------------
  47. void __fastcall TFrmMain::FormCreate(TObject *Sender)
  48. {
  49. Application->ShowMainForm = false;
  50. try {
  51. Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
  52. } catch(...) { ShowMessage("LoadFromResourceName failed"); }
  53. SYS_WritePidFile((long)Handle);
  54. g_AppCfg.lMainWinHandle = (long)Handle;
  55. FrmSysLog = new TFrmSysLog(pnlLog);
  56. FrmSysLog->Parent = pnlLog;
  57. FrmSysLog->Show();
  58. FrmVmsInfo = new TFrmVmsInfo(pnlVms);
  59. FrmVmsInfo->Parent = pnlVms;
  60. FrmVmsInfo->Show();
  61. Application->ShowMainForm = true;
  62. }
  63. //---------------------------------------------------------------------------
  64. bool __fastcall TFrmMain::StartJobThread()
  65. {
  66. TCommThread *pCommThread = new TCommThread();
  67. m_CommThreadID = pCommThread->ThreadID;
  68. m_CommHandle = pCommThread->Handle;
  69. if (m_CommThreadID == NULL)
  70. {
  71. LERROR("CommThread initialization fail");
  72. return false;
  73. }
  74. LINFO("Job thread started.");
  75. return true;
  76. }
  77. //---------------------------------------------------------------------------
  78. void __fastcall TFrmMain::FormShow(TObject *Sender)
  79. {
  80. StartJobThread();
  81. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  82. //CheckManagerApp();
  83. tmrAppState->Enabled = true;
  84. }
  85. //---------------------------------------------------------------------------
  86. void __fastcall TFrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
  87. {
  88. if (!g_AppCfg.bAppClose)
  89. {
  90. String strMsg;
  91. 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!!!";
  92. //if (Application->MessageBox(strMsg.c_str(), L"Confirm program exit", MB_YESNO|MB_ICONQUESTION) == IDYES)
  93. {
  94. FServerRun = false;
  95. g_AppCfg.bThrExit = true;
  96. g_AppCfg.bAppClose = true;
  97. }
  98. CanClose = false;
  99. APP_EXIT = true;
  100. }
  101. }
  102. //---------------------------------------------------------------------------
  103. void __fastcall TFrmMain::FormClose(TObject *Sender, TCloseAction &Action)
  104. {
  105. CommClose();
  106. ::CoUninitialize();
  107. Action = caFree;
  108. FrmMain = NULL;
  109. }
  110. //---------------------------------------------------------------------------
  111. void __fastcall TFrmMain::CommClose()
  112. {
  113. try
  114. {
  115. SYS_WriteConfigInfo("LOG", "LOGDAY", Now().FormatString("dd"), g_AppCfg.sConfigFile);
  116. if (IdUDPCenterServer->Active == true)
  117. {
  118. IdUDPCenterServer->Active = false;
  119. for (int ii = 0; ii < IdUDPCenterServer->Bindings->Count; ii++)
  120. {
  121. IdUDPCenterServer->Bindings->Items[ii]->Free();
  122. }
  123. }
  124. if (VmsManager)
  125. {
  126. VmsManager->FLists.Lock();
  127. FOR_STL(TVmsCtlr*, pObj, VmsManager->FLists)
  128. {
  129. //SAFE_DELETE(pObj->FLogFile);
  130. }
  131. VmsManager->FLists.UnLock();
  132. }
  133. //SAFE_DELETE(VmsManager);
  134. if (ImageManager)
  135. {
  136. }
  137. //SAFE_DELETE(ImageManager);
  138. }
  139. catch(Exception &e)
  140. {
  141. }
  142. }
  143. //---------------------------------------------------------------------------
  144. bool __fastcall TFrmMain::InitApplication(void)
  145. {
  146. String sTitle, sMsg;
  147. int nResult;
  148. LINFO("Program initialize start...");
  149. m_bAction = state_normal;
  150. m_bComm = state_error;
  151. m_bDB = state_normal;
  152. FTickState = 0;
  153. FServerRun = true;
  154. FCheckSafeAlarm = 0;
  155. CommUtil_MakeBasisTime(m_szOnOffTimer, VMS_CHECK_TIME, 0);
  156. CommUtil_MakeBasisTime(m_szTraffTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime);
  157. m_trfSendTimer = Now()-1;
  158. LINFO("VMS Information initialize...: %s", m_szTraffTimer);
  159. g_SysInfo->State.CommThreadID = m_CommThreadID;
  160. LINFO("Center communication initialize...");
  161. //통신초기화를 최초 수행한 후 디비읽어서 처리
  162. nResult = VComm_Initialize((long)Handle, g_AppCfg.sSystemId, "VMS", g_AppCfg.comm.nCenterPort, g_AppCfg.sLogDay);
  163. if (VERR_NONE != nResult)
  164. {
  165. sMsg.printf(L"Center communication initialize failed: error %d", nResult);
  166. LERROR(AnsiString(sMsg).c_str());
  167. return false;
  168. }
  169. if (!DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
  170. {
  171. sTitle = "Process initialize failed...";
  172. sMsg = "Database connect failed.\r\nProgram exit.\r\n";
  173. //sMsg += DMComm->ErrorString;
  174. LERROR(AnsiString(sMsg).c_str());
  175. return false;
  176. }
  177. //센터내부UDP통신포트정보 읽어오기(시설물관리서버 통신)
  178. //INI에도 적어놨으니까... 실패해도 넘어가자
  179. DMCOMM->GetOldProcessInfo();
  180. if (DMCOMM->GetVmsInfo() != VERR_NONE)
  181. {
  182. DMCOMM->DbClose();
  183. sTitle = "Process initialize failed...";
  184. sMsg = "VMS information initialize failed.\r\nProgram exit.\r\n";
  185. //sMsg += DMComm->ErrorString;
  186. LERROR(AnsiString(sMsg).c_str());
  187. return false;
  188. }
  189. if (DMCOMM->GetVmsIfscInfo() != VERR_NONE)
  190. {
  191. DMCOMM->DbClose();
  192. sTitle = "Process initialize failed...";
  193. sMsg = "VMS IFSC information initialize failed.\r\nProgram exit.\r\n";
  194. //sMsg += DMComm->ErrorString;
  195. LERROR(AnsiString(sMsg).c_str());
  196. return false;
  197. }
  198. if (DMCOMM->GetProcessInfo() != SYS_ERR_NONE)
  199. {
  200. DMCOMM->DbClose();
  201. sTitle = "Process initialize failed...";
  202. sMsg = "Center communication process load failed.\r\nProgram exit.\r\n";
  203. //sMsg += DMComm->ErrorString;
  204. LERROR(AnsiString(sMsg).c_str());
  205. return false;
  206. }
  207. if (DMCOMM->GetVmsImage() != VERR_NONE)
  208. {
  209. DMCOMM->DbClose();
  210. sTitle = "Process initialize failed...";
  211. sMsg = "VMS image information initialize failed.\r\nProgram exit.\r\n";
  212. //sMsg += DMComm->ErrorString;
  213. LERROR(AnsiString(sMsg).c_str());
  214. return false;
  215. }
  216. if (DMCOMM->LoadVmsForm() != VERR_NONE)
  217. {
  218. DMCOMM->DbClose();
  219. sTitle = "Process initialize failed...";
  220. sMsg = "VMS form information initialize failed.\r\nProgram exit.\r\n";
  221. //sMsg += DMComm->ErrorString;
  222. LERROR(AnsiString(sMsg).c_str());
  223. return false;
  224. }
  225. DMCOMM->DbClose();
  226. if (!OpenCenterComm())
  227. {
  228. LERROR("내부통신프로세스 초기화 실패. 프로그램을 종료합니다.");
  229. return false;
  230. }
  231. LoadOldVmsInfo();
  232. LoadFtpVmsInfo();
  233. LoadFontVmsInfo();
  234. LoadStatusAutoVmsInfo();
  235. LoadBitmapVmsInfo();
  236. //이미지로 저장하는 경우에 대한 Ftp다운로드 처리여부 확인
  237. VmsIterator it;
  238. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  239. {
  240. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  241. if (pObj->FBmpDownload)
  242. {
  243. if (pObj->FIsOldProtocol)
  244. {
  245. //이전 버전중 레도것이 아닌경우는 모두 ftp를 사용함
  246. pObj->FIsFtpDownload = true;
  247. }
  248. }
  249. else
  250. {
  251. //FtpVMS.inf에 등록된 VMS만 FTP로 다운로드하면 된다
  252. }
  253. }
  254. FrmVmsInfo->UpdateVmsList();
  255. #if 0
  256. if (VERR_NONE != VComm_Open(g_AppCfg.comm.nCenterPort))
  257. #else
  258. /* 20180927*/
  259. if (VERR_NONE != VComm_Open())
  260. #endif
  261. {
  262. sMsg.printf(L"Center communication open failed: error %d", nResult);
  263. LERROR(AnsiString(sMsg).c_str());
  264. return false;
  265. }
  266. SendInitial();
  267. ProvideEvent(provide_event, NULL, NULL);
  268. //통신서버 시작
  269. tbConnectClick(this);
  270. LINFO("Program initialize success...[Completed]");
  271. return true;
  272. }
  273. //---------------------------------------------------------------------------
  274. void __fastcall TFrmMain::tmrAppStateTimer(TObject *Sender)
  275. {
  276. tmrAppState->Enabled = false;
  277. plTime->Caption = Now().DateTimeString();
  278. if (!g_AppCfg.bAppLoad)
  279. {
  280. if (!InitApplication())
  281. {
  282. g_AppCfg.bAppClose = true;
  283. TerminateApplication();
  284. Sleep(500);
  285. Close();
  286. return;
  287. }
  288. // 초기화작업완료
  289. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  290. g_AppCfg.bAppLoad = true; // 프로그램이 로딩되었음을 확인
  291. tmrAppState->Interval = 1000; // 프로그램 상태점검주기=1초
  292. tmrAppState->Enabled = true;
  293. return;
  294. }
  295. if (g_AppCfg.bAppClose)
  296. {
  297. // 응용프로그램 종료
  298. g_AppCfg.bThrExit = true;
  299. Sleep(500);
  300. TerminateApplication();
  301. Close();
  302. return;
  303. }
  304. g_AppCfg.lMainWinHandle = (long)Handle;
  305. UpdateProcessStatePanel();
  306. if (!(++FTickState % 5))
  307. {
  308. DMCOMM->MonitoringVms(FServerRun);
  309. DMCOMM->MonitoringVmsClient(FServerRun);
  310. CheckCommState(); //통신상태정보 체크
  311. }
  312. if (!(FTickState % 60))
  313. {
  314. //1분주기 상태정보를 업데이트 한다.
  315. if (!(FSendMsg & SEND_MSG_PROCESS))
  316. {
  317. SendProcessState();
  318. }
  319. if (!(FSendMsg & SEND_MSG_EQUIP))
  320. {
  321. SendDbThreadMessage(WM_EQUIP_STATE_ALL, NULL, NULL);
  322. }
  323. if (m_bDB != state_normal)
  324. {
  325. SendDbThreadMessage(WM_DATABASE_REFLASH, NULL, NULL);
  326. }
  327. if (CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi))
  328. {
  329. LERROR("Resource error");
  330. AutoClose();
  331. }
  332. }
  333. if (CheckBasisTime(m_szOnOffTimer, VMS_CHECK_TIME, 0))
  334. {
  335. SendDbThreadMessage(WM_GET_ONOFF, NULL, NULL);
  336. SendDbThreadMessage(WM_DOWNLOAD_PROC, NULL, NULL);
  337. }
  338. if (CheckBasisTime(m_szTraffTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime))
  339. {
  340. if (CommUtil_TimeDiff(m_trfSendTimer) > 10)//g_AppCfg.nTrafficCycleTime)
  341. {
  342. /* 이전에 폼을 다운로드하고 10초 지나야 다음 폼을 다운로드 할수 있도록 함 */
  343. LINFO("*** VMS Traffic Timer Acitve: %s, %s", AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), m_szTraffTimer);
  344. ProvideEvent(provide_event, NULL, NULL);
  345. FCheckSafeAlarm = 0;
  346. }
  347. else
  348. {
  349. LINFO("*** VMS Traffic Timer Acitve Skip......: %s, %s", AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), m_szTraffTimer);
  350. }
  351. }
  352. CheckProvideSave();
  353. if (FCheckSafeAlarm++ >= 19)
  354. {
  355. //LINFO("*** FCheckSafeAlarm......: %s, %s", AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), m_szTraffTimer);
  356. SendDbThreadMessage(WM_CHECK_SAFE_ALARM, NULL, NULL);
  357. FCheckSafeAlarm = 0;
  358. }
  359. tmrAppState->Enabled = true;
  360. }
  361. //---------------------------------------------------------------------------
  362. void __fastcall TFrmMain::AutoClose()
  363. {
  364. g_AppCfg.bAppClose = true;
  365. //Close();
  366. }
  367. //---------------------------------------------------------------------------
  368. void __fastcall TFrmMain::tbConnectClick(TObject *Sender)
  369. {
  370. FServerRun = true;
  371. g_AppCfg.bThrExit = false;
  372. tbConnect->Enabled = false;
  373. tbDisconnect->Enabled = true;
  374. }
  375. //---------------------------------------------------------------------------
  376. void __fastcall TFrmMain::tbDisconnectClick(TObject *Sender)
  377. {
  378. FServerRun = false;
  379. g_AppCfg.bThrExit = true;
  380. tbDisconnect->Enabled = false;
  381. DMCOMM->TerminateVms();
  382. Sleep(500);
  383. DMCOMM->TerminateVms();
  384. DMCOMM->TerminateVmsClient();
  385. tbConnect->Enabled = true;
  386. }
  387. //---------------------------------------------------------------------------
  388. void __fastcall TFrmMain::tbOptionsClick(TObject *Sender)
  389. {
  390. FrmOption = new TFrmOption(this);
  391. FrmOption->Left = FrmMain->Left + 80;
  392. FrmOption->Top = FrmMain->Top + 80;
  393. FrmOption->ShowModal();
  394. if (FrmOption->FUpdate)
  395. {
  396. try
  397. {
  398. ITSLog->FLogCfg = g_LogCfg;
  399. FDbLog->FLogCfg = g_LogCfg;
  400. VmsIterator it;
  401. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  402. {
  403. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  404. if (!pObj->FDispLog)
  405. {
  406. pObj->FCLog->FLogCfg = g_LogCfg;
  407. pObj->FSLog->FLogCfg = g_LogCfg;
  408. }
  409. }
  410. }
  411. catch(Exception &e)
  412. {
  413. }
  414. }
  415. delete FrmOption;
  416. FrmOption = NULL;
  417. }
  418. //---------------------------------------------------------------------------
  419. int __fastcall TFrmMain::ChangePosition(TVmsFormObj *AVmsObj)
  420. {
  421. TLabel *pLabel = NULL;
  422. int nWidth;
  423. if (AVmsObj->TextData == "") return VERR_NONE;
  424. try
  425. {
  426. pLabel = new TLabel(NULL);
  427. if (pLabel == NULL) return VERR_OTHER;
  428. try
  429. {
  430. pLabel->AutoSize = true;
  431. pLabel->Font->Name = CodeToFont(AVmsObj->TextFontName);
  432. pLabel->Font->Size = AVmsObj->TextFontSize;
  433. pLabel->Caption = AVmsObj->TextData;
  434. if (AVmsObj->TextFontBold)
  435. pLabel->Font->Style = TFontStyles() << fsBold;
  436. else
  437. pLabel->Font->Style = TFontStyles();
  438. nWidth = AVmsObj->Width - pLabel->Width;
  439. //if (nWidth > 0)
  440. {
  441. switch(AVmsObj->TextAlign)
  442. {
  443. case text_align_right: AVmsObj->PosX += nWidth; break;
  444. case text_align_center: AVmsObj->PosX += (nWidth / 2); break;
  445. }
  446. }
  447. if (AVmsObj->PosX < 0)
  448. {
  449. AVmsObj->PosX = 0;
  450. }
  451. }
  452. catch(Exception &e)
  453. {
  454. }
  455. }
  456. __finally
  457. {
  458. SAFE_DELETE(pLabel);
  459. }
  460. return VERR_NONE;
  461. }
  462. //---------------------------------------------------------------------------
  463. int __fastcall TFrmMain::MakeVmsDownloadForm()
  464. {
  465. int nFormCnt;
  466. int nSaveVmsCnt, nSaveFormCnt;
  467. TCDSForm *pCDSForm;
  468. TVmsForm *pVmsForm;
  469. TVmsFormObj *pVmsObj;
  470. VMS_SCHEDULE_INFO *pSch;
  471. VMS_SCHEDULE_DETL *pSchUnit;
  472. LINFO("MakeVmsDownloadForm: Start");
  473. //CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  474. //LINFO("MakeVmsDownloadForm: Memory_S(%u)", FMemSize);
  475. nSaveVmsCnt = 0;
  476. nSaveFormCnt= 0;
  477. //VMS스케줄에 대하여 다운로드 폼을 생성한다.
  478. VmsIterator it;
  479. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  480. {
  481. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  482. if (pObj->Server.UseFlag != bit_enable) continue;
  483. if (!pObj->FProvide) continue;
  484. nSaveVmsCnt++;
  485. //운영모드 변경
  486. pObj->RSTATE.OprMode = pObj->CTLMODE->Control;
  487. pSch = pObj->SCHEDULE;
  488. pObj->CTLMODE->MaxDisplayForm = pSch->Count;
  489. if (pObj->CTLMODE->MaxDisplayForm > pObj->VMS_MAX_PHSE_NUM)
  490. {
  491. LWARN("VMS Form Max count over1: %s, %d EA", pObj->VmsNo.c_str(), pObj->CTLMODE->MaxDisplayForm);
  492. pObj->CTLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
  493. }
  494. if (pObj->CTLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
  495. {
  496. LWARN("VMS Form Max count over2: %s, %d EA", pObj->VmsNo.c_str(), pObj->CTLMODE->MaxDisplayForm);
  497. pObj->CTLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
  498. }
  499. try
  500. {
  501. pObj->pForms->Lock();
  502. //최대 제공 메시지 갯수만큼 생성
  503. for (int ii = 0; ii < pSch->Count && ii < pObj->CTLMODE->MaxDisplayForm; ii++)
  504. {
  505. nFormCnt = pObj->pForms->Count();
  506. pSchUnit = &pSch->Unit[ii];
  507. AnsiString sFormId = pSchUnit->VMS_FORM_ID;
  508. pCDSForm = FormManager->FLists.Find(sFormId);
  509. if (!pCDSForm)
  510. {
  511. LERROR("VMS Schedule Form Not found: VmsNmbr(%s), FormId(%s) %d", pObj->VmsNo.c_str(), sFormId.c_str(), ii);
  512. continue;
  513. }
  514. //소통정보 표출폼 인 경우 표출할 구간의 소통정보가 존재하지 않는 경우
  515. //폼을 생성하지 않도록 한다.
  516. switch(pCDSForm->VMS_FORM_TYPE_CD)
  517. {
  518. case enFormKindTrfImg:
  519. {
  520. // TODO: 도형식 제공구간 중 반 이상 정보가 없으면 해당 폼은 표출하지 않도록 수정, 20220905
  521. bool noIfscData = false;
  522. FOR_STL(TCDSFormObj*, pCDSObj, pCDSForm->FLists) {
  523. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 3) { //소통정보배경이미지
  524. AnsiString ImageId = pCDSObj->SYMBLIB_NMBR+"0";
  525. TCDSImage *pSymbol = ImageManager->FLists.Find(ImageId);
  526. int noDataCount = 0;
  527. int halfIfsc = 0;
  528. int totalIfsc = 0;
  529. if (pSymbol) {
  530. totalIfsc = pSymbol->FLists.Size();
  531. halfIfsc = (int)(totalIfsc / 2.0);
  532. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  533. {
  534. TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  535. if (pTmpIfsc)
  536. {
  537. if (pTmpIfsc->CMTR_GRAD_CD == "0") {
  538. noDataCount++;
  539. }
  540. }
  541. else {
  542. noDataCount++;
  543. }
  544. }
  545. if (noDataCount >= halfIfsc) {
  546. noIfscData = true;
  547. }
  548. }
  549. break;
  550. }
  551. }
  552. if (noIfscData) {
  553. LWARN("VMS Schedule Traffic Shape Form No Traffic: VmsNmbr(%s), FormId(%s)", pObj->VmsNo.c_str(), sFormId.c_str());
  554. continue;
  555. }
  556. }
  557. break;
  558. case enFormKindTrfRow1:// = 11, // 소통상황(1단)
  559. case enFormKindTrfRow2:// = 12, // 소통상황(2단)
  560. case enFormKindTrfRow3:// = 13, // 소통상황(3단)
  561. case enFormKindTrfRow4:// = 14, // 소통상황(4단)
  562. {
  563. int ss;
  564. bool bNoData = false;
  565. AnsiString sVmsIfscId[4];
  566. for (ss = 0; ss < 4; ss++) {
  567. sVmsIfscId[ss] = "";
  568. }
  569. int emptyIfscIdCount = 0;
  570. sVmsIfscId[0] = pSchUnit->FRST_VMS_IFSC_ID;
  571. sVmsIfscId[1] = pSchUnit->SECD_VMS_IFSC_ID;
  572. sVmsIfscId[2] = pSchUnit->THIR_VMS_IFSC_ID;
  573. sVmsIfscId[3] = pSchUnit->FOUR_VMS_IFSC_ID;
  574. AnsiString noDataIfscId;
  575. // TODO: 소통정보가 하나라도로 없으면 해당 폼은 표출하지 않도록 수정, 20220905
  576. for (ss = 0; ss < 4; ss++)
  577. {
  578. if (sVmsIfscId[ss] == "") {
  579. emptyIfscIdCount++;
  580. continue;
  581. }
  582. TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(sVmsIfscId[ss]);
  583. if (pTmpIfsc)
  584. {
  585. // TODO, 20220905
  586. #if 0
  587. if (pTmpIfsc->CMTR_GRAD_CD != "0") {
  588. bNoData = false;
  589. }
  590. #endif
  591. if (pTmpIfsc->CMTR_GRAD_CD == "0") {
  592. //LWARN("VMS Schedule Form No Traffic: VmsNmbr(%s), FormId(%s), IFSC_ID(%s)", pObj->VmsNo.c_str(), sFormId.c_str(), sVmsIfscId[ss].c_str());
  593. noDataIfscId = sVmsIfscId[ss];
  594. bNoData = true;
  595. break;
  596. }
  597. }
  598. else {
  599. // TODO, 20220905
  600. LERROR("VMS Schedule Traffic Form Not Found IFSC ID: VmsNmbr(%s), FormId(%s), IFSC_ID(%s)", pObj->VmsNo.c_str(), sFormId.c_str(), sVmsIfscId[ss].c_str());
  601. bNoData = true;
  602. break;
  603. }
  604. }
  605. if (bNoData)
  606. {
  607. LWARN("VMS Schedule Traffic Form No Traffic: VmsNmbr(%s), FormId(%s), IFSC_ID(%s)", pObj->VmsNo.c_str(), sFormId.c_str(), noDataIfscId.c_str());
  608. continue;
  609. }
  610. if (emptyIfscIdCount == 4)
  611. {
  612. LWARN("VMS Schedule Traffic Form Not Assign IFSC_ID: VmsNmbr(%s), FormId(%s)", pObj->VmsNo.c_str(), sFormId.c_str());
  613. continue;
  614. }
  615. }
  616. break;
  617. }
  618. nSaveFormCnt++;
  619. //폼생성
  620. //pVmsForm = new TVmsForm();
  621. pVmsForm = pObj->pForms->AddForm();
  622. pVmsForm->ScenarioSeq = nFormCnt; /* 폼 표출순서 */
  623. pVmsForm->FormId = pCDSForm->VMS_FORM_ID; /* 폼 ID */
  624. pVmsForm->DisplayTime = pSchUnit->DSPL_HH; /* 표출시간(초) */
  625. pVmsForm->DisplayMode = AnsiString(pCDSForm->VMS_MSG_DSPL_MTHD_CD); /* 표출기능 */
  626. pVmsForm->DisplayDir = AnsiString(pCDSForm->VMS_MSG_DSPL_DRCT_CD); /* 표출방향 */
  627. pVmsForm->FormKind = pCDSForm->VMS_FORM_TYPE_CD; /* 폼 종류 */
  628. pVmsForm->BkColor = pCDSForm->VMS_FORM_BCKG_HUE_CD; /* 배경색상 */
  629. pVmsForm->Width = pObj->WIDTH; /* 폼넓이 */
  630. pVmsForm->Height = pObj->HEIGHT; /* 폼높이 */
  631. pVmsForm->SvcRes = false;
  632. pVmsForm->FtpRes = false;
  633. //pObj->pForms->AddFormA(pVmsForm);
  634. pVmsForm->Lock();
  635. //폼객체생성
  636. FOR_STL(TCDSFormObj*, pCDSObj, pCDSForm->FLists)
  637. {
  638. if (pVmsForm->Count() >= MAX_VMS_OBJ_LIST)
  639. {
  640. continue;
  641. }
  642. //도형식 배경소통정보 폼인 경우 하단에 표출할 정보가 없는 경우
  643. //하단 소통정보 객체는 생성하지 않도록 하자.
  644. if (pVmsForm->FormKind == enFormKindTrfImg)
  645. {
  646. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  647. {
  648. case 0: //문자열
  649. case 1: //심볼
  650. case 2: //이미지
  651. //N:일반(모두표출하는것)
  652. //T:소통정보(소통정보가 있는 경우에만 표출하는것)
  653. //F:하단고정(소통정보가 없는 경우에만 표출하는것)
  654. if (pSchUnit->VMS_IFSC_ID == "")
  655. {
  656. //표출할 소통정보가 없는 경우
  657. if (pCDSObj->TRFC_FILL_CD == "T") continue; //
  658. }
  659. else
  660. {
  661. //표출할 소통정보가 있는 경우
  662. if (pCDSObj->TRFC_FILL_CD == "F") continue; //
  663. }
  664. break;
  665. case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19:
  666. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  667. break;
  668. #if 0
  669. case 1://심볼(소통정보 시점 종점 사이 화살표)
  670. #if 1
  671. if (pCDSObj->VMS_DSPL_TXT.Trim() == "->")
  672. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  673. #else
  674. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  675. #endif
  676. break;
  677. #endif
  678. default: break;
  679. }
  680. }
  681. pVmsObj = pVmsForm->AddFormObject();
  682. pVmsObj->IFSC_ID = "";
  683. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  684. {
  685. case 1: //이미지 심볼
  686. pVmsObj->ObjectKind = graphicID_object_data; //요건 다운로드되어 있는 경우인데 다운로드상관없이 표출되도록하기위함
  687. //pVmsObj->ObjectKind = graphic_object_data;
  688. break;
  689. case 2: //파일이미지
  690. pVmsObj->ObjectKind = graphicID_object_data;
  691. break;
  692. case 3: //소통정보배경이미지
  693. pVmsObj->ObjectKind = graphic_object_data;
  694. break;
  695. case 17: //소통정보이미지1
  696. case 27: //소통정보이미지2
  697. case 37: //소통정보이미지3
  698. case 47: //소통정보이미지4
  699. pVmsObj->ObjectKind = graphicID_object_data;
  700. break;
  701. default:
  702. pVmsObj->ObjectKind = text_object_data;
  703. break;
  704. }
  705. pVmsObj->ObjectType = pCDSObj->VMS_FORM_OBJECT_TYPE_CD; //NUMBER(3) N VMS FORM OBJECT 유형 코드
  706. pVmsObj->TextFontName = pCDSObj->VMS_FONT_TYPE_CD; //NUMBER(3) N VMS 글꼴 유형 코드
  707. //TODO
  708. pVmsObj->StrTextFontName = CodeToFont(pVmsObj->TextFontName);
  709. pVmsObj->TextFontColor = pCDSObj->VMS_FONT_HUE_CD; //NUMBER(9) N VMS 글꼴 색상 코드
  710. pVmsObj->TextFontBold = pCDSObj->VMS_FONT_STYL_CD; //NUMBER(3) Y VMS 글꼴 방식 코드
  711. pVmsObj->TextFontSize = pCDSObj->VMS_FONT_SIZE; //NUMBER(3) Y 0 VMS 글꼴 크기
  712. pVmsObj->TextAlign = pCDSObj->VMS_FONT_ALIGN; //NUMBER(1) Y 0 VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
  713. pVmsObj->TextData = pCDSObj->VMS_DSPL_TXT; //VARCHAR2(200) Y VMS 표출 텍스트
  714. pVmsObj->PosX = pCDSObj->VMS_DSPL_XCRDN; //NUMBER(5) Y VMS 표출 X좌표
  715. pVmsObj->PosY = pCDSObj->VMS_DSPL_YCRDN; //NUMBER(5) Y VMS 표출 Y좌표
  716. pVmsObj->Width = pCDSObj->VMS_DSPL_WIDTH; //NUMBER(5) Y 0 VMS 표출 넓이
  717. pVmsObj->Height = pCDSObj->VMS_DSPL_HEIGHT; //NUMBER(5) Y 0 VMS 표출 높이
  718. pVmsObj->IsBlinking = pCDSObj->VMS_DSPL_BLINKING; //NUMBER(1) Y 0 VMS 표출 점멸 여부(0:지속, 1:점멸)
  719. pVmsObj->BkColor = pCDSObj->VMS_DSPL_BKCOLOR; //NUMBER(1) Y 0 VMS 표출 배경색상코드
  720. pVmsObj->ObjectSize = pCDSObj->VMS_DSPL_SIZE; //NUMBER(7) Y 0 VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
  721. pVmsObj->ImageId = pCDSObj->SYMBLIB_NMBR+"0"; //NUMBER(4) N 0 심벌라이브러리 번호
  722. pVmsObj->ImageType = "0"; //Bitmap
  723. if (pVmsObj->ObjectKind != text_object_data)
  724. {
  725. if (pVmsObj->NewImage() != NULL)
  726. {
  727. try
  728. {
  729. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  730. try
  731. {
  732. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  733. }
  734. catch(Exception &e)
  735. {
  736. LERROR("SaveMemoryStream1: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  737. }
  738. }
  739. __finally
  740. {
  741. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  742. pVmsObj->pImageStream->Clear();
  743. pVmsObj->pImageStream->Position = 0;
  744. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  745. }
  746. }
  747. }
  748. //폼객체 유형별 Fill In
  749. if (pVmsObj->ObjectType == 0) //고정문자열
  750. {
  751. #if 0
  752. if (pObj->FBmpDownload == false && pObj->FIsOldProtocol == false)
  753. {
  754. //신규VMS인 경우 첫자리가 0 인경우 해당 문자를 표출하지 못함
  755. if (pVmsObj->TextData != "")
  756. {
  757. if (pVmsObj->TextData.SubString(1,1) == "0")
  758. {
  759. pVmsObj->TextData = " " + pVmsObj->TextData;
  760. pVmsObj->PosX = pVmsObj->PosX - 5;
  761. }
  762. }
  763. }
  764. #endif
  765. ChangePosition(pVmsObj);
  766. }
  767. else
  768. if (pVmsObj->ObjectType == 101 || //재난안전문자 1열
  769. pVmsObj->ObjectType == 102 || //재난안전문자 2열
  770. pVmsObj->ObjectType == 103 //재난안전문자 3열
  771. )
  772. {
  773. VMS_SAFE_DETL *pEvt = pSchUnit->SAFE;
  774. if (pEvt)
  775. {
  776. switch(pVmsObj->ObjectType)
  777. {
  778. case 101: //재난안전문자 1열
  779. pVmsObj->TextData = pEvt->MSG_LN_1;
  780. break;
  781. case 102: //재난안전문자 2열
  782. pVmsObj->TextData = pEvt->MSG_LN_2;
  783. break;
  784. case 103: //재난안전문자 3열
  785. pVmsObj->TextData = pEvt->MSG_LN_3;
  786. break;
  787. }
  788. }
  789. ChangePosition(pVmsObj);
  790. }
  791. else
  792. if (pVmsObj->ObjectType == 1 || //심볼
  793. pVmsObj->ObjectType == 2 ) //파일이미지
  794. {
  795. ; //처리없음
  796. }
  797. else
  798. if (pVmsObj->ObjectType == 17 || //소통정보이미지1
  799. pVmsObj->ObjectType == 27 || //소통정보이미지2
  800. pVmsObj->ObjectType == 37 || //소통정보이미지3
  801. pVmsObj->ObjectType == 47 ) //소통정보이미지4
  802. {
  803. if (!pVmsObj->pImageData) continue;
  804. TCDSImage *pSymbol = ImageManager->FLists.Find(pVmsObj->ImageId);
  805. if (!pSymbol) continue;
  806. try
  807. {
  808. int X, Y;
  809. switch(pVmsObj->ObjectType)
  810. {
  811. case 17: pVmsObj->IFSC_ID = pSchUnit->FRST_IMG_IFSC_ID; break;
  812. case 27: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
  813. case 37: pVmsObj->IFSC_ID = pSchUnit->THIR_IMG_IFSC_ID; break;
  814. case 47: pVmsObj->IFSC_ID = pSchUnit->FOUR_IMG_IFSC_ID; break;
  815. }
  816. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  817. {
  818. TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(pVmsObj->IFSC_ID);
  819. if (pTmpIfsc)
  820. {
  821. X = pCell->POSX;
  822. Y = pCell->POSY;
  823. pVmsObj->ImageId = pCDSObj->SYMBLIB_NMBR + pTmpIfsc->CMTR_GRAD_CD;
  824. try
  825. {
  826. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  827. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  828. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  829. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  830. }
  831. __finally
  832. {
  833. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  834. }
  835. }
  836. }
  837. pVmsObj->pImageStream->Clear();
  838. pVmsObj->pImageStream->Position = 0;
  839. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  840. }
  841. catch(Exception &e)
  842. {
  843. LERROR("SaveMemoryStreamX: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  844. }
  845. }
  846. else
  847. if (pVmsObj->ObjectType == 3) //소통정보 배경이미지
  848. {
  849. if (!pVmsObj->pImageData) continue;
  850. TCDSImage *pSymbol = ImageManager->FLists.Find(pVmsObj->ImageId);
  851. if (!pSymbol) continue;
  852. try
  853. {
  854. int X, Y;
  855. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  856. {
  857. TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  858. if (pTmpIfsc)
  859. {
  860. X = pCell->POSX;
  861. Y = pCell->POSY;
  862. try
  863. {
  864. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  865. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  866. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  867. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  868. }
  869. __finally
  870. {
  871. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  872. }
  873. }
  874. }
  875. pVmsObj->pImageStream->Clear();
  876. pVmsObj->pImageStream->Position = 0;
  877. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  878. }
  879. catch(Exception &e)
  880. {
  881. LERROR("SaveMemoryStream2: %s[%s] - %s", pVmsForm->FormId.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  882. }
  883. }
  884. else
  885. if (pVmsObj->ObjectType == 61 || //구간명
  886. pVmsObj->ObjectType == 62 || //시점명
  887. pVmsObj->ObjectType == 63 || //종점명
  888. pVmsObj->ObjectType == 64 || //돌발종류
  889. pVmsObj->ObjectType == 65 ) //대응문구
  890. {
  891. //돌발문안인 경우임
  892. pVmsObj->TextData = " ";
  893. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  894. if (pEvt)
  895. {
  896. switch(pVmsObj->ObjectType)
  897. {
  898. case 61: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //구간명(사용안함)
  899. case 62: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //VMS돌발시점명
  900. case 63: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //VMS돌발종점명
  901. case 64: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //VMS돌발세부유형명
  902. case 65: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //대응문구(사용안함-발생장소로 일단넣음)
  903. }
  904. }
  905. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  906. ChangePosition(pVmsObj);
  907. //TB_VMS_FORM_OBJECT_TYPE 테이블에 유형추가하고
  908. //돌발화면에서 필요한 항목 추가, TB_INCD_OCRR_VMS 테이블에 컬럼추가해야함
  909. }
  910. else
  911. if (pVmsObj->ObjectType == 71 || //발생장소
  912. pVmsObj->ObjectType == 72 || //해당도로
  913. pVmsObj->ObjectType == 73 || //통제시점명
  914. pVmsObj->ObjectType == 74 || //통제종점명
  915. pVmsObj->ObjectType == 75 || //00차로 차단
  916. pVmsObj->ObjectType == 76 || //00월00일 ~ 00월00일
  917. pVmsObj->ObjectType == 77 ) //대응문구
  918. {
  919. //공사/행사문안 임
  920. pVmsObj->TextData = " ";
  921. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  922. if (pEvt)
  923. {
  924. switch(pVmsObj->ObjectType)
  925. {
  926. case 71: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  927. case 72: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //해당도로
  928. case 73: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //통제시점명
  929. case 74: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //통제종점명
  930. case 75:
  931. {
  932. int nLane = pEvt->INCD_CLSR_LANE.ToIntDef(0);
  933. if (nLane == 111111)
  934. pVmsObj->TextData = "차로 차단";
  935. else
  936. if (nLane > 0)
  937. pVmsObj->TextData = "일부 차단";
  938. else
  939. pVmsObj->TextData = " ";
  940. }
  941. break; //00차로 차단
  942. case 76: //00월00일 ~ 00월00일
  943. {
  944. String sFrom = pEvt->INCD_STRT_DT.SubString(5,2) + "월" + pEvt->INCD_STRT_DT.SubString(7,2) + "일";
  945. String sTo = pEvt->INCD_END_PRAR_DT.SubString(5,2) + "월" + pEvt->INCD_END_PRAR_DT.SubString(7,2) + "일";
  946. //문자열 맨 앞이 '0'으로 시작하는 경우 VMS에서 표출되지 않음
  947. //if (g_AppCfg.DownloadBitmap == false)
  948. if (pObj->FBmpDownload == false)
  949. {
  950. if (sFrom.SubString(1,1) == "0")
  951. {
  952. sFrom = " " + sFrom;
  953. pVmsObj->PosX = pVmsObj->PosX - 5;
  954. }
  955. }
  956. pVmsObj->TextData = sFrom + " ~ " + sTo;
  957. }
  958. break;
  959. case 77: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //대응문구(사용안함-발생장소로 일단넣음)
  960. }
  961. }
  962. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  963. ChangePosition(pVmsObj);
  964. }
  965. else
  966. if (pVmsObj->ObjectType == 81 || //돌발종류
  967. pVmsObj->ObjectType == 82 || //해당도로
  968. pVmsObj->ObjectType == 83 || //우회도로
  969. pVmsObj->ObjectType == 84 ) //발생장소
  970. {
  971. pVmsObj->TextData = " ";
  972. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  973. if (pEvt)
  974. {
  975. switch(pVmsObj->ObjectType)
  976. {
  977. case 81: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //돌발종류
  978. case 82: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //해당도로
  979. case 83: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //우회도로
  980. case 84: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  981. }
  982. }
  983. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  984. ChangePosition(pVmsObj);
  985. }
  986. else
  987. {
  988. //객체가 가변(소통정보 표출) 인 경우 가변문자를 설정하자....
  989. AnsiString VMS_IFSC_ID = "";
  990. switch(pVmsObj->ObjectType)
  991. {
  992. case 11: case 12: case 13: case 14: case 15: case 16: case 18: case 19:
  993. VMS_IFSC_ID = pSchUnit->FRST_VMS_IFSC_ID;
  994. if (pVmsForm->FormKind == enFormKindTrfImg)
  995. {
  996. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  997. }
  998. else
  999. if (pVmsForm->FormKind == enFormKindCongest && pVmsObj->ObjectType == 18)
  1000. {
  1001. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  1002. }
  1003. break;
  1004. case 21: case 22: case 23: case 24: case 25: case 26: case 28:
  1005. VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
  1006. break;
  1007. case 31: case 32: case 33: case 34: case 35: case 36: case 38:
  1008. VMS_IFSC_ID = pSchUnit->THIR_VMS_IFSC_ID;
  1009. break;
  1010. case 41: case 42: case 43: case 44: case 45: case 46: case 48:
  1011. VMS_IFSC_ID = pSchUnit->FOUR_VMS_IFSC_ID;
  1012. break;
  1013. case 91: case 92:
  1014. VMS_IFSC_ID = pCDSObj->VMS_IFSC_ID; //축통행시간/축소통상황(고정)
  1015. break;
  1016. case 93: case 94: case 95: case 96:
  1017. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  1018. break;
  1019. default: continue;
  1020. }
  1021. pVmsObj->TextData = " ";
  1022. TCDSIfsc *pTmpIfsc = IfscManager->FLists.Find(VMS_IFSC_ID);
  1023. if (pTmpIfsc)
  1024. {
  1025. switch(pVmsObj->ObjectType)
  1026. {
  1027. case 11: case 21: case 31: case 41: //구간명
  1028. pVmsObj->TextData = pTmpIfsc->VMS_IFSC_NM;
  1029. break;
  1030. case 12: case 22: case 32: case 42: case 93://시점명
  1031. pVmsObj->TextData = pTmpIfsc->DSPL_STRT_NODE_NM;
  1032. break;
  1033. case 13: case 23: case 33: case 43: case 94://종점명
  1034. pVmsObj->TextData = pTmpIfsc->DSPL_END_NODE_NM;
  1035. break;
  1036. case 14: case 24: case 34: case 44: case 92: case 95://소통상황
  1037. #if 0
  1038. pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
  1039. #else
  1040. if (pObj->VmsType == "VUTP") //도형식인 경우
  1041. pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), enFormKindTrfImg);
  1042. else
  1043. pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
  1044. #endif
  1045. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1046. break;
  1047. case 19: //소통상황(가변)
  1048. {
  1049. AnsiString sGradText = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->FormKind);
  1050. if (pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0) == grade_smoothness)
  1051. {
  1052. sGradText.printf("소통원활 약 %d 분", pTmpIfsc->TRVL_HH);
  1053. }
  1054. pVmsObj->TextData = sGradText;
  1055. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1056. }
  1057. break;
  1058. case 15: case 25: case 35: case 45: case 91: case 96://통행시간
  1059. #if 0
  1060. pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
  1061. #else
  1062. {
  1063. AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
  1064. if (sFmt.Pos("0"))
  1065. {
  1066. sFmt = StringReplace(sFmt, "0000", "%4d", TReplaceFlags() << rfReplaceAll);
  1067. sFmt = StringReplace(sFmt, "000", "%3d", TReplaceFlags() << rfReplaceAll);
  1068. sFmt = StringReplace(sFmt, "00", "%2d", TReplaceFlags() << rfReplaceAll);
  1069. sFmt = StringReplace(sFmt, "0", "%d", TReplaceFlags() << rfReplaceAll);
  1070. pVmsObj->TextData.printf(sFmt.c_str(), pTmpIfsc->TRVL_HH);
  1071. }
  1072. else
  1073. {
  1074. pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
  1075. }
  1076. }
  1077. #endif
  1078. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1079. break;
  1080. case 16: case 26: case 36: case 46://통행속도
  1081. pVmsObj->TextData = AnsiString(pTmpIfsc->SPED);
  1082. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1083. break;
  1084. case 17: case 27: case 37: case 47: //방향이미지...???
  1085. break;
  1086. case 18: case 28: case 38: case 48:
  1087. pVmsObj->TextData = pTmpIfsc->SPOT_NM;
  1088. break;
  1089. }
  1090. ChangePosition(pVmsObj);
  1091. }
  1092. }
  1093. } //FOR_STL(폼객체생성)
  1094. pVmsForm->UnLock();
  1095. } //for(최대 제공 메시지 갯수만큼 생성)
  1096. }
  1097. __finally
  1098. {
  1099. pObj->pForms->UnLock();
  1100. }
  1101. } //iterator(VMS전체루프)
  1102. LINFO("MakeVmsDownloadForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  1103. LINFO("MakeVmsDatabaseForm: Start");
  1104. nSaveVmsCnt = 0;
  1105. nSaveFormCnt= 0;
  1106. //데이터베이스에 저장할 폼을 생성한다.
  1107. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  1108. {
  1109. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  1110. if (pObj->Server.UseFlag != bit_enable) continue;
  1111. if (!pObj->FProvide) continue;
  1112. nSaveFormCnt += MakeVmsDatabaseForm(pObj);
  1113. nSaveVmsCnt++;
  1114. }
  1115. LINFO("MakeVmsDatabaseForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  1116. return VERR_NONE;
  1117. }
  1118. //---------------------------------------------------------------------------
  1119. int __fastcall TFrmMain::MakeVmsDatabaseForm(TVmsCtlr *AObj)
  1120. {
  1121. int nResult = VERR_OTHER;
  1122. int nSelCnt = 0;
  1123. if (!AObj) return VERR_MEMORY_ALLOC;
  1124. int nFormCnt = AObj->pForms->Count();
  1125. if (nFormCnt == 0) return VERR_NONE;
  1126. try
  1127. {
  1128. try
  1129. {
  1130. AObj->pForms->Lock();
  1131. String PHASE;
  1132. for (int ii = 0; ii < nFormCnt; ii++)
  1133. {
  1134. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1135. int nObjCnt;
  1136. try
  1137. {
  1138. pForm->pBitmap->Canvas->Lock();
  1139. pForm->FormClear(CodeToColor(pForm->BkColor));
  1140. nObjCnt = pForm->Count();
  1141. for (int jj = 0; jj < nObjCnt; jj++)
  1142. {
  1143. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1144. switch(pFormObj->ObjectType)
  1145. {
  1146. case 1: //심볼
  1147. case 2: //이미지
  1148. case 17: //소통정보이미지1
  1149. case 27: //소통정보이미지2
  1150. case 37: //소통정보이미지3
  1151. case 47: //소통정보이미지4
  1152. case 3: //소통정보배경이미지
  1153. pForm->pBitmap->Canvas->Draw(pFormObj->PosX, pFormObj->PosY, pFormObj->pImageData->Picture->Graphic);
  1154. break;
  1155. default://기타 문자열
  1156. pForm->pBitmap->Canvas->Brush->Color = CodeToColor(pFormObj->BkColor);
  1157. pForm->pBitmap->Canvas->Font->Color = CodeToColor(pFormObj->TextFontColor);
  1158. pForm->pBitmap->Canvas->Font->Name = CodeToFont(pFormObj->TextFontName);
  1159. pForm->pBitmap->Canvas->Font->Size = pFormObj->TextFontSize;
  1160. if (pFormObj->TextFontBold)
  1161. pForm->pBitmap->Canvas->Font->Style = TFontStyles() << fsBold;
  1162. else
  1163. pForm->pBitmap->Canvas->Font->Style = TFontStyles();
  1164. pForm->pBitmap->Canvas->TextOutA(pFormObj->PosX, pFormObj->PosY, pFormObj->TextData);
  1165. break;
  1166. }
  1167. }
  1168. try
  1169. {
  1170. pForm->pStream->Clear();
  1171. pForm->pStream->Position = 0;
  1172. pForm->pBitmap->SaveToStream(pForm->pStream);
  1173. }
  1174. catch(Exception &e)
  1175. {
  1176. LERROR("SaveMemoryStream3: %s", AnsiString(e.Message).c_str());
  1177. }
  1178. try
  1179. {
  1180. //pForm->pBitmap->SaveToFile(g_sFormDir + AObj->VmsId + "\\" + AObj->VmsId + "_" + PHASE);
  1181. //FTP다운로드 하는 경우 폼을 FTP디렉토리에 저장해야함
  1182. if (AObj->FIsFtpDownload)
  1183. {
  1184. String DefForm, RunForm;
  1185. DefForm.printf(L"%s9%d.bmp", String(AObj->VmsDownId).c_str(), ii);
  1186. RunForm.printf(L"%s%02d.bmp", String(AObj->VmsDownId).c_str(), ii);
  1187. if (AObj->CTLMODE->Control == 'B')
  1188. {
  1189. pForm->pBitmap->SaveToFile(g_sFtpDir + DefForm);
  1190. // TODO: 원래 주석이었음. 위에 저장내용이
  1191. /// 아래는 조건 상관없이 저장하는 것이었고
  1192. }
  1193. else {
  1194. pForm->pBitmap->SaveToFile(g_sFtpDir + RunForm);
  1195. }
  1196. }
  1197. }
  1198. catch(Exception &e)
  1199. {
  1200. LERROR("SaveMemoryStream-SaveToFile: %s", AnsiString(e.Message).c_str());
  1201. }
  1202. nSelCnt++;
  1203. }
  1204. __finally
  1205. {
  1206. pForm->pBitmap->Canvas->Unlock();
  1207. }
  1208. }
  1209. nResult = VERR_NONE;
  1210. }
  1211. catch(Exception &e)
  1212. {
  1213. LERROR("SaveMemoryStream4: %s", AnsiString(e.Message).c_str());
  1214. }
  1215. }
  1216. __finally
  1217. {
  1218. AObj->pForms->UnLock();
  1219. }
  1220. return nSelCnt;
  1221. }
  1222. //---------------------------------------------------------------------------
  1223. void __fastcall TFrmMain::OnWMUserMessage(TMessage &Msg)
  1224. {
  1225. ReplyMessage(0);
  1226. if ((int)Msg.WParam == WM_MAKE_DOWNLOAD_FORM)
  1227. {
  1228. int nResult = MakeVmsDownloadForm();
  1229. SendDbThreadMessage(WM_SAVE_DOWNLOAD_FORM, NULL, NULL);
  1230. return;
  1231. }
  1232. if ((int)Msg.WParam == WM_MAKE_SAFE_ALARM)
  1233. {
  1234. LINFO("*** SAFE ALARM Occured...");
  1235. ProvideEvent(provide_event, NULL, NULL);
  1236. return;
  1237. }
  1238. if ((int)Msg.WParam == WM_WINDOW_RESTORE)
  1239. {
  1240. Application->Restore();
  1241. Application->BringToFront();
  1242. }
  1243. if ((int)Msg.WParam == WM_DATABASE_CLOSE)
  1244. {
  1245. m_bDB = state_error;
  1246. }
  1247. if ((int)Msg.WParam == WM_DATABASE_OPEN)
  1248. {
  1249. m_bDB = state_normal;
  1250. }
  1251. if ((int)Msg.WParam == WM_THREAD_TERMINATE)
  1252. {
  1253. Sleep(500);
  1254. AutoClose();
  1255. }
  1256. }
  1257. //---------------------------------------------------------------------------
  1258. void __fastcall TFrmMain::OnVmsThreadMessage(TMessage &Msg)
  1259. {
  1260. TVmsCtlr *pObj = (TVmsCtlr*)Msg.LParam;
  1261. switch(Msg.WParam)
  1262. {
  1263. case WM_VMS_SERVER_STTS:
  1264. FrmVmsInfo->UpdateServerState((int)pObj);
  1265. SendDbThreadMessage(WM_EQUIP_STATE, Msg.LParam, 1);
  1266. break;
  1267. case WM_VMS_CLIENT_STTS:
  1268. FrmVmsInfo->UpdateClientState((int)pObj);
  1269. break;
  1270. case WM_VMS_STATE_STTS:
  1271. FrmVmsInfo->UpdateClientState((int)pObj);
  1272. SendDbThreadMessage(WM_EQUIP_STATE, Msg.LParam, 0);
  1273. break;
  1274. }
  1275. }
  1276. //---------------------------------------------------------------------------
  1277. void __fastcall TFrmMain::OnUdpDataRecvMessage(TMessage &Msg)
  1278. {
  1279. int nResult;
  1280. IPCUDPMESSAGESTRUCT *RcvData = (IPCUDPMESSAGESTRUCT*)Msg.LParam;
  1281. INT_SENDER *Sender = &RcvData->Sender;
  1282. INT_PACKET *Pkt = &RcvData->Pkt;
  1283. INT_HEAD *head = &Pkt->head;
  1284. INT_DATA *data = &Pkt->data;
  1285. char *pData = &data->Data[2];
  1286. BYTE OpCode = (BYTE)data->Data[0];
  1287. LINFO("OPR Client Req: %s.%d", VComm_ulong2ip(Sender->IP), Sender->Port);
  1288. if (head->OPCode == INT_OP_COMM_COMMON)
  1289. {
  1290. switch(OpCode)
  1291. {
  1292. case INT_OP_VMS_POWER_CTL:
  1293. {
  1294. INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pData;
  1295. LINFO("VmsPowerCtlReq: %.*s %s, %s, %d", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Command);
  1296. if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
  1297. {
  1298. //ClientResponse(SEND_NACK, &Req, result, NULL);
  1299. }
  1300. }
  1301. break;
  1302. case INT_OP_VMS_LUMINANCE_CTL:
  1303. {
  1304. INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pData;
  1305. LINFO("VmsLuminanceReq: %.*s %s, %s, %d", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Luminance);
  1306. if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
  1307. {
  1308. //ClientResponse(SEND_NACK, &Req, result, NULL);
  1309. }
  1310. }
  1311. break;
  1312. case INT_OP_VMS_RESET:
  1313. {
  1314. INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pData;
  1315. LINFO("VmsResetReq: %.*s %s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId);
  1316. if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
  1317. {
  1318. //ClientResponse(SEND_NACK, &Req, result, NULL);
  1319. }
  1320. }
  1321. break;
  1322. case INT_OP_VMS_PARA_SET:
  1323. {
  1324. INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
  1325. LINFO("VmsParaSetReq: %.*s %s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId);
  1326. LINFO("VmsParaSetReq: %d.%d,%d,%d,%d,%d,%d",
  1327. pReq->SchMsgTime,
  1328. pReq->ModuleTemp,
  1329. pReq->FanTemp,
  1330. pReq->HeaterTemp,
  1331. pReq->ModuleFail,
  1332. pReq->RetryCount,
  1333. pReq->TimeOut);
  1334. if ((nResult = SendVmsThreadMessage(pReq->VmsId, RcvData, OpCode, (char*)pReq)) != VERR_NONE)
  1335. {
  1336. //ClientResponse(SEND_NACK, &Req, result, NULL);
  1337. }
  1338. }
  1339. break;
  1340. case INT_OP_VMS_MODE:
  1341. {
  1342. INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pData;
  1343. #if 0
  1344. LINFO("VmsModeSetReq: %.*s %s, %s, %c", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VmsId, pReq->OperId, pReq->Mode);
  1345. #else
  1346. LINFO("VmsModeSetReq: %.*s %s, %s, %d EA", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId, pReq->Count);
  1347. #endif
  1348. //ProvideEvent(provide_mode, pReq->VmsId, pReq->Mode);
  1349. ProvideEvent(provide_mode, (BYTE*)pReq, NULL);
  1350. }
  1351. break;
  1352. case INT_OP_VMS_STATE_REQ:
  1353. LINFO("VmsStateReq");
  1354. DMCOMM->SendEquipStateAllProc();
  1355. break;
  1356. case INT_OP_VMS_IMAGE_SYMBOL:
  1357. LINFO("VmsImageSymbolUpdate");
  1358. SendDbThreadMessage(WM_MASTER_IMAGE_SYMBOL, NULL, NULL);
  1359. break;
  1360. case INT_OP_VMS_IMAGE_TRAFFIC:
  1361. LINFO("VmsImageTrafficUpdate");
  1362. SendDbThreadMessage(WM_MASTER_IMAGE_TRAFFIC, NULL, NULL);
  1363. break;
  1364. case INT_OP_VMS_FORM_UPDATE:
  1365. LINFO("VmsFormUpdate");
  1366. SendDbThreadMessage(WM_MASTER_FORM, NULL, NULL);
  1367. break;
  1368. case INT_OP_VMS_IFSC_UPDATE:
  1369. LINFO("VmsIfscUpdate");
  1370. SendDbThreadMessage(WM_MASTER_VMS_IFSC, NULL, NULL);
  1371. break;
  1372. }
  1373. }
  1374. }
  1375. //---------------------------------------------------------------------------
  1376. void __fastcall TFrmMain::TerminateApplication(void)
  1377. {
  1378. LERROR("Program terminated start");
  1379. /* 연결 소켓 종료 */
  1380. DMCOMM->TerminateVms();
  1381. Sleep(500);
  1382. DMCOMM->TerminateVms();
  1383. DMCOMM->TerminateVmsClient();
  1384. SendTerminal();
  1385. if (m_CommThreadID != NULL)
  1386. {
  1387. g_SysInfo->State.hFinishEvent = CreateEvent(NULL, FALSE, FALSE, "");
  1388. if (g_SysInfo->State.hFinishEvent == NULL)
  1389. {
  1390. LERROR("Create thread finish event fail");
  1391. }
  1392. if (!PostThreadMessage(m_CommThreadID, WM_QUIT, NULL, NULL))
  1393. {
  1394. LDEBUG("PostThreadMessage fail:%d", GetLastError());
  1395. }
  1396. m_CommThreadID = NULL;
  1397. if (g_SysInfo->State.hFinishEvent != NULL)
  1398. {
  1399. DWORD dwWaitResult;
  1400. dwWaitResult = WaitForSingleObject(g_SysInfo->State.hFinishEvent, 5000);
  1401. if (dwWaitResult != WAIT_OBJECT_0)
  1402. {
  1403. LERROR("Wait finish event fail");
  1404. }
  1405. CloseHandle(g_SysInfo->State.hFinishEvent);
  1406. }
  1407. }
  1408. VComm_Close();
  1409. LERROR("Program terminated end");
  1410. }
  1411. //---------------------------------------------------------------------------
  1412. void __fastcall TFrmMain::UpdateProcessStatePanel()
  1413. {
  1414. TColor clState;
  1415. clState = clGreen;
  1416. if (m_bAction != vms_normal) clState = clRed;
  1417. if (plStateAction->Color != clState) plStateAction->Color = clState;
  1418. if (m_bComm == state_normal) clState = clGreen;
  1419. else
  1420. if (m_bComm == state_unknown) clState = clGray;
  1421. else clState = clRed;
  1422. if (plStateComm->Color != clState) plStateComm->Color = clState;
  1423. if (m_bDB == state_normal) clState = clGreen;
  1424. else
  1425. if (m_bDB == state_unknown) clState = clGray;
  1426. else clState = clRed;
  1427. if (plStateDb->Color != clState) plStateDb->Color = clState;
  1428. }
  1429. //---------------------------------------------------------------------------
  1430. int __fastcall TFrmMain::SendDbThreadMessage(UINT Msg, int wParam, int lParam)
  1431. {
  1432. int result = VERR_OTHER;
  1433. if (m_CommThreadID != NULL)
  1434. {
  1435. if (PostThreadMessage(m_CommThreadID, Msg, (WPARAM)wParam, (LPARAM)lParam))
  1436. {
  1437. result = VERR_NONE;
  1438. }
  1439. else
  1440. {
  1441. result = VERR_INTERNAL;
  1442. }
  1443. }
  1444. return result;
  1445. }
  1446. //---------------------------------------------------------------------------
  1447. int __fastcall TFrmMain::SendDbThreadDataMessage(UINT Msg, void *pData, int iLen)
  1448. {
  1449. int result = VERR_OTHER;
  1450. char *p;
  1451. if (m_CommThreadID != NULL)
  1452. {
  1453. p = new char[iLen];
  1454. if (p != NULL)
  1455. {
  1456. try
  1457. {
  1458. memcpy(p, pData, iLen);
  1459. if (PostThreadMessage(m_CommThreadID, Msg, (WPARAM)p, NULL))
  1460. {
  1461. result = VERR_NONE;
  1462. Sleep(50);
  1463. }
  1464. else
  1465. {
  1466. result = VERR_INTERNAL;
  1467. }
  1468. }
  1469. __finally
  1470. {
  1471. if (result != VERR_NONE) delete []p;
  1472. }
  1473. }
  1474. else
  1475. {
  1476. result = VERR_MEMORY_ALLOC;
  1477. }
  1478. }
  1479. return result;
  1480. }
  1481. //---------------------------------------------------------------------------
  1482. void __fastcall TFrmMain::ClientResponse(int Flag, REQ_INFO_STRUCT *pReq, int error, void *pData)
  1483. {
  1484. #ifdef CENTERCOMM
  1485. BYTE ErrCode;
  1486. int sResult;
  1487. switch(error)
  1488. {
  1489. case SYS_ERR_NONE: break;
  1490. case SYS_ERR_OTHER: ErrCode = INT_ERROR_OTHER; break;
  1491. case SYS_ERR_INTERNAL: ErrCode = INT_ERROR_SYSTEM; break;
  1492. case SYS_ERR_MEMORY: ErrCode = INT_ERROR_SYSTEM; break;
  1493. case SYS_ERR_DATABASE: ErrCode = INT_ERROR_SYSTEM; break;
  1494. case SYS_ERR_RESET: ErrCode = INT_ERROR_SYSTEM; break;
  1495. case SYS_ERR_START: ErrCode = INT_ERROR_SYSTEM; break;
  1496. case SYS_ERR_OFFLINE: ErrCode = INT_ERROR_OFFLINE; break;
  1497. case SYS_ERR_NO_RES: ErrCode = INT_ERROR_NO_RESPONSE; break;
  1498. case SYS_ERR_ACCESS: ErrCode = INT_ERROR_PROCESS; break;
  1499. case SYS_ERR_INVALID: ErrCode = INT_ERROR_OTHER; break;
  1500. case SYS_ERR_UNKNOWN: ErrCode = INT_ERROR_UNKNOWN_CODE; break;
  1501. case SYS_ERR_WRITE_LENGTH: ErrCode = INT_ERROR_OTHER; break;
  1502. case SYS_ERR_PACKET_SIZE_LARGE: ErrCode = INT_ERROR_OTHER; break;
  1503. case SYS_ERR_INVALID_TAG: ErrCode = INT_ERROR_OTHER; break;
  1504. case SYS_ERR_CRC: ErrCode = INT_ERROR_OTHER; break;
  1505. case SYS_ERR_LENGTH: ErrCode = INT_ERROR_LENGTH; break;
  1506. case SYS_ERR_ADDRESS: ErrCode = INT_ERROR_ADDRESS; break;
  1507. case SYS_ERR_HEADER_OPTIONS: ErrCode = INT_ERROR_HEADER; break;
  1508. case SYS_ERR_UNKNOWN_COMMAND: ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
  1509. case SYS_ERR_RECEIVE_TIMEOUT: ErrCode = INT_ERROR_OTHER; break;
  1510. case SYS_ERR_DATA_SIZE: ErrCode = INT_ERROR_DISCORD; break;
  1511. case SYS_ERR_MISMATCH: ErrCode = INT_ERROR_OTHER; break;
  1512. case SYS_ERR_INVALID_PARA: ErrCode = INT_ERROR_INVALID_DATA; break;
  1513. case SYS_ERR_MOVEMENT: ErrCode = INT_ERROR_MOVEMENT; break;
  1514. case SYS_ERR_UNAUTHORIZED: ErrCode = INT_ERROR_UNAUTHORIZED; break;
  1515. default: ErrCode = INT_ERROR_OTHER; break;
  1516. }
  1517. if (Flag == SEND_ACK)
  1518. {
  1519. INT_ACK_RES Ack;
  1520. memset(&Ack, 0x00, sizeof(Ack));
  1521. Ack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1522. Ack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1523. Ack.MsgSeq = pReq->MsgSeq;
  1524. if ((sResult = AckRes(&Ack, pReq->ProcessID)) != UDP_ERR_NONE)
  1525. {
  1526. LERROR("AckRes fail %d", sResult);
  1527. }
  1528. }
  1529. else
  1530. if (Flag == SEND_NACK)
  1531. {
  1532. INT_NACK_RES Nack;
  1533. memset(&Nack, 0x00, sizeof(Nack));
  1534. Nack.OPCode.Type = INT_TYPE(pReq->OpCode);
  1535. Nack.OPCode.Kind = INT_KIND(pReq->OpCode);
  1536. Nack.MsgSeq = pReq->MsgSeq;
  1537. Nack.ErrCode = ErrCode;
  1538. if ((sResult = NackRes(&Nack, pReq->ProcessID)) != UDP_ERR_NONE)
  1539. {
  1540. LERROR("NackRes fail %d", sResult);
  1541. }
  1542. }
  1543. #endif
  1544. }
  1545. //---------------------------------------------------------------------------
  1546. bool __fastcall TFrmMain::CheckBasisTime(char *p, int Cycle, int Basis)
  1547. {
  1548. char cTime[15];
  1549. CommUtil_MakeBasisTime(cTime, Cycle, Basis);
  1550. if (memcmp(p, cTime, 14) != 0)
  1551. {
  1552. memcpy(p, cTime, 14);
  1553. return true;
  1554. }
  1555. return false;
  1556. }
  1557. //---------------------------------------------------------------------------
  1558. void __fastcall TFrmMain::ProvideEvent(int Type, BYTE *pVmsId, BYTE Mode)
  1559. {
  1560. int result;
  1561. PROVIDE_STRUCT Pro;
  1562. memset(&Pro, 0x00, sizeof(Pro));
  1563. Pro.Type = Type;
  1564. if (pVmsId)
  1565. {
  1566. INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pVmsId;
  1567. Pro.Count = pReq->Count;
  1568. memcpy(Pro.Unit, pReq->Unit, sizeof(Pro.Unit));
  1569. }
  1570. else
  1571. {
  1572. m_trfSendTimer = Now();
  1573. }
  1574. #if 0
  1575. switch(Type)
  1576. {
  1577. case provide_event:
  1578. Pro.Type = Type;
  1579. break;
  1580. case provide_mode:
  1581. Pro.Type = Type;
  1582. //memcpy(Pro.VmsId, pVmsId, VMS_ID_SIZE);
  1583. //Pro.Mode = Mode;
  1584. INT_VMS_MODE_REQ *pReq
  1585. break;
  1586. default:
  1587. return;
  1588. }
  1589. #endif
  1590. if ((result = SendDbThreadDataMessage(WM_PROVIDE_PROC, &Pro, sizeof(Pro))) != SYS_ERR_NONE)
  1591. {
  1592. LERROR("SendDbThreadDataMessage Error %d", result);
  1593. }
  1594. }
  1595. //---------------------------------------------------------------------------
  1596. void __fastcall TFrmMain::CheckProvideSave()
  1597. {
  1598. SAVE_STRUCT ProvideSave;
  1599. SAVE_STRUCT DownLoadSave;
  1600. memset(&ProvideSave, 0x00, sizeof(ProvideSave));
  1601. memset(&DownLoadSave, 0x00, sizeof(DownLoadSave));
  1602. ProvideSave.Type = save_provide;
  1603. ProvideSave.Count = 0;
  1604. DownLoadSave.Type = save_download;
  1605. DownLoadSave.Count = 0;
  1606. VmsIterator it;
  1607. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  1608. {
  1609. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  1610. if (pObj->Server.UseFlag != bit_enable) continue;
  1611. if ((pObj->DOWNLOAD->SaveFlag == false) &&
  1612. (CommUtil_TimeDiff(pObj->DOWNLOAD->dTimer) > VMS_DOWNLOAD_TIMEOUT))
  1613. {
  1614. DownLoadSave.pObj[DownLoadSave.Count++] = (void *)pObj;
  1615. pObj->DOWNLOAD->SaveFlag = true;
  1616. }
  1617. if ((pObj->CTLMODE->SaveFlag == false) &&
  1618. (CommUtil_TimeDiff(pObj->CTLMODE->pTimer) > VMS_PROVIDE_TIMEOUT))
  1619. {
  1620. ProvideSave.pObj[ProvideSave.Count++] = (void *)pObj;
  1621. pObj->CTLMODE->SaveFlag = true;
  1622. }
  1623. }
  1624. if (ProvideSave.Count != 0)
  1625. {
  1626. SendDbThreadDataMessage(WM_PROVIDE_SAVE, &ProvideSave, sizeof(ProvideSave));
  1627. }
  1628. if (DownLoadSave.Count != 0)
  1629. {
  1630. SendDbThreadDataMessage(WM_PROVIDE_SAVE, &DownLoadSave, sizeof(DownLoadSave));
  1631. }
  1632. }
  1633. //---------------------------------------------------------------------------
  1634. bool __fastcall TFrmMain::CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi)
  1635. {
  1636. bool result;
  1637. HANDLE hProcess;
  1638. PROCESS_MEMORY_COUNTERS pmc;
  1639. size_t uSize;
  1640. DWORD HandleCount, ThreadCount, GdiCount;
  1641. HANDLE hProcessSnap;
  1642. PROCESSENTRY32 pe32;
  1643. DWORD ProcessId;
  1644. result = false;
  1645. uSize = 0;
  1646. HandleCount = 0;
  1647. ThreadCount = 0;
  1648. GdiCount = 0;
  1649. hProcess = GetCurrentProcess();
  1650. if (hProcess != NULL)
  1651. {
  1652. if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
  1653. {
  1654. uSize = pmc.WorkingSetSize/1024;
  1655. if ((MaxMemory != 0) && (uSize > MaxMemory))
  1656. {
  1657. LERROR("Memory usage exceeds standards!!!...[%d][%d]", MaxMemory, uSize);
  1658. result = true;
  1659. }
  1660. }
  1661. if ( GetProcessHandleCount( hProcess, &HandleCount) )
  1662. {
  1663. if ((MaxHandle != 0) && (HandleCount > MaxHandle))
  1664. {
  1665. LERROR("Window handle exceed standards!!!...[%d][%d]", MaxHandle, HandleCount);
  1666. result = true;
  1667. }
  1668. }
  1669. ProcessId = GetCurrentProcessId();
  1670. if ((hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )) != INVALID_HANDLE_VALUE)
  1671. {
  1672. pe32.dwSize = sizeof( PROCESSENTRY32 );
  1673. if ( Process32First( hProcessSnap, &pe32 ) )
  1674. {
  1675. do
  1676. {
  1677. if (pe32.th32ProcessID == ProcessId)
  1678. {
  1679. ThreadCount = pe32.cntThreads;
  1680. if ((MaxThread != 0) && (ThreadCount > MaxThread))
  1681. {
  1682. LERROR("Criteria exceeded thread!!!...[%d][%d]", MaxThread, ThreadCount);
  1683. result = true;
  1684. }
  1685. break;
  1686. }
  1687. } while( Process32Next( hProcessSnap, &pe32 ) );
  1688. }
  1689. CloseHandle( hProcessSnap );
  1690. }
  1691. GdiCount = GetGuiResources( hProcess, GR_GDIOBJECTS);
  1692. if ((MaxGdi != 0) && (GdiCount > MaxGdi))
  1693. {
  1694. LERROR("GDI Objects exceeding standards!!!...[%d][%d]", MaxGdi, GdiCount);
  1695. result = true;
  1696. }
  1697. CloseHandle( hProcess );
  1698. }
  1699. try
  1700. {
  1701. FMemSize = uSize;
  1702. plMemory->Caption = FormatFloat("##,##0", uSize) ;// + " KB";
  1703. plHandle->Caption = FormatFloat("##,##0", HandleCount);// + " EA";
  1704. plThread->Caption = FormatFloat("##,##0", ThreadCount);// + " EA";
  1705. plGdi->Caption = FormatFloat("##,##0", GdiCount) ;// + " EA";
  1706. } catch (Exception &e) {}
  1707. return result;
  1708. }
  1709. //---------------------------------------------------------------------------
  1710. int TFrmMain::LogWrite(int ALogKind, char *AFmt, ...)
  1711. {
  1712. va_list ap;
  1713. int cnt = 0;
  1714. char szFmtData[MAX_LOG_BUFFER];
  1715. AnsiString sLogKind;
  1716. bool bLog = false;
  1717. switch(ALogKind)
  1718. {
  1719. case eLOG_INFO : bLog = g_LogCfg.Info; sLogKind = " [INF] "; break;
  1720. case eLOG_DATA : bLog = g_LogCfg.Data; sLogKind = " [DAT] "; break;
  1721. case eLOG_ERROR : bLog = g_LogCfg.Error; sLogKind = " [ERR] "; break;
  1722. case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = " [WAN] "; break;
  1723. case eLOG_DEBUG : bLog = g_LogCfg.Debug; sLogKind = " [DBG] "; break;
  1724. case eLOG_DETAIL : bLog = g_LogCfg.Detail; sLogKind = " [DET] "; break;
  1725. }
  1726. if (!bLog) return -1;
  1727. try
  1728. {
  1729. va_start(ap, AFmt);
  1730. cnt = vsprintf(szFmtData, AFmt, ap);
  1731. va_end(ap);
  1732. ITSLog->LogWrite(NULL, ALogKind, szFmtData);
  1733. IPC_LOG_MESSAGE *pLog = &FLogMsg;//new IPC_LOG_MESSAGE;
  1734. if (pLog)
  1735. {
  1736. pLog->Kind = ALogKind;
  1737. pLog->Flag = 0;
  1738. pLog->Len = strlen(szFmtData);
  1739. pLog->Tm = Now();
  1740. memset(pLog->Msg, 0x00, sizeof(pLog->Msg));
  1741. sprintf(pLog->Msg, "%sMAIN %s", sLogKind.c_str(), szFmtData);
  1742. DWORD dwResult = 0;
  1743. LRESULT lResult = SEND_LOGMSG(FrmSysLog->Handle, WM_LOG_DISPLAY, pLog, NULL, SMTO_NORMAL, 2000, dwResult);
  1744. if (lResult == 0)
  1745. {
  1746. dwResult = GetLastError();
  1747. if (dwResult == ERROR_TIMEOUT)
  1748. {
  1749. }
  1750. //SAFE_DELETE(pLog);
  1751. }
  1752. }
  1753. }
  1754. catch(Exception &e)
  1755. {
  1756. }
  1757. return cnt;
  1758. }
  1759. //---------------------------------------------------------------------------
  1760. void __fastcall TFrmMain::Panel16DblClick(TObject *Sender)
  1761. {
  1762. CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
  1763. }
  1764. //---------------------------------------------------------------------------
  1765. void __fastcall TFrmMain::plStateDbDblClick(TObject *Sender)
  1766. {
  1767. SendDbThreadMessage(WM_MASTER_IMAGE_SYMBOL, NULL, NULL);
  1768. Sleep(500);
  1769. SendDbThreadMessage(WM_MASTER_FORM, NULL, NULL);
  1770. Sleep(500);
  1771. SendDbThreadMessage(WM_MASTER_VMS_IFSC, NULL, NULL);
  1772. }
  1773. //---------------------------------------------------------------------------
  1774. void __fastcall TFrmMain::plStateActionDblClick(TObject *Sender)
  1775. {
  1776. ProvideEvent(provide_event, NULL, NULL);
  1777. }
  1778. //---------------------------------------------------------------------------
  1779. void __fastcall TFrmMain::LoadOldVmsInfo()
  1780. {
  1781. //LINFO("Old Protocol Version VMS Information Loading...");
  1782. TStringList *slFile = NULL;
  1783. String sCfgFile = g_sCfgDir + "OldVMS.inf";
  1784. try
  1785. {
  1786. slFile = new TStringList;
  1787. slFile->Clear();
  1788. slFile->LoadFromFile(sCfgFile);
  1789. int ii;
  1790. unsigned int hn, ln;
  1791. BYTE chn, cln, val;
  1792. char szData[2048];
  1793. BYTE RxBuff[VMS_MAX_PACKET_SIZE];
  1794. int RxLen;
  1795. RxLen = 0;
  1796. memset(RxBuff, 0x00, sizeof(RxBuff));
  1797. for (ii = 0; ii < slFile->Count; ii++)
  1798. {
  1799. AnsiString sVmsId = slFile->Strings[ii].Trim();
  1800. if (sVmsId == "") continue;
  1801. if (sVmsId == "\r\n") continue;
  1802. TVmsCtlr *pObj = FindVms(sVmsId);
  1803. if (pObj)
  1804. {
  1805. pObj->FIsOldProtocol = true;
  1806. //LINFO("%s : 이전 버전 프로토콜 사용", sVmsId.c_str());
  1807. }
  1808. else
  1809. {
  1810. //LINFO("%s : 이전 버전 프로토콜 사용(찾을수 없음)", sVmsId.c_str());
  1811. }
  1812. }
  1813. }
  1814. catch(Exception &e)
  1815. {
  1816. LERROR("LoadOldVmsInfo Exception: %s", AnsiString(e.Message).c_str());
  1817. }
  1818. delete slFile;
  1819. }
  1820. //---------------------------------------------------------------------------
  1821. void __fastcall TFrmMain::LoadFtpVmsInfo()
  1822. {
  1823. //LINFO("FTP Download VMS Information Loading...");
  1824. TStringList *slFile = NULL;
  1825. String sCfgFile = g_sCfgDir + "FtpVMS.inf";
  1826. try
  1827. {
  1828. slFile = new TStringList;
  1829. slFile->Clear();
  1830. slFile->LoadFromFile(sCfgFile);
  1831. int ii;
  1832. unsigned int hn, ln;
  1833. BYTE chn, cln, val;
  1834. char szData[2048];
  1835. BYTE RxBuff[VMS_MAX_PACKET_SIZE];
  1836. int RxLen;
  1837. RxLen = 0;
  1838. memset(RxBuff, 0x00, sizeof(RxBuff));
  1839. for (ii = 0; ii < slFile->Count; ii++)
  1840. {
  1841. AnsiString sVmsId = slFile->Strings[ii].Trim();
  1842. if (sVmsId == "") continue;
  1843. if (sVmsId == "\r\n") continue;
  1844. TVmsCtlr *pObj = FindVms(sVmsId);
  1845. if (pObj)
  1846. {
  1847. pObj->FIsFtpDownload = true;
  1848. pObj->FBmpDownload = true; //FTP로 다운로드 하는 경우 이미지로 전송되어야함
  1849. //LINFO("%s : FTP Downloaod 사용", sVmsId.c_str());
  1850. }
  1851. else
  1852. {
  1853. //LINFO("%s : FTP Downloaod 사용(찾을수 없음)", sVmsId.c_str());
  1854. }
  1855. }
  1856. }
  1857. catch(Exception &e)
  1858. {
  1859. LERROR("LoadFtpVmsInfo Exception: %s", AnsiString(e.Message).c_str());
  1860. }
  1861. delete slFile;
  1862. }
  1863. //---------------------------------------------------------------------------
  1864. void __fastcall TFrmMain::LoadFontVmsInfo()
  1865. {
  1866. //LINFO("Protocol Font Name VMS Information Loading...");
  1867. TStringList *slFile = NULL;
  1868. String sCfgFile = g_sCfgDir + "FontNameVMS.inf";
  1869. try
  1870. {
  1871. slFile = new TStringList;
  1872. slFile->Clear();
  1873. slFile->LoadFromFile(sCfgFile);
  1874. int ii;
  1875. unsigned int hn, ln;
  1876. BYTE chn, cln, val;
  1877. char szData[2048];
  1878. BYTE RxBuff[VMS_MAX_PACKET_SIZE];
  1879. int RxLen;
  1880. RxLen = 0;
  1881. memset(RxBuff, 0x00, sizeof(RxBuff));
  1882. for (ii = 0; ii < slFile->Count; ii++)
  1883. {
  1884. AnsiString sVmsId = slFile->Strings[ii].Trim();
  1885. if (sVmsId == "") continue;
  1886. if (sVmsId == "\r\n") continue;
  1887. TVmsCtlr *pObj = FindVms(sVmsId);
  1888. if (pObj)
  1889. {
  1890. pObj->FIsProtolFontName = true;
  1891. //LINFO("%s : Font Name Protocol 사용", sVmsId.c_str());
  1892. }
  1893. else
  1894. {
  1895. //LINFO("%s : Font Name Protocol 사용(찾을수 없음)", sVmsId.c_str());
  1896. }
  1897. }
  1898. }
  1899. catch(Exception &e)
  1900. {
  1901. LERROR("LoadFontVmsInfo Exception: %s", AnsiString(e.Message).c_str());
  1902. }
  1903. delete slFile;
  1904. }
  1905. //---------------------------------------------------------------------------
  1906. void __fastcall TFrmMain::LoadStatusAutoVmsInfo()
  1907. {
  1908. //LINFO("Status Auto Notify VMS Information Loading...");
  1909. TStringList *slFile = NULL;
  1910. String sCfgFile = g_sCfgDir + "StatusAutoVMS.inf";
  1911. try
  1912. {
  1913. slFile = new TStringList;
  1914. slFile->Clear();
  1915. slFile->LoadFromFile(sCfgFile);
  1916. int ii;
  1917. unsigned int hn, ln;
  1918. BYTE chn, cln, val;
  1919. char szData[2048];
  1920. BYTE RxBuff[VMS_MAX_PACKET_SIZE];
  1921. int RxLen;
  1922. RxLen = 0;
  1923. memset(RxBuff, 0x00, sizeof(RxBuff));
  1924. for (ii = 0; ii < slFile->Count; ii++)
  1925. {
  1926. AnsiString sVmsId = slFile->Strings[ii].Trim();
  1927. if (sVmsId == "") continue;
  1928. if (sVmsId == "\r\n") continue;
  1929. TVmsCtlr *pObj = FindVms(sVmsId);
  1930. if (pObj)
  1931. {
  1932. pObj->FIsStatusAuto = true;
  1933. //LINFO("%s : Status Auto 사용", sVmsId.c_str());
  1934. }
  1935. else
  1936. {
  1937. //LINFO("%s : Status Auto 사용(찾을수 없음)", sVmsId.c_str());
  1938. }
  1939. }
  1940. }
  1941. catch(Exception &e)
  1942. {
  1943. LERROR("LoadStatusAutoVmsInfo Exception: %s", AnsiString(e.Message).c_str());
  1944. }
  1945. delete slFile;
  1946. }
  1947. //---------------------------------------------------------------------------
  1948. void __fastcall TFrmMain::LoadBitmapVmsInfo()
  1949. {
  1950. //LINFO("Bitmap Form VMS Information Loading...");
  1951. TStringList *slFile = NULL;
  1952. String sCfgFile = g_sCfgDir + "BitmapVMS.inf";
  1953. try
  1954. {
  1955. slFile = new TStringList;
  1956. slFile->Clear();
  1957. slFile->LoadFromFile(sCfgFile);
  1958. int ii;
  1959. unsigned int hn, ln;
  1960. BYTE chn, cln, val;
  1961. char szData[2048];
  1962. BYTE RxBuff[VMS_MAX_PACKET_SIZE];
  1963. int RxLen;
  1964. RxLen = 0;
  1965. memset(RxBuff, 0x00, sizeof(RxBuff));
  1966. for (ii = 0; ii < slFile->Count; ii++)
  1967. {
  1968. AnsiString sVmsId = slFile->Strings[ii].Trim();
  1969. if (sVmsId == "") continue;
  1970. if (sVmsId == "\r\n") continue;
  1971. TVmsCtlr *pObj = FindVms(sVmsId);
  1972. if (pObj)
  1973. {
  1974. pObj->FBmpDownload = true;
  1975. //LINFO("%s : Bitmap Form 사용", sVmsId.c_str());
  1976. }
  1977. else
  1978. {
  1979. //LINFO("%s : Bitmap Form 사용(찾을수 없음)", sVmsId.c_str());
  1980. }
  1981. }
  1982. }
  1983. catch(Exception &e)
  1984. {
  1985. LERROR("LoadBitmapVmsInfo Exception: %s", AnsiString(e.Message).c_str());
  1986. }
  1987. delete slFile;
  1988. }
  1989. //---------------------------------------------------------------------------
  1990. TVmsCtlr* __fastcall TFrmMain::FindVms(AnsiString AVmsId)
  1991. {
  1992. VmsIterator it;
  1993. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  1994. {
  1995. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  1996. if (pObj->VmsId.AnsiCompare(AVmsId) == 0)
  1997. {
  1998. return pObj;
  1999. }
  2000. }
  2001. return NULL;
  2002. }
  2003. //---------------------------------------------------------------------------
  2004. bool __fastcall TFrmMain::OpenCenterComm()
  2005. {
  2006. try
  2007. {
  2008. IdUDPCenterServer->DefaultPort = g_AppCfg.nProcessPort;
  2009. IdUDPCenterServer->IPVersion = Id_IPv4;
  2010. IdUDPCenterServer->BroadcastEnabled = true;
  2011. IdUDPCenterServer->ThreadedEvent = true;
  2012. IdUDPCenterServer->Active = true;
  2013. }
  2014. catch(Exception &e)
  2015. {
  2016. LERROR("OpenCenterComm Error: [%s]", AnsiString(e.ClassName()+e.Message).c_str());
  2017. return false;
  2018. }
  2019. return true;
  2020. }
  2021. //---------------------------------------------------------------------------
  2022. void __fastcall TFrmMain::IdUDPCenterServerUDPRead(TIdUDPListenerThread *AThread,
  2023. TBytes AData, TIdSocketHandle *ABinding)
  2024. {
  2025. BYTE szRcvBuf[MAX_OLD_PACKET];
  2026. AnsiString sPeerIp = AnsiString(ABinding->PeerIP).c_str();
  2027. int nPeerPort = ABinding->PeerPort;
  2028. int nRcvLen = AData.get_length();
  2029. #if 0
  2030. LINFO("Center Recv Data: [%s.%d] %d Bytes", sPeerIp.c_str(), nPeerPort, nRcvLen);
  2031. #endif
  2032. if (nRcvLen > MAX_OLD_PACKET)
  2033. {
  2034. LERROR("Center Recv Data: [%s.%d] %d Bytes - Packet OverFlow", sPeerIp.c_str(), nPeerPort, nRcvLen);
  2035. return;
  2036. }
  2037. memset(szRcvBuf, 0x00, sizeof(szRcvBuf));
  2038. memcpy(szRcvBuf, &AData[0], nRcvLen);
  2039. OLD_PROT_HEAD *pHead = (OLD_PROT_HEAD*)szRcvBuf;
  2040. if (pHead->OpCodeType != 0x01 &&
  2041. pHead->OpCodeKind != 0x01)
  2042. {
  2043. LERROR("Center Recv Unknown Request: Type[%02X], Kind[%02X]", pHead->OpCodeType, pHead->OpCodeKind);
  2044. return;
  2045. }
  2046. BYTE szRes[30];
  2047. memset(szRes, 0x00, sizeof(szRes));
  2048. #define VMS_NODE_ID 0x03
  2049. #define VMS_TASK_ID 0x01
  2050. szRes[ 0] = pHead->MsgSeq; //MsgSeq
  2051. szRes[ 1] = 0x00; //MsgCL
  2052. szRes[ 2] = 0x00; //ResFlag
  2053. szRes[ 3] = VMS_NODE_ID; //NodeId
  2054. szRes[ 4] = VMS_TASK_ID; //TaskId
  2055. szRes[ 5] = 0x01; //TaskSeqNo
  2056. szRes[ 6] = 0x01; //OpType
  2057. szRes[ 7] = 0x02; //OpKind
  2058. szRes[ 8] = 0x00; //Length
  2059. szRes[ 9] = 0x03; //Length
  2060. szRes[10] = (m_bDB == state_normal) ? 0x01 : 0x00; //DB
  2061. szRes[11] = (VmsManager->Normal == 0) ? 0x00 : 0x01; //통신
  2062. szRes[12] = 0x01; //동작
  2063. //DB상태(0:장애 1:정상 2:해당 없음), 통신상태(0:장애 1:정상 2:해당 없음), 동작상태(0 : Standby 1 : Active 2 : Change)
  2064. if (IdUDPCenterServer->Bindings == NULL)
  2065. {
  2066. LERROR("Center Communication Error");
  2067. }
  2068. else
  2069. {
  2070. int nSendLen = 13;
  2071. TBytes sendBytes;
  2072. sendBytes.Length = nSendLen;
  2073. ZeroMemory(&sendBytes[0], nSendLen);
  2074. CopyMemory(&sendBytes[0], szRes, nSendLen);
  2075. IdUDPCenterServer->SendBuffer(String(sPeerIp), (WORD)nPeerPort, Id_IPv4, sendBytes);
  2076. LINFO("Center Response Program Run State: [%s.%d] %d Bytes Send", sPeerIp.c_str(), nPeerPort, nSendLen);
  2077. }
  2078. }
  2079. //---------------------------------------------------------------------------