12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802 |
- //---------------------------------------------------------------------------
- #define WIN32_LEAN_AND_MEAN
- #include <DateUtils.hpp>
- #include "ITSNetF.h"
- #include <vcl.h>
- #pragma hdrstop
- #include <psapi.h>
- #include <windows.h>
- #include <stdio.h>
- #include <time.h>
- //---------------------------------------------------------------------------
- #include "AppGlobalF.h"
- #include "VmsUtilsF.h"
- #include "FrmMainF.h"
- #include "MainCommF.h"
- #include "FrmOptionF.h"
- #include "FrmSysLogF.h"
- #include "FrmCommLogF.h"
- #include "FrmControllerInfoF.h"
- #include "FrmNetworkF.h"
- #include "LogThreadF.h"
- #include "DbmThreadF.h"
- #include "DbmReadThreadF.h"
- #include "JobThreadF.h"
- #include "DMAdoDbF.h"
- #include "PacketHandllingF.h"
- #include "ClientSessionManagerF.h"
- //---------------------------------------------------------------------------
- #include "CDSProcessF.h"
- #include "CDSCtlrF.h"
- #include "CDSImageF.h"
- #include "CDSFormF.h"
- #include "CDSIfscF.h"
- #include "CDSFontF.h"
- #include "CDSColorF.h"
- #include "CDSAtmpF.h"
- #include "CDSParkF.h"
- #include "CDSManagerF.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "IdAntiFreeze"
- #pragma link "IdAntiFreezeBase"
- #pragma link "IdBaseComponent"
- #pragma link "IdComponent"
- #pragma link "IdUDPBase"
- #pragma link "IdUDPServer"
- #pragma resource "*.dfm"
- TItsMap<int, TItsThread*> G_Threads;
- typedef std::map<int, TItsThread*>::iterator thrIterator;
- TVmsCommMain *VmsCommMain;
- //---------------------------------------------------------------------------
- __fastcall TVmsCommMain::TVmsCommMain(TComponent* Owner)
- : TForm(Owner)
- {
- Application->OnException = OnAppException;
- ::CoInitialize(NULL);
- FServerRun = false;
- g_AppCfg.bAppLoad = false;
- g_AppCfg.bAppClose = false;
- Caption = " " + g_AppCfg.sTitle + " - " + Now().FormatString("yyyy-MM-dd hh:nn:ss");
- pnlTraf->Caption = "-";
- ClientSessionManager = new TClientSessionManager();
- CDSProcessManager = new TCDSProcessManager();
- CDSCtlrManager = new TCDSCtlrManager();
- CDSFormManager = new TCDSFormManager();
- CDSImageManager = new TCDSImageManager();
- CDSIfscManager = new TCDSIfscManager();
- CDSFontManager = new TCDSFontManager();
- CDSAtmpManager = new TCDSAtmpManager();
- CDSParkManager = new TCDSParkManager();
- CDSManager = new TCDSManager();
- #if 0
- //VMS 소통정보를 가공해햐 하는 경우
- CDSVmsIfscTrafManager = new TCDSVmsIfscTrafManager();
- #else
- CDSVmsIfscTrafManager = NULL;
- #endif
- FCurrMin = StrToInt(Now().FormatString("nn"));;
- FCur1MinComm = FCurrMin;
- FCur1MinRun = FCurrMin;
- FCur5Min = FCurrMin;
- FCurrHour = -1;
- FCurrSec = -1;
- FTimeSyncDay = -1;
- FTimeSyncMin = -1;
- FUnitSttsHsMin = -1;
- FCtlrSttsHsMin = -1;
- FCtlrSttsReqMin= -1;
- FFirstRunning = true;
- FOneMinCycle = false;
- m_dtProgBoot = Now();
- m_dtChkDbAlive = Now();
- FrmCommLog = new TFrmCommLog(Application);
- FrmNetwork = new TFrmNetwork(Application);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnAppException(TObject *Sender, Exception *exception)
- {
- AnsiString sClassName = (NULL != Sender) ? AnsiString(Sender->ClassName()) : AnsiString("Unknown_Class");
- AnsiString sErrCls = (NULL != exception) ? AnsiString(exception->ClassName()) : AnsiString("Unknown_Error");
- AnsiString sErrMsg = (NULL != exception) ? AnsiString(exception->Message) : AnsiString("Unknown_Error");
- if (g_AppCfg.bAppClose)
- {
- LOGERROR("Program Close Exception Terminated. %s.%s.%s", sClassName.c_str(), sErrCls.c_str(), sErrMsg.c_str());
- }
- else
- {
- LOGERROR("Program Exception Terminated. %s.%s.%s", sClassName.c_str(), sErrCls.c_str(), sErrMsg.c_str());
- }
- Close();
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::FormCreate(TObject *Sender)
- {
- Application->ShowMainForm = false;
- try {
- Application->Icon->LoadFromResourceName(((unsigned int)HInstance), "MAINICON");
- } catch(...) { ShowMessage("LoadFromResourceName failed"); }
- g_AppCfg.lMainWinHandle = (long)Handle;
- FrmSysLog = new TFrmSysLog(pnlLog);
- FrmSysLog->Parent = pnlLog;
- FrmSysLog->Show();
- FrmControllerInfo = new TFrmControllerInfo(pnlController);
- FrmControllerInfo->Parent = pnlController;
- FrmControllerInfo->Show();
- char szLogMsg[MAX_LOG_BUFFER];
- if (!g_logQ.Create("gmvmsLog", MAX_LOGQ_BUFF))
- {
- sprintf(szLogMsg, "Log Q Create failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- Close();
- Close();
- }
- if (!g_dbmQ.Create("gmvmsDbm", MAX_DBMQ_BUFF))
- {
- sprintf(szLogMsg, "Dbm Q Create failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- Close();
- Close();
- }
- if (!g_dbmReadQ.Create("gmvmsReadDbm", MAX_DBMQ_BUFF))
- {
- sprintf(szLogMsg, "Dbm Read Q Create failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- Close();
- Close();
- }
- if (!g_jobQ.Create("gmvmsJob", MAX_JOBQ_BUFF))
- {
- sprintf(szLogMsg, "Job Q Create failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- Close();
- Close();
- }
- Application->ShowMainForm = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::FormShow(TObject *Sender)
- {
- CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
- Refresh();
- tmrAppState->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::FormCloseQuery(TObject *Sender, bool &CanClose)
- {
- if (!g_AppCfg.bAppClose)
- {
- String strMsg;
- 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!!!";
- //if (Application->MessageBox(strMsg.c_str(), L"Confirm program exit", MB_YESNO|MB_ICONQUESTION) == IDYES)
- {
- FrmSysLog->chkLogPause->Checked = true;
- FServerRun = false;
- g_AppCfg.bAppClose = true;
- }
- CanClose = false;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::FormClose(TObject *Sender, TCloseAction &Action)
- {
- CommClose();
- ::CoUninitialize();
- Action = caFree;
- VmsCommMain = NULL;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::CommClose()
- {
- try
- {
- g_AppCfg.bAppClose = true;
- APP_WriteConfigInfo("LOG", "LOGDAY", Now().FormatString("dd"), g_AppCfg.sConfigFile);
- if (IdUDPCenterServer->Active == true)
- {
- IdUDPCenterServer->Active = false;
- for (int ii = 0; ii < IdUDPCenterServer->Bindings->Count; ii++)
- {
- IdUDPCenterServer->Bindings->Items[ii]->Free();
- }
- }
- #if 0
- if (FrmCommLog) FrmCommLog->Close();
- if (FrmNetwork)
- {
- FrmNetwork->Stop();
- FrmNetwork->Close();
- }
- #endif
- }
- catch(Exception &e)
- {
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::AbnormalTerminate(char* AMsg)
- {
- for (int ii = 0; ii < 5; ii++)
- {
- ITSLog->LogWrite(NULL, eLOG_ERROR, AMsg);
- FrmSysLog->reMsg->Lines->Add(Now().FormatString("hh:nn:ss") + String(AMsg));
- Refresh();
- Sleep(1000);
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TVmsCommMain::InitApplication()
- {
- int nResult;
- String sTitle, sMsg;
- char szLogMsg[MAX_LOG_BUFFER];
- Application->ProcessMessages();
- if (JobThreadStart() == false)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "Job Thread Create failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> Program initialize start..."); // Q 생성후 메시지 출력함
- DWORD dwTick = GetTickCount();
- TDMAdoDb *FDb = new TDMAdoDb(NULL);
- try
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> Database connect...");
- if (!FDb->Connect(g_AppCfg.db.sConnectStr))
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> Database connect failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> Database connect...END, %u ms.", GetTickCount()-dwTick);
- if (CDSProcessManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> Process Information initialize...");
- if (CDSProcessManager->LoadUnitInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> Process Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> Process Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSCtlrManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> Controller Information initialize...");
- if (CDSCtlrManager->LoadCtlrInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> Controller Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> Controller Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSFontManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS Font Information initialize...");
- if (CDSFontManager->LoadFontInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS Font Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS Font Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSIfscManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS Ifsc Information initialize...");
- if (CDSIfscManager->LoadVmsIfscInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS Ifsc Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS Ifsc Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSImageManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS Image Information initialize...");
- if (CDSImageManager->LoadVmsSymbolInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS Image Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS Image Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSAtmpManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS ATMP Information initialize...");
- if (CDSAtmpManager->LoadAtmpInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS ATMP Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS ATMP Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSFormManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS Form Information initialize...");
- if (CDSFormManager->LoadVmsFormInfo(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS Form Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS Form Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS DSPL PRST Information initialize...");
- if (CDSManager->InitVmsDsplPrst(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN VMS DSPL PRST Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS DSPL PRST Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- if (CDSVmsIfscTrafManager)
- {
- dwTick = GetTickCount();
- MINFO("MAIN===================> VMS IFSC TRAF Information initialize...");
- if (CDSVmsIfscTrafManager->InitVmsIfscTraffic(FDb->GetConnection()) < 0)
- {
- memset(szLogMsg, 0x00, sizeof(szLogMsg));
- sprintf(szLogMsg, "MAIN===================> VMS IFSC TRAF Information initialize failed. Program abnormal terminate.");
- AbnormalTerminate(szLogMsg);
- return false;
- }
- MINFO("MAIN===================> VMS IFSC TRAF Information initialize...END, %u ms.", GetTickCount()-dwTick);
- }
- }
- __finally
- {
- if (FDb)
- {
- FDb->Close();
- }
- SAFE_DELETE(FDb);
- }
- ClientSessionManager->Init(CDSCtlrManager->FLists.Size()*2);
- FrmControllerInfo->UpdateCtlrList();
- MINFO("MAIN===================> Center communication initialize...");
- TCDSProcess *pPrcs = CDSProcessManager->FLists.Find(g_AppCfg.sSystemId);
- if (!pPrcs)
- {
- sMsg.printf(L"MAIN===================> Center process information not found: %s, error %d", g_AppCfg.sSystemId.c_str(), nResult);
- MERROR(AnsiString(sMsg).c_str());
- return false;
- }
- g_AppCfg.comm.nCenterPort = pPrcs->PRGM_PORT.ToIntDef(g_AppCfg.comm.nCenterPort); // 디비에 설정된 포트를 사용
- //통신초기화를 최초 수행한 후 디비읽어서 처리
- nResult = CComm_Initialize((long)VmsCommMain->Handle, g_AppCfg.sSystemId, "VMS", g_AppCfg.comm.nCenterPort, g_AppCfg.sLogDay);
- if (VERR_NONE != nResult)
- {
- sMsg.printf(L"MAIN===================> Center communication initialize failed: error %d", nResult);
- MERROR(AnsiString(sMsg).c_str());
- return false;
- }
- FOR_STL(TCDSProcess*, pObj, CDSProcessManager->FLists)
- {
- if (pObj->DEL_YN == "Y") continue;
- if (g_AppCfg.sSystemId == pObj->SYST_ID)
- {
- //자기자신은 목록에 추가하지 않는다...
- continue;
- }
- if (CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, pObj->PRGM_PORT) >= 0)
- {
- if ("UOT" == pObj->SYST_TYPE)
- {
- int nPort = pObj->PRGM_PORT.ToIntDef(0);
- CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+1)); /* VMS 운영단말 */
- #if 0
- CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+2)); /* CCTV 운영단말 */
- CComm_AddProcess(pObj->SYST_ID, pObj->SYST_TYPE, pObj->SYST_IP_1, AnsiString(nPort+3)); /* VDS 운영단말 */
- #endif
- }
- }
- }
- if (VERR_NONE != CComm_Open())
- {
- sMsg.printf(L"MAIN===================> Center communication open failed: error %d", nResult);
- MERROR(AnsiString(sMsg).c_str());
- return false;
- }
- g_SysInfo->RunSts = state_normal;
- g_SysInfo->ComSts = state_error;
- g_SysInfo->DbmSts = state_normal;
- FServerRun = true;
- m_dtChkDbAlive = Now(); // 데이터베이스 연결 체크 타이머
- m_dtChkVmsJob = Now(); // VMS 작업 및 주기작업
- m_dtProvider = Now()-1; // 정보제공 타이머
- m_dtTrafProvider = Now()-1;
- m_dtChkEveh = Now()-1;
- m_dtTimeOut = Now();
- COMM_MakeBasisTime(m_tTimer, g_AppCfg.nTrafficCycleTime, g_AppCfg.nTrafficBasisTime);
- //APP_PostDbThreadWriteMessage(dbm_save_unit_stts);
- APP_PostDbThreadWriteMessage(dbm_dnld_form_init);
- //통신서버 시작
- Sleep(500);
- tbConnectClick(this);
- MINFO("MAIN===================> Program initialize success...[Completed]");
- return true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tmrAppStateTimer(TObject *Sender)
- {
- tmrAppState->Enabled = false;
- plTime->Caption = Now().FormatString("yyyy-MM-dd hh:nn:ss");
- if (!g_AppCfg.bAppLoad)
- {
- if (!InitApplication())
- {
- g_AppCfg.bAppClose = true;
- Close();
- return;
- }
- // 초기화작업완료
- CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
- g_AppCfg.bAppLoad = true; // 프로그램이 로딩되었음을 확인
- tmrAppState->Interval = 900; // 프로그램 상태점검주기=1초
- tmrAppState->Enabled = true;
- // 타임아웃 타이머 초기정보 설정
- tmrProvide->Enabled = false;
- int nProvideRemain = SecondOfTheDay(Now());
- nProvideRemain %= g_AppCfg.nTrafficCycleTime;
- nProvideRemain = g_AppCfg.nTrafficCycleTime - nProvideRemain + g_AppCfg.nTrafficBasisTime;
- tmrProvide->Interval = nProvideRemain * 1000;
- tmrProvide->Enabled = true;
- m_dtTimeOut = Now();
- m_dtProgBoot = Now();
- return;
- }
- if (g_AppCfg.bAppClose)
- {
- // 응용프로그램 종료
- TerminateApplication();
- JobThreadStop();
- Close();
- return;
- }
- g_AppCfg.lMainWinHandle = (long)Handle;
- plRemain->Caption = String((tmrProvide->Interval / 1000) - COMM_TimeDiff(m_dtTimeOut));
- UpdateProcessStatePanel();
- FCurrDay = StrToInt(Now().FormatString("dd"));
- FCurrHour = StrToInt(Now().FormatString("hh"));
- FCurrMin = StrToInt(Now().FormatString("nn"));
- FCurrSec = StrToInt(Now().FormatString("ss"));
- if (!(FCurrSec % 5))
- {
- CheckCommState(); //통신상태정보 체크
- }
- // 0시 3분에 시각 동기화 명령을 전송하자
- if (FCurrDay != FTimeSyncDay
- && FCurrMin != FTimeSyncMin
- && FCurrMin == 3
- && FCurrHour == 0)
- {
- FTimeSyncDay = FCurrDay;
- FTimeSyncMin = FCurrMin;
- #if 0
- SendTimeSync();
- #endif
- }
- // 프로세스 상태정보 이력 DB 입력
- if (FCurrSec > 1 && (FUnitSttsHsMin != FCurrMin))
- {
- //매 1분마다 상태정보 업데이트 하고 상태정보 업데이트 하는 곳에서 5분주기로 이력정보를 저장한다.
- FUnitSttsHsMin = FCurrMin;
- MINFO("MAIN===================> Save UNIT STTS");
- APP_PostDbThreadWriteMessage(dbm_save_unit_stts);
- }
- // 제어기 상태정보 요청
- if (FCurrSec > 20 && (FCtlrSttsReqMin != FCurrMin))
- {
- //매 1분마다 상태정보 요청한다.
- FCtlrSttsReqMin = FCurrMin;
- MINFO("MAIN===================> Req CTLR STTS");
- g_jobQ.PushBlocking(eVmsStatusReqAll);
- }
- // 제어기 상태정보 이력 DB 입력
- if (FCurrSec > 30 && (FCtlrSttsHsMin != FCurrMin))
- {
- //매 1분마다 상태정보 업데이트 하고 상태정보 업데이트 하는 곳에서 5분주기로 이력정보를 저장한다.
- FCtlrSttsHsMin = FCurrMin;
- MINFO("MAIN===================> Save CTLR STTS");
- APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts_all);
- }
- if (COMM_TimeDiff(m_dtChkVmsJob) > 60)
- {
- //VMS 주기적인 작업을 데이터베이스에서 조회
- MINFO("MAIN===================> Check VMS Job Schedule");
- APP_PostDbThreadReadMessage(dbm_load_onoff_time);
- //APP_PostDbThreadWriteMessage(dbm_load_download_job);
- m_dtChkVmsJob = Now();
- }
- if (COMM_TimeDiff(m_dtChkDbAlive) > 120)
- {
- //서버가 연결상태이고 DB 작업이 2분이상 경과된 경우 디비 연결상태를 체크한다.
- MINFO("MAIN===================> Check Database Alive");
- APP_PostDbThreadReadMessage(dbm_check_db_alive);
- m_dtChkDbAlive = Now();
- }
- if (FFirstRunning && (COMM_TimeDiff(m_dtProgBoot) > 60)) {
- // 최초 프로그램 기동후 60 초 이내에 메시지 표출이 안된 경우 최초 메시지 다운로드한다.
- SendVmsTrafficProvide(3);
- }
- if (COMM_TimeDiff(m_dtChkEveh) > g_AppCfg.EVehicleCheckSeconds) {
- //MINFO("*** FCheckEVehicleAlarm......: %s", AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str());
- APP_PostDbThreadReadMessage(dbm_check_evehicle_alarm);
- m_dtChkEveh = Now(); // 긴급차량우선신호 알람 체크 타이머 초기화
- }
- CheckProvideTimeout();
- JobThreadCheck();
- #if 0
- g_logQ.PushBlocking(Q_TICK);
- g_dbmQ.PushBlocking(Q_TICK);
- g_dbmReadQ.PushBlocking(Q_TICK);
- #endif
- g_jobQ.PushBlocking(Q_TICK); //접속한 클라이언트 작업을 위해 스레드를 깨운다.
- tmrAppState->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::AutoClose()
- {
- g_AppCfg.bAppClose = true;
- //Close();
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tbConnectClick(TObject *Sender)
- {
- g_AppCfg.bThrExit = false;
- //FrmNetwork->Show();
- if (FrmNetwork->Start())
- {
- FServerRun = true;
- tbConnect->Enabled = false;
- tbDisconnect->Enabled = true;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tbDisconnectClick(TObject *Sender)
- {
- FServerRun = false;
- g_jobQ.PushBlocking(eTcpCloseAll);
- FrmNetwork->Stop();
- tbDisconnect->Enabled = false;
- tbConnect->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tbOptionsClick(TObject *Sender)
- {
- FrmOption = new TFrmOption(this);
- FrmOption->Left = VmsCommMain->Left + 80;
- FrmOption->Top = VmsCommMain->Top + 80;
- FrmOption->ShowModal();
- if (FrmOption->FUpdate)
- {
- try
- {
- ITSLog->FLogCfg = g_LogCfg;
- CtlrItr it;
- for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
- {
- TCDSCtlr *pObj = (TCDSCtlr*)it->second;
- if (!pObj->FDispLog)
- {
- pObj->FCLog->FLogCfg = g_LogCfg;
- pObj->FSLog->FLogCfg = g_LogCfg;
- }
- }
- }
- catch(Exception &e)
- {
- }
- }
- delete FrmOption;
- FrmOption = NULL;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::CheckCommState()
- {
- //g_SysInfo->RunSts = (FServerRun && DMManager->TcpServer->Active) ? state_normal : state_error;
- g_SysInfo->RunSts = (FServerRun) ? state_normal : state_error;
- if (g_SysInfo->RunSts == state_normal)
- {
- if (CDSCtlrManager->Total == CDSCtlrManager->Normal) g_SysInfo->ComSts = state_normal;
- else g_SysInfo->ComSts = state_error;
- }
- else
- {
- g_SysInfo->ComSts = state_error;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::UpdateProcessStatePanel()
- {
- plStateAction->Color = (g_SysInfo->RunSts == state_normal) ? clGreen : clRed;
- plStateComm->Color = (g_SysInfo->ComSts == state_normal) ? clGreen : clRed;
- plStateDb->Color = (g_SysInfo->DbmSts == state_normal) ? clGreen : clRed;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnWMDbThreadMessage(TMessage &Msg)
- {
- int nCommand = (int)Msg.WParam;
- int nResult = (int)Msg.LParam;
- ReplyMessage(0);
- if (nCommand == dbm_job_start)
- {
- tmrDbCheck->Enabled = false;
- tmrDbCheck->Enabled = true;
- return;
- }
- tmrDbCheck->Enabled = false;
- switch(nCommand)
- {
- case dbm_status:
- g_SysInfo->DbmSts = nResult >= 0 ? state_normal : state_error;
- break;
- case dbm_dnld_form_init:
- MINFO("MAIN===================> VMS Message init start event");
- MakeVmsProvideForm();
- break;
- case dbm_dnld_form_cycle:
- case dbm_dnld_form_mode:
- case dbm_dnld_form_eveh:
- MINFO("MAIN===================> VMS Message create start event");
- MakeVmsProvideForm();
- APP_PostDbThreadWriteMessage(dbm_save_form_download);
- break;
- case dbm_save_form_download:
- MINFO("MAIN===================> VMS Message download start event");
- //VMS 제어기에 VMS폼 스케쥴을 다운로드 하도록 이벤트 전송
- g_jobQ.PushBlocking(eVmsFormDownload);
- //클라이언트로 VMS폼 스케쥴이 저장되었다는 이벤트를 전송
- CDSManager->SendVmsDownloadForm();
- CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
- break;
- case dbm_initialize:
- break;
- case dbm_check_evehicle_alarm:
- if (nResult > 0) {
- MINFO("MAIN===================> VMS EVEHICLE ALARM %d EA.", nResult);
- SendVmsTrafficProvide(2);
- }
- break;
- }
- m_dtChkDbAlive = Now(); // 데이터베이스 작업 성공/실패 여부와 상관없이 체크타이머 초기화
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnWMUserMessage(TMessage &Msg)
- {
- ReplyMessage(0);
- if ((int)Msg.WParam == WM_WINDOW_RESTORE)
- {
- Application->Restore();
- Application->BringToFront();
- return;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnTcpThreadMessage(TMessage &Msg)
- {
- TCDSCtlr *pObj = (TCDSCtlr*)Msg.LParam;
- CTLR_STTS stts;
- switch(Msg.WParam)
- {
- case WM_TCP_SERVER_STTS: // 클라이언트의 연결 또는 연결종료시 수신 메시지
- try
- {
- if (pObj->Server.commState == comm_open)
- {
- pObj->dwConnectCnt++;
- MINFO("MAIN===================> VMS Connect Event: %s", pObj->CTLR_NMBR.c_str());
- }
- else
- {
- /////////////////////////
- pObj->EVEHICLE->IsOcurr = false;
- pObj->EVEHICLE->IsEnd = false;
- pObj->EVEHICLE->dtOcurr = Now()-1;
- pObj->EVEHICLE->IsDownload = false;
- pObj->EVEHICLE->dtDownload = Now()-1;
- pObj->EVEHICLE->IsEVechFirst = false;
- MINFO("MAIN===================> VMS Closed Event: %s", pObj->CTLR_NMBR.c_str());
- }
- } catch(Exception &e) {}
- FrmControllerInfo->UpdateServerState((int)pObj);
- stts.Type = 1;
- stts.ObjPtr = (void*)pObj;
- APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts, sizeof(stts), &stts);
- break;
- case WM_CTLR_STATE_STTS: // 연결된 제어기로 부터 상태정보를 수신할시
- //try
- //{
- // MINFO("MAIN VMS State Event: %s", pObj->CTLR_NMBR.c_str());
- //} catch(Exception &e) {}
- FrmControllerInfo->UpdateClientState((int)pObj);
- stts.Type = 0;
- stts.ObjPtr = (void*)pObj;
- APP_PostDbThreadWriteMessage(dbm_save_ctlr_stts, sizeof(stts), &stts);
- break;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnPanelRefreshMessage(TMessage &Msg)
- {
- TColor color = (TColor)Msg.LParam;
- switch(Msg.WParam)
- {
- case 0: plStateLog->Color = color; plStateLog->Refresh(); break;
- case 1: plStateDbmRead->Color = color; plStateDbmRead->Refresh(); break;
- case 2: plStateDbm->Color = color; plStateDbm->Refresh(); break;
- case 3: plStateJob->Color = color; plStateJob->Refresh(); break;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tmrProvideTimer(TObject *Sender)
- {
- SendVmsTrafficProvide(1);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::ResetProviderTimer()
- {
- tmrProvide->Enabled = false;
- tmrProvide->Interval = g_AppCfg.nTrafficCycleTime * 1000;
- m_dtTimeOut = Now();
- tmrProvide->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::OnUdpDataRecvMessage(TMessage &Msg)
- {
- int nResult;
- IPC_MSG_DATA *RcvData = (IPC_MSG_DATA*)Msg.LParam;
- INT_SENDER *Sender = &RcvData->Sender;
- INT_PACKET *Pkt = &RcvData->Pkt;
- INT_HEAD *head = &Pkt->head;
- INT_DATA *data = &Pkt->data;
- char *pData = &Pkt->data.Data[0];
- BYTE OpCode = head->OpCode;
- MINFO("MAIN===================> Center Msg: %s.%d, OpCode: %02X, From: %02X, To: %02X", CComm_ulong2ip(Sender->IP), Sender->Port, OpCode, head->SendId, head->RecvId);
- switch(OpCode)
- {
- case INT_OP_TRAFFIC_CHANGE:
- MINFO("MAIN===================> INT_OP_TRAFFIC_CHANGE");
- CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
- SendVmsTrafficProvide(0);
- break;
- case INT_OP_VMS_POWER_CTL: //전광판 On/Off
- {
- INT_VMS_POWER_CTL_REQ *pReq = (INT_VMS_POWER_CTL_REQ*)pData;
- 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);
- TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
- if (!pCDSCtlr) break;
- if (!pCDSCtlr->FSession) break;
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsStatusControl;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- pMsg->Buff[0] = 0x01;
- pMsg->Buff[1] = (BYTE)pReq->Command;
- pMsg->Len = 2;
- g_jobQ.PushBlocking((DWORD)pMsg);
- }
- break;
- case INT_OP_VMS_RESET:
- {
- INT_VMS_RESET_REQ *pReq = (INT_VMS_RESET_REQ*)pData;
- MINFO("MAIN===================> INT_OP_VMS_RESET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
- TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
- if (!pCDSCtlr) break;
- if (!pCDSCtlr->FSession) break;
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsStatusControl;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- pMsg->Buff[0] = 0x02;
- pMsg->Len = 1;
- g_jobQ.PushBlocking((DWORD)pMsg);
- }
- break;
- case INT_OP_VMS_LUMINANCE_CTL: //휘도설정
- {
- INT_VMS_LUMINANCE_REQ *pReq = (INT_VMS_LUMINANCE_REQ*)pData;
- 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);
- TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
- if (!pCDSCtlr) break;
- if (!pCDSCtlr->FSession) break;
- BYTE cmdVal = 0x00;
- switch(pReq->BrghMode)
- {
- case 0x00: //주간
- cmdVal = pReq->BrghWeekStep;
- break;
- case 0x01: //야간
- cmdVal = pReq->BrghNghtStep;
- break;
- case 0x02: //자동
- cmdVal = 0x00;
- break;
- default: return;
- }
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsStatusControl;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- pMsg->Buff[0] = 0x06;
- pMsg->Buff[1] = (BYTE)pReq->BrghMode;
- pMsg->Buff[2] = cmdVal;
- pMsg->Len = 3;
- g_jobQ.PushBlocking((DWORD)pMsg);
- }
- break;
- case INT_OP_VMS_PARA_SET: //환경설정 정보 설정
- {
- INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
- MINFO("MAIN===================> INT_OP_VMS_PARA_SET: %.*s %d, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->VMS_CTLR_NMBR, pReq->OperId);
- TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR));
- if (!pCDSCtlr) break;
- if (!pCDSCtlr->FSession) break;
- //도형식에는 설정정보가 없고 문자식에만 설정하는 프로토콜이 있음
- //현재 적용하지 않았음.........
- //적용할 경우 VMS유형(AObj->PROTOCOL_VER == 1) 확인해서 처리해야함
- //함체 PAN/HEATER 온도 설정
- //Download Parameter
- #if 0
- SIGNT_CONFIG_SET set;
- set.VMS_CTLR_NMBR = pCDSCtlr->CTLR_NMBR.ToIntDef(0);
- set.FanRunTmpr = pReq->FanRunTmpr;
- set.HetrRunTmpr = pReq->HetrRunTmpr;
- memcpy(set.PanlOnTime, pReq->DispStrTm, 4);
- memcpy(set.PanlOffTime, pReq->DispEndTm, 4);
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsConfigSet;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- memcpy(pMsg->Buff, (char*)&set, sizeof(SIGNT_CONFIG_SET));
- g_jobQ.PushBlocking((DWORD)pMsg);
- #endif
- }
- break;
- case INT_OP_VMS_PARAM_REQ:
- {
- INT_VMS_PARAM_REQ *pReq = (INT_VMS_PARAM_REQ*)pData;
- MINFO("MAIN===================> INT_OP_VMS_PARAM_REQ: %d", pReq->Count);
- for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
- {
- TCDSCtlr *pCDSCtlr = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
- if (!pCDSCtlr) continue;
- if (!pCDSCtlr->FSession) continue;
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsParamReq;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- g_jobQ.PushBlocking((DWORD)pMsg);
- }
- }
- break;
- case INT_OP_VMS_IMMEDIATE_SCN_DNLD:
- {
- INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ *pReq = (INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ*)pData;
- MINFO("MAIN===================> INT_OP_VMS_IMMEDIATE_SCN_DNLD: %.*s, %s", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId);
- for (int ii = 0; ii < pReq->Count && ii < INT_MAX_IMDT_SCN_DNLD_MAX; ii++)
- {
- TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->VMS_CTLR_NMBR[ii]));
- if (!pObj) continue;
- if (!pObj->FSession) continue;
- CDSCtlrManager->InitProvide(pObj);
- #if 0
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsScenarioDownload;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- g_jobQ.PushBlocking((DWORD)pMsg);
- #endif
- }
- APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
- //APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
- }
- break;
- case INT_OP_VMS_MODE:
- {
- INT_VMS_MODE_REQ *pReq = (INT_VMS_MODE_REQ*)pData;
- MINFO("MAIN===================> INT_OP_VMS_MODE: %.*s %s, %s, %d EA.", INT_VMS_MAX_DATETIME, pReq->CmdTime, pReq->OperId, pReq->Count);
- //수신한 VMS에 대하여 다운로드 플래그 활성화 시킴
- for(int ii = 0; ii < pReq->Count && ii < INT_VMS_MAX_MODE; ii++)
- {
- TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(AnsiString(pReq->Unit[ii].VMS_CTLR_NMBR));
- if (!pObj) continue;
- if (pObj->Server.useFlag != use_enable) continue;
- if (pObj->CTRLMODE->Control == pReq->Unit[ii].Mode)
- pObj->FModeChange = false;
- else
- pObj->FModeChange = true;
- pObj->CTRLMODE->Control = pReq->Unit[ii].Mode;
- pObj->DSTATE.OprMode = pObj->CTRLMODE->Control;
- pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
- if (pObj->CTRLMODE->Control == 'A') pObj->OPER_MODE = "A";
- else if (pObj->CTRLMODE->Control == 'B') pObj->OPER_MODE = "B";
- else pObj->OPER_MODE = "F";
- //pObj->FProvide = true;
- CDSCtlrManager->InitProvide(pObj);
- }
- FrmControllerInfo->UpdateCtlrList();
- APP_PostDbThreadWriteMessage(dbm_dnld_form_mode);
- }
- break;
- case INT_OP_VMS_STATE_REQ:
- MINFO("MAIN===================> INT_OP_VMS_STATE_REQ");
- CDSCtlrManager->SendCtlrSttsAll();
- break;
- case INT_OP_VMS_IMAGE_SYMBOL:
- MINFO("MAIN===================> INT_OP_VMS_IMAGE_SYMBOL");
- APP_PostDbThreadReadMessage(dbm_master_symbol_image);
- break;
- case INT_OP_VMS_IMAGE_TRAFFIC:
- MINFO("MAIN===================> INT_OP_VMS_IMAGE_TRAFFIC");
- APP_PostDbThreadReadMessage(dbm_master_symbol_traffic);
- break;
- case INT_OP_VMS_FORM_UPDATE:
- MINFO("MAIN===================> INT_OP_VMS_FORM_UPDATE");
- APP_PostDbThreadReadMessage(dbm_master_form);
- break;
- case INT_OP_VMS_IFSC_UPDATE:
- MINFO("MAIN===================> INT_OP_VMS_IFSC_UPDATE");
- APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
- break;
- default:
- MINFO("MAIN===================> INT_UNKNOWN: %02X", OpCode);
- break;
- }
- }
- //---------------------------------------------------------------------------
- #if 0
- void __fastcall TVmsCommMain::ClientResponse(int Flag, REQ_INFO_STRUCT *pReq, int error, void *pData)
- {
- #ifdef CENTERCOMM
- BYTE ErrCode;
- int sResult;
- switch(error)
- {
- case SYS_ERR_NONE: break;
- case SYS_ERR_OTHER: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_INTERNAL: ErrCode = INT_ERROR_SYSTEM; break;
- case SYS_ERR_MEMORY: ErrCode = INT_ERROR_SYSTEM; break;
- case SYS_ERR_DATABASE: ErrCode = INT_ERROR_SYSTEM; break;
- case SYS_ERR_RESET: ErrCode = INT_ERROR_SYSTEM; break;
- case SYS_ERR_START: ErrCode = INT_ERROR_SYSTEM; break;
- case SYS_ERR_OFFLINE: ErrCode = INT_ERROR_OFFLINE; break;
- case SYS_ERR_NO_RES: ErrCode = INT_ERROR_NO_RESPONSE; break;
- case SYS_ERR_ACCESS: ErrCode = INT_ERROR_PROCESS; break;
- case SYS_ERR_INVALID: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_UNKNOWN: ErrCode = INT_ERROR_UNKNOWN_CODE; break;
- case SYS_ERR_WRITE_LENGTH: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_PACKET_SIZE_LARGE: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_INVALID_TAG: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_CRC: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_LENGTH: ErrCode = INT_ERROR_LENGTH; break;
- case SYS_ERR_ADDRESS: ErrCode = INT_ERROR_ADDRESS; break;
- case SYS_ERR_HEADER_OPTIONS: ErrCode = INT_ERROR_HEADER; break;
- case SYS_ERR_UNKNOWN_COMMAND: ErrCode = INT_ERROR_UNKNOWN_OPCODE; break;
- case SYS_ERR_RECEIVE_TIMEOUT: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_DATA_SIZE: ErrCode = INT_ERROR_DISCORD; break;
- case SYS_ERR_MISMATCH: ErrCode = INT_ERROR_OTHER; break;
- case SYS_ERR_INVALID_PARA: ErrCode = INT_ERROR_INVALID_DATA; break;
- case SYS_ERR_MOVEMENT: ErrCode = INT_ERROR_MOVEMENT; break;
- case SYS_ERR_UNAUTHORIZED: ErrCode = INT_ERROR_UNAUTHORIZED; break;
- default: ErrCode = INT_ERROR_OTHER; break;
- }
- if (Flag == SEND_ACK)
- {
- INT_ACK_RES Ack;
- memset(&Ack, 0x00, sizeof(Ack));
- Ack.OPCode.Type = INT_TYPE(pReq->OpCode);
- Ack.OPCode.Kind = INT_KIND(pReq->OpCode);
- Ack.MsgSeq = pReq->MsgSeq;
- if ((sResult = AckRes(&Ack, pReq->ProcessID)) != UDP_ERR_NONE)
- {
- MERROR("MAIN===================> AckRes fail %d", sResult);
- }
- }
- else
- if (Flag == SEND_NACK)
- {
- INT_NACK_RES Nack;
- memset(&Nack, 0x00, sizeof(Nack));
- Nack.OPCode.Type = INT_TYPE(pReq->OpCode);
- Nack.OPCode.Kind = INT_KIND(pReq->OpCode);
- Nack.MsgSeq = pReq->MsgSeq;
- Nack.ErrCode = ErrCode;
- if ((sResult = NackRes(&Nack, pReq->ProcessID)) != UDP_ERR_NONE)
- {
- MERROR("MAIN===================> NackRes fail %d", sResult);
- }
- }
- #endif
- }
- //---------------------------------------------------------------------------
- #endif
- bool __fastcall TVmsCommMain::CheckBasisTime(char *p, int Cycle, int Basis)
- {
- char cTime[15];
- COMM_MakeBasisTime(cTime, Cycle, Basis);
- if (memcmp(p, cTime, 14) != 0)
- {
- memcpy(p, cTime, 14);
- return true;
- }
- return false;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::CheckProvideTimeout()
- {
- VMS_PROVIDE_RESULE ProvideSave;
- VMS_PROVIDE_RESULE DownLoadSave;
- memset(&ProvideSave, 0x00, sizeof(ProvideSave));
- memset(&DownLoadSave, 0x00, sizeof(DownLoadSave));
- ProvideSave.Type = provide_form;
- ProvideSave.Count = 0;
- DownLoadSave.Type = provide_download;
- DownLoadSave.Count = 0;
- int nCheckVmsCount = 0;
- CtlrItr it;
- for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
- {
- TCDSCtlr *pObj = (TCDSCtlr*)it->second;
- if (pObj->Server.useFlag != use_enable) continue;
- bool isCtrlMode = COMM_TimeDiff(pObj->CTRLMODE->pTimer) > VMS_PROVIDE_TIMEOUT;
- if ((pObj->DOWNLOAD->SaveFlag == false) &&
- (COMM_TimeDiff(pObj->DOWNLOAD->dTimer) > VMS_DOWNLOAD_TIMEOUT))
- {
- DownLoadSave.pObj[DownLoadSave.Count++] = (void *)pObj;
- pObj->DOWNLOAD->SaveFlag = true;
- pObj->DOWNLOAD->dTimer = Now();
- }
- if ((pObj->CTRLMODE->SaveFlag == false) && isCtrlMode)
- {
- nCheckVmsCount++;
- ProvideSave.pObj[ProvideSave.Count++] = (void *)pObj;
- pObj->CTRLMODE->SaveFlag = true;
- pObj->CTRLMODE->pTimer = Now();
- MINFO("MAIN===================> VMS Download Timeout Form VMS NMBR: %s", pObj->CTLR_NMBR.c_str());
- }
- // 패킷크기가 채워졌으면 DB 작업스레드로 전송
- if (ProvideSave.Count >= MAX_VMS_PROVIDE_RESULT)
- {
- MINFO("MAIN===================> VMS Download Timeout Form Save: %d EA.", ProvideSave.Count);
- APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
- ProvideSave.Count = 0;
- }
- if (DownLoadSave.Count >= MAX_VMS_PROVIDE_RESULT)
- {
- MINFO("MAIN===================> VMS Download Timeout Form Data: %d EA.", DownLoadSave.Count);
- APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
- DownLoadSave.Count = 0;
- }
- }
- // 실패작업이 존재하면 DB 작업스레드로 전송
- if (ProvideSave.Count > 0)
- {
- APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(ProvideSave), &ProvideSave);
- }
- if (DownLoadSave.Count > 0)
- {
- MINFO("MAIN===================> VMS Download Timeout Data Save: %d EA.", DownLoadSave.Count);
- APP_PostDbThreadWriteMessage(dbm_provide_result, sizeof(DownLoadSave), &DownLoadSave);
- }
- if (nCheckVmsCount > 0) {
- MINFO("MAIN===================> VMS Download Timeout Form Save: VMS(%d), %d EA.", nCheckVmsCount, ProvideSave.Count);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::SendTimeSync()
- {
- CtlrItr it;
- for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
- {
- TCDSCtlr *pCDSCtlr = (TCDSCtlr*)it->second;
- if (pCDSCtlr->Server.useFlag != use_enable) continue;
- if (pCDSCtlr->FSession)
- {
- IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
- pMsg->Type = eVmsStatusControl;
- pMsg->ObjPtr = (DWORD)pCDSCtlr->FSession;
- pMsg->Buff[0] = 0x04;
- memcpy(&pMsg->Buff[1], AnsiString(Now().FormatString("yyyymmddhhnnss")).c_str(), 14);
- pMsg->Len = 1+14;
- g_jobQ.PushBlocking((DWORD)pMsg);
- // 제어기가 연결되어 있으면 전송
- MINFO("MAIN===================> SendTimeSync command send: %s", pCDSCtlr->CTLR_NMBR.c_str());
- }
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TVmsCommMain::CheckResource(size_t MaxMemory, DWORD MaxHandle, DWORD MaxThread, DWORD MaxGdi)
- {
- bool result;
- HANDLE hProcess;
- PROCESS_MEMORY_COUNTERS pmc;
- size_t uSize;
- DWORD HandleCount, ThreadCount, GdiCount;
- HANDLE hProcessSnap;
- PROCESSENTRY32 pe32;
- DWORD ProcessId;
- result = false;
- uSize = 0;
- HandleCount = 0;
- ThreadCount = 0;
- GdiCount = 0;
- hProcess = GetCurrentProcess();
- if (hProcess != NULL)
- {
- if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
- {
- uSize = pmc.WorkingSetSize/1024;
- if ((MaxMemory != 0) && (uSize > MaxMemory))
- {
- MERROR("MAIN===================> Memory usage exceeds standards!!!...[%d][%d]", MaxMemory, uSize);
- result = true;
- }
- }
- if ( GetProcessHandleCount( hProcess, &HandleCount) )
- {
- if ((MaxHandle != 0) && (HandleCount > MaxHandle))
- {
- MERROR("MAIN===================> Window handle exceed standards!!!...[%d][%d]", MaxHandle, HandleCount);
- result = true;
- }
- }
- ProcessId = GetCurrentProcessId();
- if ((hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )) != INVALID_HANDLE_VALUE)
- {
- pe32.dwSize = sizeof( PROCESSENTRY32 );
- if ( Process32First( hProcessSnap, &pe32 ) )
- {
- do
- {
- if (pe32.th32ProcessID == ProcessId)
- {
- ThreadCount = pe32.cntThreads;
- if ((MaxThread != 0) && (ThreadCount > MaxThread))
- {
- MERROR("MAIN===================> Criteria exceeded thread!!!...[%d][%d]", MaxThread, ThreadCount);
- result = true;
- }
- break;
- }
- } while( Process32Next( hProcessSnap, &pe32 ) );
- }
- CloseHandle( hProcessSnap );
- }
- GdiCount = GetGuiResources( hProcess, GR_GDIOBJECTS);
- if ((MaxGdi != 0) && (GdiCount > MaxGdi))
- {
- MERROR("MAIN===================> GDI Objects exceeding standards!!!...[%d][%d]", MaxGdi, GdiCount);
- result = true;
- }
- CloseHandle( hProcess );
- }
- try
- {
- FMemSize = uSize;
- plMemory->Caption = FormatFloat("##,##0", uSize) ;// + " KB";
- plHandle->Caption = FormatFloat("##,##0", HandleCount);// + " EA";
- plThread->Caption = FormatFloat("##,##0", ThreadCount);// + " EA";
- plGdi->Caption = FormatFloat("##,##0", GdiCount) ;// + " EA";
- #if 0
- MINFO("MAIN===================> Memory: %s, Haldle: %s, Thread: %s, GDI: %s",
- AnsiString(plMemory->Caption).c_str(),
- AnsiString(plHandle->Caption).c_str(),
- AnsiString(plThread->Caption).c_str(),
- AnsiString(plGdi->Caption).c_str()
- );
- #endif
- } catch (Exception &e) {}
- return result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::Panel16DblClick(TObject *Sender)
- {
- CheckResource((g_AppCfg.MaxMemory * 1024), g_AppCfg.MaxHandle, g_AppCfg.MaxThread, g_AppCfg.MaxGdi);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::plStateDbDblClick(TObject *Sender)
- {
- APP_PostDbThreadReadMessage(dbm_master_symbol_image);
- APP_PostDbThreadReadMessage(dbm_master_form);
- APP_PostDbThreadReadMessage(dbm_master_vms_ifsc);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::plStateCommDblClick(TObject *Sender)
- {
- AnsiString VMS_IFSC_ID;
- int SECT_LNGT;
- TItsMap<int, TObjectId*> FLists;
- TItsMap<AnsiString, TVmsIfscGrad*> FGrads;
- VMS_TRAF traf;
- int SPED; // N NUMBER(3) Y 0 속도
- int TRVL_HH; // N NUMBER(6) Y 0 통행 시간
- AnsiString CMTR_GRAD_CD; // N VARCHAR2(7) Y 소통 등급 코드
- if (!CDSVmsIfscTrafManager) return;
- FOR_STL(TCDSVmsIfscTraf*, pObj, CDSVmsIfscTrafManager->FVmsIfscLists)
- {
- int objValid = pObj->IsValid == false ? 0 : 1;
- MINFO("VMS_IFSC_ID: %s, SECT_LNGT: %5d, VALID: %d, Objects: %d, SPED: %3d, TRVL_HH: %4d, GRAD_CD: %s",
- pObj->VMS_IFSC_ID, pObj->SECT_LNGT, objValid, pObj->FLists.Size(), pObj->traf.SPED, pObj->traf.TRVL_HH, pObj->traf.CMTR_GRAD_CD);
- FOR_STL(TVmsIfscGrad*, pGrad, pObj->FGrads)
- {
- int gradValid = pGrad->IsValid == false ? 0 : 1;
- MINFO(" GRAD_CD: %s, VALID: %d, LWSTSPED: %3d, HGHSSPED: %3d", pGrad->CMTR_GRAD_CD, gradValid, pGrad->LWSTSPED, pGrad->HGHSSPED);
- }
- int ii = 1;
- FOR_STL(TObjectId*, pID, pObj->FLists)
- {
- int idValid = pID->IsValid == false ? 0 : 1;
- TCDSIfscTraf* pIfsc = CDSVmsIfscTrafManager->FIfscTrafLists.Find(pID->ID);
- if (pIfsc)
- {
- 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);
- }
- else
- {
- MINFO(" %2d: IFSC_ID: %s, Not Found", ii, pID->ID);
- }
- ii++;
- }
- MINFO("");
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::plStateActionDblClick(TObject *Sender)
- {
- plStateAction->Enabled = false;
- tmrRunProvide->Enabled = false;
- tmrRunProvide->Enabled = true;
- CDSManager->FIsStaticCycle = true; //정주기 정보제공주기 플래그 설정
- CtlrItr it;
- for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
- {
- TCDSCtlr *pObj = (TCDSCtlr*)it->second;
- if (!pObj->FSession) continue;
- CDSCtlrManager->InitProvide(pObj);
- }
- APP_PostDbThreadWriteMessage(dbm_dnld_form_cycle);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tmrRunProvideTimer(TObject *Sender)
- {
- tmrRunProvide->Enabled = false;
- plStateAction->Enabled = true;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TVmsCommMain::JobThreadStart()
- {
- int nThreadCnt = 0;
- if (true)
- {
- LogThread = new TLogThread();
- if (!LogThread) return false;
- LogThread->FPnlState = plStateLog;
- LogThread->FTmrDb = tmrDbCheck;
- LogThread->Name = "LogThread";
- LogThread->Execute();
- G_Threads.Push(nThreadCnt++, LogThread);
- }
- if (true)
- {
- DbmThread = new TDbmThread();
- if (!DbmThread) return false;
- DbmThread->FPnlState = plStateDbm;
- DbmThread->FTmrDb = tmrDbCheck;
- DbmThread->Name = "DbmThread";
- DbmThread->Execute();
- G_Threads.Push(nThreadCnt++, DbmThread);
- }
- if (true)
- {
- DbmReadThread = new TDbmReadThread();
- if (!DbmReadThread) return false;
- DbmReadThread->FPnlState = plStateDbmRead;
- DbmReadThread->FTmrDb = tmrDbCheck;
- DbmReadThread->Name = "DbmReadThread";
- DbmReadThread->Execute();
- G_Threads.Push(nThreadCnt++, DbmReadThread);
- }
- if (true)
- {
- JobThread = new TJobThread();
- if (!JobThread) return false;
- JobThread->FPnlState = plStateJob;
- JobThread->FTmrDb = tmrDbCheck;
- JobThread->Name = "JobThread";
- JobThread->Execute();
- G_Threads.Push(nThreadCnt++, JobThread);
- }
- return true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::JobThreadCheck()
- {
- int nTermCnt = 0;
- for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
- {
- TItsThread *pObj = (TItsThread*)it->second;
- if (pObj->IsTerm())
- {
- pObj->Execute();
- nTermCnt++;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::JobThreadStop()
- {
- g_AppCfg.bThrExit = true;
- g_jobQ.PushBlocking(Q_CLOSE);
- g_dbmQ.PushBlocking(Q_CLOSE);
- g_dbmReadQ.PushBlocking(Q_CLOSE);
- g_logQ.PushBlocking(Q_CLOSE);
- HANDLE handles[50];
- int nWaits = 0;
- for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
- {
- TItsThread *pObj = (TItsThread*)it->second;
- if (!pObj->IsTerm())
- {
- //pObj->Terminate(2000);
- handles[nWaits++] = pObj->Handle;
- }
- }
- WaitForMultipleObjects(nWaits, handles, true, 1000);
- G_Threads.RemoveAll();
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::TerminateApplication()
- {
- MERROR("MAIN===================> Program terminated start");
- SendTerminal();
- CComm_Close();
- MERROR("MAIN===================> Program terminated end");
- g_logQ.PushBlocking(Q_CLOSE);
- for (int ii = 0; ii < 50; ii++)
- {
- Sleep(30);
- Application->ProcessMessages();
- if (g_AppCfg.bThrJobExit) break;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::SendTerminal()
- {
- int result;
- MINFO("MAIN===================> SendTerminal");
- // 동작, 통신, DB 모두 이상 처리
- g_SysInfo->RunSts = state_error;
- g_SysInfo->ComSts = state_error;
- g_SysInfo->DbmSts = state_error;
- // 모든 시설물 통신 오프라인 처리
- CtlrItr it;
- for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
- {
- TCDSCtlr *pObj = (TCDSCtlr*)it->second;
- if (!pObj->Used) continue;
- pObj->Server.thrState = thr_stop;
- pObj->Client.thrState = thr_stop;
- pObj->Server.commState = comm_close;
- pObj->Client.commState = comm_close;
- }
- INT_PG_STATE_RES PgState;
- memset(&PgState, 0x00, sizeof(PgState));
- PgState.Count = 1;
- PgState.Unit[0].Type = INT_ID_VMS_SERVER;
- PgState.Unit[0].DB = g_SysInfo->DbmSts;
- PgState.Unit[0].Comm = g_SysInfo->ComSts;
- PgState.Unit[0].Action = g_SysInfo->RunSts;
- result = CComm_CmmProcessStateNotify(&PgState);
- TDMAdoDb *FDb = new TDMAdoDb(NULL);
- try
- {
- if (FDb->Connect(g_AppCfg.db.sConnectStr))
- {
- CDSProcessManager->SaveUnitStts(FDb->GetConnection());
- CDSCtlrManager->SaveCtlrSttsAll(FDb->GetConnection());
- }
- }
- __finally
- {
- if (FDb)
- {
- FDb->Close();
- }
- SAFE_DELETE(FDb);
- }
- }
- //---------------------------------------------------------------------------
- int __fastcall TVmsCommMain::SendVmsThreadMessage(BYTE *AVmsId, IPC_MSG_DATA *ARcvData, BYTE AOpCode, char *AData)
- {
- #if 0
- AnsiString sVmsId;
- IPCUDPPACKET *pPI = NULL;
- sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
- TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(sVmsId);
- if (!pObj)
- {
- return VERR_NOTFOUND_VMS;
- }
- if (pObj->Server.commState != comm_close)
- {
- return VERR_OFFLINE;
- }
- if (!pObj->pPackQueue)
- {
- return VERR_INTERNAL;
- }
- pPI = new IPCUDPPACKET;
- if (pPI == NULL) return VERR_MEMORY_ALLOC;
- pPI->Sender.IP = ARcvData->Sender.IP;
- pPI->Sender.Port = ARcvData->Sender.Port;
- pPI->RecvId = ARcvData->Pkt.head.SendId;
- pPI->OPCode = AOpCode;
- pPI->Size = (int)ARcvData->Pkt.head.Length;
- if (pPI->Size > 0)
- {
- pPI->Data = new char[pPI->Size];
- if (!pPI->Data)
- {
- delete pPI;
- return VERR_INTERNAL;
- }
- CopyMemory(pPI->Data, AData, pPI->Size);
- }
- pObj->pPackQueue->Add((void*)pPI);
- #endif
- return VERR_NONE;
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::plTimeDblClick(TObject *Sender)
- {
- if (!FrmNetwork->Showing)
- {
- FrmNetwork->Show();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::SendVmsTrafficProvide(int AType)
- {
- /*
- * 정주기, 교통정보메시지 수신, 긴급차량우선신호 알람, 최초 기동시에 호출되는 함수임.
- */
- String sType = "NONE";
- switch(AType) {
- case 0: sType = "TRAF"; break;
- case 1: sType = "TIME"; break;
- case 2: sType = "EVEH"; break;
- case 3: sType = "INIT"; break;
- }
- MINFO("MAIN===================> VMS Traffic Event Acitve, %s Event Running(dbm_check_evehicle_alarm).", AnsiString(sType).c_str());
- if (AType == 0 || AType == 1) {
- ResetProviderTimer();
- }
- if (AType == 0) {
- // 통신으로 정보가공완료 메시지를 수신한 후 VMS 메시지를 생성하는 경우
- m_dtTrafProvider = Now();
- }
- else if (AType == 1) {
- // 타임아웃 이벤트를 수신하였으나 1분 이내 통신 메시지 가공을 처리하였을 경우 타임아웃 메시지는 처리하지 않는다.
- if (COMM_TimeDiff(m_dtTrafProvider) <= 60) {
- MINFO("MAIN===================> VMS Traffic Event Acitve, Time Out Running. Before TRAF Event Processing...");
- return;
- }
- }
- FFirstRunning = false;
- m_dtChkEveh = Now(); // 긴급차량우선신호 알람 체크 타이머 초기화
- APP_PostDbThreadWriteMessage((AType == 2) ? dbm_dnld_form_eveh : dbm_dnld_form_cycle);
- m_dtProvider = Now(); // 정보제공 타이머
- pnlTraf->Caption = sType + ": " + m_dtProvider.FormatString("yyyy-mm-dd hh:nn:ss");
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::plRemainDblClick(TObject *Sender)
- {
- APP_ReLoadConfigInfo();
- //tmrDbCheckTimer(NULL);
- }
- //---------------------------------------------------------------------------
- void __fastcall TVmsCommMain::tmrDbCheckTimer(TObject *Sender)
- {
- tmrDbCheck->Enabled = false;
- AnsiString dbJobName = APP_GetDbJobName(tmrDbCheck->Tag);
- MERROR("MAIN=xxxxxxxxxxxxxxxxx=> DBMS Job Hang Error: %s", dbJobName.c_str());
- #if 0
- bool bRestart = false;
- String sRestart;
- if (APP_ReadConfigInfo("APPLICATION", "RESTART", sRestart))
- {
- if (sRestart.UpperCase() == "TRUE")
- {
- bRestart = true;
- }
- }
- if (bRestart)
- {
- MERROR("DBMS Job Hang Error: Server Self Die....");
- String sRestartApp = g_sAppDir + "RestarterApp.exe";
- if (FileExists(sRestartApp))
- {
- try {
- for (thrIterator it=G_Threads.FObjects.begin(); it != G_Threads.FObjects.end(); ++it)
- {
- TItsThread *pObj = (TItsThread*)it->second;
- if (pObj->Name == "DbmThread")
- {
- TDbmThread *dbmThread = (TDbmThread*)pObj;
- dbmThread->CloseDb();
- }
- }
- TerminateApplication();
- JobThreadStop();
- } catch(Exception &e) {
- }
- ShellExecute(NULL, NULL, AnsiString(sRestartApp).c_str(), NULL, NULL, SW_SHOWNORMAL);
- g_AppCfg.bAppClose = true;
- Close();
- }
- }
- #endif
- }
- //---------------------------------------------------------------------------
|