VmsControlMF.cpp 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "AppGlobalF.h"
  4. #include "ITSSkinF.h"
  5. #include "ITSUtilF.h"
  6. #include "FrmVmsOprMainF.h"
  7. #include "ITSLangTransF.h"
  8. #pragma hdrstop
  9. #include "FrmInitializeF.h" // 프로그램 초기화화면
  10. #include "VmsControlMF.h"
  11. //---------------------------------------------------------------------------
  12. #pragma package(smart_init)
  13. #pragma link "cxContainer"
  14. #pragma link "cxControls"
  15. #pragma link "cxEdit"
  16. #pragma link "cxGraphics"
  17. #pragma link "cxGroupBox"
  18. #pragma link "cxLabel"
  19. #pragma link "cxLookAndFeelPainters"
  20. #pragma link "cxLookAndFeels"
  21. #pragma link "cxPC"
  22. #pragma link "cxPCdxBarPopupMenu"
  23. #pragma link "cxSplitter"
  24. #pragma link "dxSkinBlack"
  25. #pragma link "dxSkinBlue"
  26. #pragma link "dxSkinCaramel"
  27. #pragma link "dxSkinCoffee"
  28. #pragma link "dxSkinDarkRoom"
  29. #pragma link "dxSkinDarkSide"
  30. #pragma link "dxSkinFoggy"
  31. #pragma link "dxSkinGlassOceans"
  32. #pragma link "dxSkiniMaginary"
  33. #pragma link "dxSkinLilian"
  34. #pragma link "dxSkinLiquidSky"
  35. #pragma link "dxSkinLondonLiquidSky"
  36. #pragma link "dxSkinMcSkin"
  37. #pragma link "dxSkinMoneyTwins"
  38. #pragma link "dxSkinOffice2007Black"
  39. #pragma link "dxSkinOffice2007Blue"
  40. #pragma link "dxSkinOffice2007Green"
  41. #pragma link "dxSkinOffice2007Pink"
  42. #pragma link "dxSkinOffice2007Silver"
  43. #pragma link "dxSkinOffice2010Black"
  44. #pragma link "dxSkinOffice2010Blue"
  45. #pragma link "dxSkinOffice2010Silver"
  46. #pragma link "dxSkinsCore"
  47. #pragma link "dxSkinscxPCPainter"
  48. #pragma link "dxSkinSeven"
  49. #pragma link "dxSkinSharp"
  50. #pragma link "dxSkinSilver"
  51. #pragma link "dxSkinStardust"
  52. #pragma link "cxClasses"
  53. #pragma link "cxCustomData"
  54. #pragma link "cxData"
  55. #pragma link "cxDataStorage"
  56. #pragma link "cxFilter"
  57. #pragma link "cxGrid"
  58. #pragma link "cxGridCustomTableView"
  59. #pragma link "cxGridCustomView"
  60. #pragma link "cxGridLevel"
  61. #pragma link "cxGridTableView"
  62. #pragma link "cxStyles"
  63. #pragma link "cxTextEdit"
  64. #pragma link "cxGridCardView"
  65. #pragma link "cxGridCustomLayoutView"
  66. #pragma link "cxCheckBox"
  67. #pragma link "cxDropDownEdit"
  68. #pragma link "cxImage"
  69. #pragma link "cxButtons"
  70. #pragma link "cxCalc"
  71. #pragma link "cxGridBandedTableView"
  72. #pragma link "FRAME_VmsStateF"
  73. #pragma link "FRAME_VmsStateF"
  74. #pragma link "FRAME_VmsMsgListF"
  75. #pragma link "ImageBtn"
  76. #pragma link "cxMaskEdit"
  77. #pragma link "cxRadioGroup"
  78. #pragma link "cxSpinEdit"
  79. #pragma link "cxTimeEdit"
  80. #pragma link "IdBaseComponent"
  81. #pragma link "IdComponent"
  82. #pragma link "IdIcmpClient"
  83. #pragma link "IdRawBase"
  84. #pragma link "IdRawClient"
  85. #pragma link "FFBaseComponent"
  86. #pragma link "FFBasePlay"
  87. #pragma link "FFPlay"
  88. #pragma link "IdHTTP"
  89. #pragma link "IdTCPClient"
  90. #pragma link "IdTCPConnection"
  91. #pragma link "dxSkinsForm"
  92. #pragma link "IdCoder"
  93. #pragma link "IdCoder00E"
  94. #pragma link "IdCoder3to4"
  95. #pragma link "IdCoderMIME"
  96. #pragma link "IdCoderUUE"
  97. #pragma resource "*.dfm"
  98. TVmsControlM *VmsControlM = NULL;
  99. #define LICENSE_KEY "FSXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX"
  100. //---------------------------------------------------------------------------
  101. __fastcall TVmsControlM::TVmsControlM(TComponent* Owner)
  102. : TForm(Owner)
  103. {
  104. //::CoInitialize(NULL);
  105. Caption = g_AppCfg.sTitle + " - Active";
  106. ITSSkin_Initialize(Application);
  107. CMM_SetFormPosition(g_AppCfg.bSaveForm);
  108. String sCaption = "0";
  109. ReadConfigInfo(g_AppCfg.sConfigFile, "APPLICATION", "CAPTION", sCaption);
  110. ITSSkin_Caption(sCaption == "1" ? true : false);
  111. ITSSkin_Load(this);
  112. LoadLocalSkin();
  113. FTitle = Caption;//"VMS 폼관리";
  114. //if (FormStyle != fsMDIChild) CMM_LoadForm(g_sFormsDir, this);
  115. FPalyerForm = NULL;
  116. FSelVmsObj = NULL;
  117. FRAMEVmsStateList1->PnlTop->Visible = false;
  118. FRAMEVmsStateList1->PnlBottom->Visible = false;
  119. FRAMEVmsStateList1->TvList->OptionsView->Footer = false;
  120. FRAMEVmsStateList1->Col04->Visible = false;
  121. FRAMEVmsStateList1->Col05->Visible = false;
  122. FRAMEVmsStateList1->Col06->Visible = true;
  123. FRAMEVmsStateList1->ColumnSel->Visible = true;
  124. cxTabSheet5->TabVisible = false;
  125. cxTabSheet5->Visible = false;
  126. cxTabSheet1->TabVisible = false;
  127. cxTabSheet1->Visible = false;
  128. cxTabSheet6->TabVisible = false;
  129. cxTabSheet6->Visible = false;
  130. PgControl->ActivePageIndex = 0;
  131. FVmsIds = new TStringList();
  132. FTitle = Caption;//"VMS 제어";
  133. FCtrlTab = NULL;
  134. PgCam->Properties->HideTabs = true;
  135. PnlCamera->ParentColor = false;
  136. FStrmPlay = false;
  137. reMsg->Lines->Clear();
  138. String sAVILibDir = g_sAppDir + "LibAV";
  139. FFPlayer1->SetLicenseKey(LICENSE_KEY);
  140. FFPlayer1->DisableFPUExceptions();
  141. if (!FFPlayer1->LoadAVLib(sAVILibDir))
  142. {
  143. reMsg->Lines->Add("영상표출 라이브러리 초기화 실패.");
  144. #if 0
  145. if (g_AppCfg.sLang != "kr") Application->MessageBox(L"Stream display library load failed.", L"Stream display fail", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  146. else Application->MessageBox(L"영상표출 라이브러리를 로드하지 못하였습니다.", L"영상표출 오류", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  147. #endif
  148. }
  149. reMsg->Lines->Clear();
  150. SetColorScheme(g_AppCfg.sSkinName);
  151. }
  152. //---------------------------------------------------------------------------
  153. void __fastcall TVmsControlM::SetColorScheme(String ASkinName)
  154. {
  155. dxSkinController1->SkinName = ASkinName;
  156. dxSkinController1->Refresh();
  157. }
  158. //---------------------------------------------------------------------------
  159. void __fastcall TVmsControlM::CommClose()
  160. {
  161. try
  162. {
  163. WebCamStop();
  164. SAFE_DELETE(FVmsIds);
  165. //if (FormStyle != fsMDIChild) CMM_SaveForm(g_sFormsDir, this);
  166. FStrmPlay = false;
  167. //::CoUninitialize();
  168. }
  169. catch(...)
  170. {
  171. }
  172. }
  173. //---------------------------------------------------------------------------
  174. void __fastcall TVmsControlM::FormShow(TObject *Sender)
  175. {
  176. Refresh();
  177. FRAMEVmsStateList1->UpdateList();
  178. //FRAMEVmsStateList1->TvList->ApplyBestFit(NULL, true, false);
  179. FRAMEVmsStateList1->CxList->Enabled = false;
  180. UpdatePingList();
  181. TmrShow->Enabled = true;
  182. }
  183. //---------------------------------------------------------------------------
  184. void __fastcall TVmsControlM::FormActivate(TObject *Sender)
  185. {
  186. ActivateForm(true);
  187. }
  188. //---------------------------------------------------------------------------
  189. void __fastcall TVmsControlM::FormDeactivate(TObject *Sender)
  190. {
  191. ActivateForm(false);
  192. }
  193. //---------------------------------------------------------------------------
  194. void __fastcall TVmsControlM::LoadLocalSkin()
  195. {
  196. PnlVmsCam->ParentColor = false;
  197. PnlVmsCam->Color = clBlack;
  198. PnlSamsung->ParentColor = false;
  199. PnlSamsung->Color = clBlack;
  200. Refresh();
  201. }
  202. //---------------------------------------------------------------------------
  203. void __fastcall TVmsControlM::TmrShowTimer(TObject *Sender)
  204. {
  205. TmrShow->Enabled = false;
  206. TFrmInitialize *FrmInitialize = new TFrmInitialize(this);
  207. FrmInitialize->FThreadId = g_AppCfg.thr.dwThreadId;
  208. FrmInitialize->ShowModal();
  209. FRAMEVmsStateList1->CxList->Enabled = true;
  210. }
  211. //---------------------------------------------------------------------------
  212. void __fastcall TVmsControlM::FormClose(TObject *Sender, TCloseAction &Action)
  213. {
  214. try {
  215. CommClose();
  216. VmsControlM = NULL;
  217. Action = caFree;
  218. } catch(...) {}
  219. }
  220. //---------------------------------------------------------------------------
  221. void __fastcall TVmsControlM::OnMainFormMessage(TMessage &Msg)
  222. {
  223. }
  224. //---------------------------------------------------------------------------
  225. void __fastcall TVmsControlM::OnVmsStateRefreshMessage(TMessage &Msg)
  226. {
  227. FRAMEVmsStateList1->RefreshStatus();
  228. RefreshPingList();
  229. }
  230. //---------------------------------------------------------------------------
  231. void __fastcall TVmsControlM::OnVmsFormRefreshMessage(TMessage &Msg)
  232. {
  233. }
  234. //---------------------------------------------------------------------------
  235. void __fastcall TVmsControlM::OnVmsSelectMessage(TMessage &Msg)
  236. {
  237. #if 0
  238. try {
  239. FSelVmsObj = (TVmsCtlr*)Msg.WParam;
  240. FRAMEVmsState1->SelVmsObj = FSelVmsObj;
  241. if (!FSelVmsObj) return;
  242. TVMSWCAM0 *pSelForm = (TVMSWCAM0*)Msg.LParam;
  243. if (pSelForm == FSelForm) return;
  244. if (FSelForm) FSelForm->SelectForm(false);
  245. FSelForm = pSelForm;
  246. if (FSelForm) FSelForm->SelectForm(true);
  247. //VMS정보제공구간 소통정보 업데이트
  248. LoadVmsMsgScenario((FSelVmsObj->VMS_CTLR_NMBR));
  249. } catch(...) {};
  250. #endif
  251. }
  252. //---------------------------------------------------------------------------
  253. void __fastcall TVmsControlM::ActivateForm(bool AActivate)
  254. {
  255. //TODO: 기존에는 아래가 주석으로 막혀 있었음. 왜그러지?
  256. if (AActivate) FRAMEVmsStateList1->RefreshStatus();
  257. }
  258. //---------------------------------------------------------------------------
  259. void __fastcall TVmsControlM::DisplayInfo()
  260. {
  261. FSelVmsObj = NULL;
  262. PnlVms->Caption = " " + lblSelVms->Caption + " -";//" Select VMS: -";
  263. TcxGridBandedTableView *TvList = FRAMEVmsStateList1->TvList;
  264. TcxDataController *pGDC = TvList->DataController;
  265. int nSelIdx = CMM_GetRecordIndex(TvList);
  266. if (nSelIdx < 0) return;
  267. String sVmsNmbr = VarToStr(pGDC->Values[nSelIdx][FRAMEVmsStateList1->Col01->Index]);
  268. int nMemPtr = (int)pGDC->Values[nSelIdx][FRAMEVmsStateList1->Col99->Index];
  269. FSelVmsObj = (TVmsCtlr*)nMemPtr;
  270. if (!FSelVmsObj) return;
  271. PnlVms->Caption = " " + lblSelVms->Caption + " [" + FSelVmsObj->VMS_CTLR_ID + "] " + FSelVmsObj->VMS_NM;
  272. try
  273. {
  274. if (FSelVmsObj->PANL_ON_TIME.Length() == 4) // 전팡관ON시각
  275. {
  276. String sPowerOnTime = FSelVmsObj->PANL_ON_TIME;
  277. sPowerOnTime.Insert(":", 3);
  278. cxTimeOn->EditValue = sPowerOnTime;
  279. cxDispStrTm->EditValue = sPowerOnTime;
  280. cxDisplayTimeOn->EditValue = sPowerOnTime;
  281. }
  282. if (FSelVmsObj->PANL_OFF_TIME.Length() == 4) // 전광판OFF시각
  283. {
  284. String sPowerOffTime = FSelVmsObj->PANL_OFF_TIME;
  285. sPowerOffTime.Insert(":", 3);
  286. cxTimeOff->EditValue = sPowerOffTime;
  287. cxDispEndTm->EditValue = sPowerOffTime;
  288. cxDisplayTimeOff->EditValue = sPowerOffTime;
  289. }
  290. Se01->Value = FSelVmsObj->STATE.ScheduledMessageOperatingTime;/* 필수 계획된 메시지의 동작시간(초) */
  291. Se02->Value = FSelVmsObj->STATE.ModuleOperatingTemperature; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  292. Se03->Value = FSelVmsObj->STATE.FanOperatingTemperature; /* 필수 Fan 동작 기준 온도값(℃) */
  293. Se04->Value = FSelVmsObj->STATE.HeaterOperatingTemperature; /* 필수 Heater 동작 기준 온도값(℃) */
  294. Se05->Value = FSelVmsObj->STATE.ModuleBasicFailureRate; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  295. Se06->Value = 3;
  296. Se07->Value = 30;
  297. SeCommErrTime->Value = 60; //FSelVmsObj->VMS_CMNC_ERR_BASS_VAL; //통신장애 기본값(Default=60초)
  298. SeSlotCommErr->Value = 0; //FSelVmsObj->CMNCFAIL_SLOT_NMBR = (int)pReq->SlotCommErr; // NUMBER(4) Y 0 통신장애 SLOT 번호
  299. SeSlotPowerErr->Value = 0; //FSelVmsObj->PWER_FAIL_SLOT_NMBR = (int)pReq->SlotPowerErr; // NUMBER(4) Y 0 전원 장애 SLOT 번호
  300. #if 0
  301. SeLumNight->Value = FSelVmsObj->VMS_NGHT_BRGH_STEP;
  302. SeLumDay->Value = FSelVmsObj->VMS_WEEK_BRGH_STEP;
  303. SeModRate->Value = FSelVmsObj->VMS_MODL_ERR_RATE;
  304. SeModCycle->Value = FSelVmsObj->VMS_MODL_CHK_CYCL;
  305. SeMsgTime->Value = FSelVmsObj->DEF_PHSE_CHNG_CYCL;
  306. SeFormCycleTime->Value = FSelVmsObj->VMS_PHSE_CHNG_CYCL;
  307. #endif
  308. }
  309. catch(Exception &e)
  310. {
  311. }
  312. try
  313. {
  314. reMsg->Lines->Clear();
  315. WebCamPlay((FSelVmsObj->VMS_CTLR_NMBR));
  316. }
  317. catch(Exception &e)
  318. {
  319. }
  320. BtnWebCamUrl->Enabled = true;
  321. }
  322. //---------------------------------------------------------------------------
  323. void __fastcall TVmsControlM::BtnAllSelectClick(TObject *Sender)
  324. {
  325. TcxButton *pBtn = (TcxButton*)Sender;
  326. if (PgControl->Properties->ActivePage != TabPing)
  327. CMM_CheckAllListItem(FRAMEVmsStateList1->TvList, FRAMEVmsStateList1->ColumnSel->Index, pBtn->Tag);
  328. else
  329. CMM_CheckAllListItem(TvPing, ColumnSel->Index, pBtn->Tag);
  330. }
  331. //---------------------------------------------------------------------------
  332. void __fastcall TVmsControlM::ClearCheckList()
  333. {
  334. TcxGridBandedTableView *TvList = FRAMEVmsStateList1->TvList;
  335. TcxDataController *pGDC = TvList->DataController;
  336. try
  337. {
  338. TvList->BeginUpdate();
  339. pGDC->BeginUpdate();
  340. int nRows = pGDC->RecordCount;
  341. for (int ii = 0; ii < nRows; ii++)
  342. {
  343. pGDC->Values[ii][FRAMEVmsStateList1->ColumnSel->Index] = false;
  344. }
  345. }
  346. __finally
  347. {
  348. pGDC->EndUpdate();
  349. TvList->EndUpdate();
  350. }
  351. }
  352. //---------------------------------------------------------------------------
  353. void __fastcall TVmsControlM::FRAMEVmsStateList1TvListCellDblClick(TcxCustomGridTableView *Sender,
  354. TcxGridTableDataCellViewInfo *ACellViewInfo, TMouseButton AButton,
  355. TShiftState AShift, bool &AHandled)
  356. {
  357. if (!ACellViewInfo) return;
  358. ClearCheckList();
  359. TcxGridBandedTableView *TvList = FRAMEVmsStateList1->TvList;
  360. TcxDataController *pGDC = TvList->DataController;
  361. int nSelIdx = CMM_GetRecordIndex(TvList);
  362. if (nSelIdx < 0) return;
  363. pGDC->Values[nSelIdx][FRAMEVmsStateList1->ColumnSel->Index] = true;
  364. DisplayInfo();
  365. }
  366. //---------------------------------------------------------------------------
  367. void __fastcall TVmsControlM::Se01PropertiesChange(TObject *Sender)
  368. {
  369. #if 1
  370. if (((TcxSpinEdit*)Sender)->Value < ((TcxSpinEdit*)Sender)->Properties->MinValue)
  371. ((TcxSpinEdit*)Sender)->Value = ((TcxSpinEdit*)Sender)->Properties->MinValue;
  372. else if(((TcxSpinEdit*)Sender)->Value > ((TcxSpinEdit*)Sender)->Properties->MaxValue &&
  373. ((TcxSpinEdit*)Sender)->Properties->MaxValue)
  374. ((TcxSpinEdit*)Sender)->Value = ((TcxSpinEdit*)Sender)->Properties->MaxValue;
  375. #endif
  376. }
  377. //---------------------------------------------------------------------------
  378. int __fastcall TVmsControlM::GetSelListItems(bool ACommCheck/*=true*/)
  379. {
  380. TcxGridBandedTableView *TvList = FRAMEVmsStateList1->TvList;
  381. TcxDataController *pGDC = TvList->DataController;
  382. FVmsIds->Clear();
  383. try
  384. {
  385. bool bSelected;
  386. int nRows = TvList->ViewData->RecordCount;
  387. TvList->BeginUpdate();
  388. for (int ii = 0; ii < nRows; ii++)
  389. {
  390. TcxCustomGridRow* ARow = TvList->ViewData->Rows[ii];
  391. int nMemPtr = (int)ARow->Values[FRAMEVmsStateList1->Col99->Index];
  392. TVmsCtlr *pVms = (TVmsCtlr*)nMemPtr;
  393. if (!pVms) continue;
  394. bSelected = (bool)ARow->Values[FRAMEVmsStateList1->ColumnSel->Index];
  395. if (bSelected)
  396. {
  397. String sVmsNmbr = ARow->Values[FRAMEVmsStateList1->Col01->Index]; //VMS번호
  398. if (ACommCheck)
  399. {
  400. if (pVms->STATE.Comm == vms_comm_normal)
  401. {
  402. FVmsIds->Add(sVmsNmbr);
  403. }
  404. }
  405. else
  406. {
  407. FVmsIds->Add(sVmsNmbr);
  408. }
  409. }
  410. }
  411. }
  412. __finally
  413. {
  414. TvList->EndUpdate();
  415. }
  416. return FVmsIds->Count;
  417. }
  418. //---------------------------------------------------------------------------
  419. void __fastcall TVmsControlM::BtnControlClick(TObject *Sender)
  420. {
  421. //전광판제어
  422. String sTitle = cxLabel1->Caption;//"전광판/제어기 제어";
  423. String sMsg = "";
  424. int nOkCnt = 0;
  425. int nSelCnt = GetSelListItems(true);
  426. if (0 == nSelCnt)
  427. {
  428. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  429. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  430. FRAMEVmsStateList1->CxList->SetFocus();
  431. return;
  432. }
  433. int nCmdIdx;
  434. if (RdbOn->Checked)
  435. {
  436. nCmdIdx = vms_req_board_power_on;
  437. sMsg = cxLabel3->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 전광판 전원 ON 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  438. }
  439. else
  440. if (RdbOff->Checked)
  441. {
  442. nCmdIdx = vms_req_board_power_off;
  443. sMsg = cxLabel4->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 전광판 전원 OFF 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  444. }
  445. else
  446. if (RdbReset->Checked)
  447. {
  448. nCmdIdx = 2;
  449. sMsg = cxLabel5->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 제어기 리셋 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  450. }
  451. else
  452. if (RdbLuminance->Checked)
  453. {
  454. nCmdIdx = 3;
  455. sMsg = cxLabel6->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 휘도값 제어 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  456. }
  457. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  458. String sCmdUser = g_pLOGIN->sUserId;
  459. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  460. int result;
  461. for (int ii = 0; ii < nSelCnt; ii++)
  462. {
  463. String sVmsNmbr = FVmsIds->Strings[ii];
  464. if (nCmdIdx == vms_req_board_power_on || nCmdIdx == vms_req_board_power_off)
  465. {
  466. // 전광판 On(=0)/Off(=1)
  467. INT_VMS_POWER_CTL_REQ VmsPowerCtl;
  468. BYTE MsgSeq;
  469. memset(&VmsPowerCtl, 0x00, sizeof(VmsPowerCtl));
  470. MsgSeq = (BYTE)0x10; // 제어명령 일련번호-결과값을 받아서 처리할때 필요함
  471. memcpy(VmsPowerCtl.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  472. memcpy(VmsPowerCtl.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  473. VmsPowerCtl.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  474. VmsPowerCtl.Command = (BYTE)nCmdIdx; /* 제어 구분, 1:켜짐 2:꺼짐 */
  475. String sOprCode = (nCmdIdx == vms_req_board_power_on) ? "V01" : "V02";
  476. String sCmdValue = (nCmdIdx == vms_req_board_power_on) ? "On" : "Off";
  477. result = CComm_VmsPowerControlReq(&VmsPowerCtl, MsgSeq);
  478. if (VERR_NONE == result)
  479. {
  480. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sOprCode, sCmdValue, "1", sCmdUser);
  481. nOkCnt++;
  482. }
  483. else
  484. {
  485. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sOprCode, sCmdValue, "0", sCmdUser);
  486. }
  487. }
  488. else
  489. if (nCmdIdx == 2)
  490. {
  491. // 제어기 리셋
  492. INT_VMS_RESET_REQ VmsReset;
  493. BYTE MsgSeq;
  494. memset(&VmsReset, 0x00, sizeof(VmsReset));
  495. MsgSeq = (BYTE)0x20;
  496. memcpy(VmsReset.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  497. memcpy(VmsReset.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  498. VmsReset.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  499. result = CComm_VmsResetReq(&VmsReset, MsgSeq);
  500. if (VERR_NONE == result)
  501. {
  502. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V03", "Reset", "1", sCmdUser);
  503. nOkCnt++;
  504. }
  505. else
  506. {
  507. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V03", "Reset", "0", sCmdUser);
  508. }
  509. }
  510. else
  511. if (nCmdIdx == 3)
  512. {
  513. // 휘도제어
  514. INT_VMS_LUMINANCE_REQ VmsLuminance;
  515. BYTE MsgSeq;
  516. String sCmdValue = SeLuminance->Value;
  517. memset(&VmsLuminance, 0x00, sizeof(VmsLuminance));
  518. MsgSeq = (BYTE)0x30;
  519. memcpy(VmsLuminance.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  520. memcpy(VmsLuminance.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  521. VmsLuminance.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  522. switch(CbBrghMode->ItemIndex)
  523. {
  524. case 0: VmsLuminance.BrghMode = 0x00; break;
  525. case 1: VmsLuminance.BrghMode = 0x01; break;
  526. case 2: VmsLuminance.BrghMode = 0x02; break;
  527. case 3: VmsLuminance.BrghMode = 0x09; break;
  528. }
  529. VmsLuminance.BrghCurrStep = (BYTE)SeCurrBrgh->Value;
  530. VmsLuminance.BrghWeekStep = (BYTE)SeWeekBrgh->Value;
  531. VmsLuminance.BrghNghtStep = (BYTE)SeNghtBrgh->Value;
  532. result = CComm_VmsLuminanceReq(&VmsLuminance, MsgSeq);
  533. if (VERR_NONE == result)
  534. {
  535. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V07", sCmdValue, "1", sCmdUser);
  536. nOkCnt++;
  537. }
  538. else
  539. {
  540. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V07", sCmdValue, "0", sCmdUser);
  541. }
  542. }
  543. Sleep(100);
  544. Application->ProcessMessages();
  545. }
  546. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS로 전광판/제어기 제어 명령을 요청하였습니다.";
  547. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel8->Caption;
  548. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  549. }
  550. //---------------------------------------------------------------------------
  551. void __fastcall TVmsControlM::BtnConfigClick(TObject *Sender)
  552. {
  553. //제어기함체환경설정
  554. int nVal03 = Se03->Value;
  555. int nVal04 = Se04->Value;
  556. int nStrTmHour = cxDispStrTm->Time.FormatString("HH").ToIntDef(0);
  557. int nStrTmMin = cxDispStrTm->Time.FormatString("NN").ToIntDef(0);
  558. int nEndTmHour = cxDispEndTm->Time.FormatString("HH").ToIntDef(0);
  559. int nEndTmMin = cxDispEndTm->Time.FormatString("NN").ToIntDef(0);
  560. String sTitle = cxLabel10->Caption;//"VMS 함체환경 설정";
  561. String sMsg = "";
  562. int nOkCnt = 0;
  563. int nSelCnt = GetSelListItems(false);
  564. if (0 == nSelCnt)
  565. {
  566. sMsg = cxLabel2->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  567. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  568. FRAMEVmsStateList1->CxList->SetFocus();
  569. return;
  570. }
  571. if ((nStrTmHour*60 + nStrTmMin) > (nEndTmHour*60 + nEndTmMin))
  572. {
  573. sMsg = "전광판 가동종료시각이 전광판 가동시작시각보다 클 수 없습니다.\r\n전광판 가동시각을 확인하세요.";
  574. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  575. return;
  576. }
  577. int nCmdIdx = 0;
  578. sMsg = cxLabel11->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 함체환경 설정 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  579. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  580. String sCmdUser = g_pLOGIN->sUserId;
  581. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  582. String sCmdValue;
  583. sCmdValue.printf(L"%d.%d,%02d%02d,%02d%02d",
  584. nVal03,
  585. nVal04,
  586. nStrTmHour,
  587. nStrTmMin,
  588. nEndTmHour,
  589. nEndTmMin);
  590. int result;
  591. for (int ii = 0; ii < nSelCnt; ii++)
  592. {
  593. String sVmsNmbr = FVmsIds->Strings[ii];
  594. INT_VMS_PARA_SET_REQ VmsPara;
  595. BYTE MsgSeq;
  596. memset(&VmsPara, 0x00, sizeof(VmsPara));
  597. MsgSeq = (BYTE)0x40;
  598. memcpy(VmsPara.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  599. memcpy(VmsPara.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  600. VmsPara.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  601. VmsPara.FanRunTmpr = (BYTE)nVal03;
  602. VmsPara.HetrRunTmpr = (BYTE)nVal04;
  603. sprintf(VmsPara.DispStrTm, "%02d%02d", nStrTmHour, nStrTmMin);
  604. sprintf(VmsPara.DispEndTm, "%02d%02d", nEndTmHour, nEndTmMin);
  605. result = CComm_VmsParaSetReq(&VmsPara, MsgSeq);
  606. if (VERR_NONE == result)
  607. {
  608. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "1", sCmdUser);
  609. nOkCnt++;
  610. if (UpdateVmsParam(sVmsNmbr, (void*)&VmsPara))
  611. {
  612. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  613. if (pObj)
  614. {
  615. pObj->PANL_ON_TIME.printf(L"%02d%02d", nStrTmHour, nStrTmMin); // N VARCHAR2(4) Y '0400' 전광판 ON TIME
  616. pObj->PANL_OFF_TIME.printf(L"%02d%02d", nEndTmHour, nEndTmMin); // N VARCHAR2(4) Y '0200' 전광판 OFF TIME
  617. #if 0
  618. pObj->VMS_PHSE_CHNG_CYCL = VmsPara.SchMsgTime; /* 필수 계획된 메시지의 동작시간(초) */
  619. pObj->VMS_CMNC_ERR_BASS_VAL = VmsPara.ModuleTemp; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  620. pObj->FAN_MTNS_TMPR = VmsPara.FanTemp; /* 필수 Fan 동작 기준 온도값(℃) */
  621. pObj->HETR_MTNS_TMPR = VmsPara.HeaterTemp; /* 필수 Heater 동작 기준 온도값(℃) */
  622. pObj->VMS_MODL_ERR_RATE = VmsPara.ModuleFail; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  623. pObj->STATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL; /* 필수 계획된 메시지의 동작시간(초) */
  624. pObj->STATE.ModuleOperatingTemperature = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  625. pObj->STATE.FanOperatingTemperature = pObj->FAN_MTNS_TMPR; /* 필수 Fan 동작 기준 온도값(℃) */
  626. pObj->STATE.HeaterOperatingTemperature = pObj->HETR_MTNS_TMPR; /* 필수 Heater 동작 기준 온도값(℃) */
  627. pObj->STATE.ModuleBasicFailureRate = pObj->VMS_MODL_ERR_RATE; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  628. #endif
  629. }
  630. }
  631. }
  632. else
  633. {
  634. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "0", sCmdUser);
  635. }
  636. Sleep(100);
  637. Application->ProcessMessages();
  638. }
  639. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS 함체환경 설정 명령을 요청하였습니다.";
  640. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel12->Caption;
  641. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  642. #if 0
  643. //제어기함체환경설정
  644. int nVal01 = Se01->Value;
  645. int nVal02 = Se02->Value;
  646. int nVal03 = Se03->Value;
  647. int nVal04 = Se04->Value;
  648. int nVal05 = Se05->Value;
  649. int nVal06 = Se06->Value;
  650. int nVal07 = Se07->Value;
  651. String sTitle = cxLabel10->Caption;//"VMS 함체환경 설정";
  652. String sMsg = "";
  653. int nOkCnt = 0;
  654. int nSelCnt = GetSelListItems(false);
  655. if (0 == nSelCnt)
  656. {
  657. sMsg = cxLabel2->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  658. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  659. FRAMEVmsStateList1->CxList->SetFocus();
  660. return;
  661. }
  662. int nCmdIdx = 0;
  663. sMsg = cxLabel11->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 함체환경 설정 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  664. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  665. String sCmdUser = g_pLOGIN->sUserId;
  666. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  667. String sCmdValue;
  668. sCmdValue.printf(L"%d.%d,%d,%d,%d,%d,%d",
  669. nVal01,
  670. nVal02,
  671. nVal03,
  672. nVal04,
  673. nVal05,
  674. nVal06,
  675. nVal07);
  676. int result;
  677. for (int ii = 0; ii < nSelCnt; ii++)
  678. {
  679. String sVmsNmbr = FVmsIds->Strings[ii];
  680. INT_VMS_PARA_SET_REQ VmsPara;
  681. BYTE MsgSeq;
  682. memset(&VmsPara, 0x00, sizeof(VmsPara));
  683. MsgSeq = (BYTE)0x40;
  684. memcpy(VmsPara.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  685. memcpy(VmsPara.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  686. memcpy(VmsPara.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  687. VmsPara.SchMsgTime = (DWORD)nVal01; /* 계획된 메시지 동작시간 */
  688. VmsPara.ModuleTemp = (BYTE)nVal02; /* 모듈전원 OFF 온도 */
  689. VmsPara.FanTemp = (BYTE)nVal03; /* Fan동작 기준온도 */
  690. VmsPara.HeaterTemp = (BYTE)nVal04; /* Heater동작 기준온도 */
  691. VmsPara.ModuleFail = (BYTE)nVal05; /* 모듈장애 판단율 */
  692. VmsPara.RetryCount = (BYTE)nVal06; /* 재시도 횟수 */
  693. VmsPara.TimeOut = (DWORD)nVal07; /* 최대응답대기시간 */
  694. result = CComm_VmsParaSetReq(&VmsPara, MsgSeq);
  695. if (VERR_NONE == result)
  696. {
  697. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "1", sCmdUser);
  698. nOkCnt++;
  699. //통신전송후 바이트오더링이 바뀐다
  700. VmsPara.SchMsgTime = (DWORD)nVal01; /* 계획된 메시지 동작시간 */
  701. VmsPara.TimeOut = (DWORD)nVal07; /* 최대응답대기시간 */
  702. if (UpdateVmsParam(sVmsNmbr, (void*)&VmsPara))
  703. {
  704. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  705. if (pObj)
  706. {
  707. #if 0
  708. pObj->VMS_PHSE_CHNG_CYCL = VmsPara.SchMsgTime; /* 필수 계획된 메시지의 동작시간(초) */
  709. pObj->VMS_CMNC_ERR_BASS_VAL = VmsPara.ModuleTemp; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  710. pObj->FAN_MTNS_TMPR = VmsPara.FanTemp; /* 필수 Fan 동작 기준 온도값(℃) */
  711. pObj->HETR_MTNS_TMPR = VmsPara.HeaterTemp; /* 필수 Heater 동작 기준 온도값(℃) */
  712. pObj->VMS_MODL_ERR_RATE = VmsPara.ModuleFail; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  713. pObj->STATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL; /* 필수 계획된 메시지의 동작시간(초) */
  714. pObj->STATE.ModuleOperatingTemperature = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  715. pObj->STATE.FanOperatingTemperature = pObj->FAN_MTNS_TMPR; /* 필수 Fan 동작 기준 온도값(℃) */
  716. pObj->STATE.HeaterOperatingTemperature = pObj->HETR_MTNS_TMPR; /* 필수 Heater 동작 기준 온도값(℃) */
  717. pObj->STATE.ModuleBasicFailureRate = pObj->VMS_MODL_ERR_RATE; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  718. #endif
  719. }
  720. }
  721. }
  722. else
  723. {
  724. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "0", sCmdUser);
  725. }
  726. Sleep(100);
  727. Application->ProcessMessages();
  728. }
  729. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS 함체환경 설정 명령을 요청하였습니다.";
  730. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel12->Caption;
  731. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  732. #endif
  733. }
  734. //---------------------------------------------------------------------------
  735. bool __fastcall TVmsControlM::UpdateVmsParam(String AVmsNmbr, void *pData)
  736. {
  737. String sQry;
  738. TADOQuery *pADO = NULL;
  739. int nCnt = 0;
  740. INT_VMS_PARA_SET_REQ *pReq = (INT_VMS_PARA_SET_REQ*)pData;
  741. sQry = "UPDATE TB_VMS_CTLR \r\n"
  742. " SET FAN_RUN_TMPR = :p02, \r\n"
  743. " HETR_RUN_TMPR = :p03, \r\n"
  744. " PANL_ON_TIME = :p04, \r\n"
  745. " PANL_OFF_TIME = :p05 \r\n"
  746. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  747. try
  748. {
  749. try
  750. {
  751. String sFanRunTmpr;
  752. String sHetrRunTmpr;
  753. String sDispStrTm;
  754. String sDispEndTm;
  755. char szTemp[20];
  756. sFanRunTmpr.printf(L"%d", pReq->FanRunTmpr);
  757. sHetrRunTmpr.printf(L"%d", pReq->HetrRunTmpr);
  758. memset(szTemp, 0x00, sizeof(szTemp));
  759. sprintf(szTemp, "%4.4s", (char*)pReq->DispStrTm);
  760. sDispStrTm = String(szTemp);
  761. memset(szTemp, 0x00, sizeof(szTemp));
  762. sprintf(szTemp, "%4.4s", (char*)pReq->DispEndTm);
  763. sDispEndTm = String(szTemp);
  764. pADO = new TADOQuery(NULL);
  765. pADO->Close();
  766. pADO->Connection = ITSDb_GetConnection();
  767. pADO->SQL->Clear();
  768. pADO->SQL->Text = sQry;
  769. pADO->Parameters->ParamByName("p01")->Value = AVmsNmbr;
  770. pADO->Parameters->ParamByName("p02")->Value = sFanRunTmpr;
  771. pADO->Parameters->ParamByName("p03")->Value = sHetrRunTmpr;
  772. pADO->Parameters->ParamByName("p04")->Value = sDispStrTm;
  773. pADO->Parameters->ParamByName("p05")->Value = sDispEndTm;
  774. nCnt = pADO->ExecSQL();
  775. }
  776. catch(EDatabaseError &E)
  777. {
  778. DBERRORLOG("TVMS0500M::UpdateVmsParam", String(E.ClassName()), E.Message, sQry);
  779. throw Exception(String(E.ClassName()) + E.Message);
  780. }
  781. catch(Exception &e)
  782. {
  783. DBERRORLOG("TVMS0500M::UpdateVmsParam", String(e.ClassName()), e.Message, sQry);
  784. throw Exception(String(e.ClassName()) + e.Message);
  785. }
  786. }
  787. __finally
  788. {
  789. if (pADO)
  790. {
  791. pADO->Close();
  792. delete pADO;
  793. }
  794. }
  795. return nCnt > 0 ? true : false;
  796. }
  797. //---------------------------------------------------------------------------
  798. void __fastcall TVmsControlM::BtnOnOffSetClick(TObject *Sender)
  799. {
  800. //전광판ON/OFF시각설정
  801. String sTitle = cxLabel13->Caption;//"전광판 ON/OFF 시각 설정";
  802. String sMsg = "";
  803. int nOkCnt = 0;
  804. int nSelCnt = GetSelListItems(false);
  805. if (0 == nSelCnt)
  806. {
  807. sMsg = cxLabel14->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.";
  808. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  809. FRAMEVmsStateList1->CxList->SetFocus();
  810. return;
  811. }
  812. int nCmdIdx = 0;
  813. sMsg = cxLabel15->Caption;//"선택하신 VMS의 전광판 ON/OFF 시각을 설정 하시겠습니까?";
  814. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  815. String sQry;
  816. TADOQuery *pADO = NULL;
  817. sQry = "UPDATE TB_VMS_CTLR \r\n"
  818. " SET PANL_ON_TIME = :p02, \r\n"
  819. " PANL_OFF_TIME = :p03 \r\n"
  820. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  821. String PANL_ON_TIME = cxTimeOn->Time.FormatString("HHNN");
  822. String PANL_OFF_TIME = cxTimeOff->Time.FormatString("HHNN");
  823. String LAST_CRPR_NMBR = g_pLOGIN->sUserId;
  824. String LAST_CRCT_DT = Now().FormatString("yyyymmddhhnnss");
  825. try
  826. {
  827. try
  828. {
  829. pADO = new TADOQuery(NULL);
  830. pADO->Close();
  831. pADO->Connection = ITSDb_GetConnection();
  832. pADO->SQL->Clear();
  833. pADO->SQL->Text = sQry;
  834. for (int ii = 0; ii < nSelCnt; ii++)
  835. {
  836. String sVmsNmbr = FVmsIds->Strings[ii];
  837. pADO->Parameters->ParamByName("p01")->Value = sVmsNmbr;
  838. pADO->Parameters->ParamByName("p02")->Value = PANL_ON_TIME;
  839. pADO->Parameters->ParamByName("p03")->Value = PANL_OFF_TIME;
  840. pADO->ExecSQL();
  841. nOkCnt++;
  842. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  843. if (pObj)
  844. {
  845. pObj->PANL_ON_TIME = PANL_ON_TIME;
  846. pObj->PANL_OFF_TIME = PANL_OFF_TIME;
  847. }
  848. }
  849. }
  850. catch(EDatabaseError &E)
  851. {
  852. DBERRORLOG("TVMS0500M::BtnOnOffSetClick", String(E.ClassName()), E.Message, sQry);
  853. throw Exception(String(E.ClassName()) + E.Message);
  854. }
  855. catch(Exception &e)
  856. {
  857. DBERRORLOG("TVMS0500M::BtnOnOffSetClick", String(e.ClassName()), e.Message, sQry);
  858. throw Exception(String(e.ClassName()) + e.Message);
  859. }
  860. }
  861. __finally
  862. {
  863. if (pADO)
  864. {
  865. pADO->Close();
  866. delete pADO;
  867. }
  868. }
  869. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS로 전광판 ON/OFF 시각 설정을 요청하였습니다.";
  870. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel16->Caption;
  871. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  872. for (int ii = 0; ii < nSelCnt; ii++)
  873. {
  874. String sVmsNmbr = FVmsIds->Strings[ii];
  875. VmsCtlrManager->InsVmsControlHs(LAST_CRCT_DT, sVmsNmbr, "V05", PANL_ON_TIME+" "+PANL_OFF_TIME, "1", LAST_CRPR_NMBR);
  876. }
  877. //FRAMEVmsStateList1->RefreshStatus();
  878. FrmVmsOprMain->RefreshVmsMessage(WM_VMS_STATE_REFRESH);
  879. }
  880. //---------------------------------------------------------------------------
  881. void __fastcall TVmsControlM::BtnModeControlClick(TObject *Sender)
  882. {
  883. //VMS 운영모드 변경
  884. String sTitle = cxLabel17->Caption;//"VMS 운영모드 변경";
  885. String sMsg = "";
  886. int nOkCnt = 0;
  887. int nSelCnt = GetSelListItems(false);
  888. if (0 == nSelCnt)
  889. {
  890. sMsg = cxLabel14->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.";
  891. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  892. FRAMEVmsStateList1->CxList->SetFocus();
  893. return;
  894. }
  895. int nCmdIdx = 0;
  896. sMsg = cxLabel18->Caption;//"선택하신 VMS의 운영모드를 변경 하시겠습니까?";
  897. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  898. String OPER_MODE;
  899. if (RdbAuto->Checked)
  900. {
  901. OPER_MODE = "A";
  902. }
  903. else
  904. if (RdbFix->Checked)
  905. {
  906. OPER_MODE = "F";
  907. }
  908. else
  909. if (RdbBase->Checked)
  910. {
  911. OPER_MODE = "B";
  912. }
  913. String sQry;
  914. TADOQuery *pADO = NULL;
  915. sQry = "UPDATE TB_VMS_CTLR \r\n"
  916. " SET OPER_MODE = :p01 \r\n"
  917. " WHERE VMS_CTLR_NMBR = :p05 \r\n";
  918. String LAST_CRPR_NMBR = g_pLOGIN->sUserId;
  919. String LAST_CRCT_DT = Now().FormatString("yyyymmddhhnnss");
  920. try
  921. {
  922. try
  923. {
  924. pADO = new TADOQuery(NULL);
  925. pADO->Close();
  926. pADO->Connection = ITSDb_GetConnection();
  927. pADO->SQL->Clear();
  928. pADO->SQL->Text = sQry;
  929. INT_VMS_MODE_REQ VmsMode;
  930. BYTE MsgSeq;
  931. memset(&VmsMode, 0x00, sizeof(VmsMode));
  932. MsgSeq = (BYTE)0x50;
  933. memcpy(VmsMode.CmdTime, AnsiString(LAST_CRCT_DT).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  934. memcpy(VmsMode.OperId, AnsiString(LAST_CRPR_NMBR).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  935. for (int ii = 0; ii < nSelCnt; ii++)
  936. {
  937. String sVmsNmbr = FVmsIds->Strings[ii];
  938. pADO->Parameters->ParamByName("p01")->Value = OPER_MODE;
  939. pADO->Parameters->ParamByName("p05")->Value = sVmsNmbr;
  940. pADO->ExecSQL();
  941. nOkCnt++;
  942. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  943. if (pObj)
  944. {
  945. pObj->OPER_MODE = OPER_MODE;
  946. if (pObj->OPER_MODE == "A") pObj->STATE.OprMode = 'A';
  947. else if (pObj->OPER_MODE == "B") pObj->STATE.OprMode = 'B';
  948. else pObj->STATE.OprMode = 'F';
  949. }
  950. else continue;
  951. VmsMode.Unit[VmsMode.Count].VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0); /* VMS 제어기 번호 */
  952. if (OPER_MODE == "A") VmsMode.Unit[VmsMode.Count].Mode = 'A';
  953. else if (OPER_MODE == "B") VmsMode.Unit[VmsMode.Count].Mode = 'B';
  954. else VmsMode.Unit[VmsMode.Count].Mode = 'F';
  955. VmsMode.Count++;
  956. if (VmsMode.Count >= INT_VMS_MAX_MODE)
  957. {
  958. CComm_VmsModeReq(&VmsMode, MsgSeq);
  959. }
  960. }
  961. if (VmsMode.Count > 0)
  962. {
  963. CComm_VmsModeReq(&VmsMode, MsgSeq);
  964. }
  965. }
  966. catch(EDatabaseError &E)
  967. {
  968. DBERRORLOG("TVMS0500M::BtnModeControlClick", String(E.ClassName()), E.Message, sQry);
  969. throw Exception(String(E.ClassName()) + E.Message);
  970. }
  971. catch(Exception &e)
  972. {
  973. DBERRORLOG("TVMS0500M::BtnModeControlClick", String(e.ClassName()), e.Message, sQry);
  974. throw Exception(String(e.ClassName()) + e.Message);
  975. }
  976. }
  977. __finally
  978. {
  979. if (pADO)
  980. {
  981. pADO->Close();
  982. delete pADO;
  983. }
  984. }
  985. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS 운영모드를 변경하였습니다.";
  986. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel19->Caption;//;
  987. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  988. for (int ii = 0; ii < nSelCnt; ii++)
  989. {
  990. String sVmsNmbr = FVmsIds->Strings[ii];
  991. VmsCtlrManager->InsVmsControlHs(LAST_CRCT_DT, sVmsNmbr, "V06", OPER_MODE, "1", LAST_CRPR_NMBR);
  992. }
  993. //FRAMEVmsStateList1->RefreshStatus();
  994. FrmVmsOprMain->RefreshVmsMessage(WM_VMS_STATE_REFRESH);
  995. }
  996. //---------------------------------------------------------------------------
  997. void __fastcall TVmsControlM::BtnWebCamUrlClick(TObject *Sender)
  998. {
  999. if (FSelVmsObj)
  1000. {
  1001. if (FSelVmsObj->WEB_CMRA_IP.Trim() != "")
  1002. {
  1003. String sUrl = "http://" + FSelVmsObj->WEB_CMRA_IP.Trim();
  1004. if (FSelVmsObj->WEB_CMRA_PORT != "")
  1005. {
  1006. sUrl = sUrl + ":" + FSelVmsObj->WEB_CMRA_PORT;
  1007. }
  1008. ShellExecute(NULL, NULL, sUrl.c_str(), NULL, NULL, 0);
  1009. }
  1010. }
  1011. }
  1012. //---------------------------------------------------------------------------
  1013. void __fastcall TVmsControlM::BtnDefaultMsgClick(TObject *Sender)
  1014. {
  1015. TcxButton *pBtn = (TcxButton*)Sender;
  1016. String sTitle = pBtn->Caption.Trim();
  1017. String sMsg = "";
  1018. String sCmd = "";
  1019. String sCmdValue;
  1020. BYTE ucCommand;
  1021. int nOkCnt = 0;
  1022. int nSelCnt = GetSelListItems(true);
  1023. if (0 == nSelCnt)
  1024. {
  1025. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1026. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1027. FRAMEVmsStateList1->CxList->SetFocus();
  1028. return;
  1029. }
  1030. if (pBtn->Tag == 0)
  1031. {
  1032. // Default Msg Display
  1033. sMsg = cxLabel20->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 기본메시지 표출 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1034. sCmd = "V11";
  1035. sCmdValue = "D";
  1036. ucCommand = 0x55;
  1037. }
  1038. else
  1039. {
  1040. // Blank Display
  1041. sMsg = cxLabel21->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 Blank 표출 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1042. sCmd = "V12";
  1043. sCmdValue = "B";
  1044. ucCommand = 0x54;
  1045. }
  1046. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1047. String sCmdUser = g_pLOGIN->sUserId;
  1048. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1049. int result;
  1050. for (int ii = 0; ii < nSelCnt; ii++)
  1051. {
  1052. String sVmsNmbr = FVmsIds->Strings[ii];
  1053. INT_VMS_DIRECT_CTL_REQ directCmd;
  1054. BYTE MsgSeq;
  1055. memset(&directCmd, 0x00, sizeof(directCmd));
  1056. MsgSeq = (BYTE)0x60;
  1057. memcpy(directCmd.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1058. memcpy(directCmd.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  1059. memcpy(directCmd.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1060. directCmd.Command = ucCommand;
  1061. result = CComm_VmsDirectCmdReq(&directCmd, MsgSeq);
  1062. if (VERR_NONE == result)
  1063. {
  1064. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sCmd, sCmdValue, "1", sCmdUser);
  1065. nOkCnt++;
  1066. }
  1067. else
  1068. {
  1069. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sCmd, sCmdValue, "0", sCmdUser);
  1070. }
  1071. Sleep(100);
  1072. Application->ProcessMessages();
  1073. }
  1074. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS에 명령을 요청하였습니다.";
  1075. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel22->Caption;
  1076. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1077. }
  1078. //---------------------------------------------------------------------------
  1079. void __fastcall TVmsControlM::BtnParamSettingClick(TObject *Sender)
  1080. {
  1081. #if 0
  1082. //제어기함체환경설정
  1083. int nCommErrTime = SeCommErrTime->Value;// = 60; //통신장애 기본값(Default=60초)
  1084. int nSlotCommErr = SeSlotCommErr->Value;// = 0; //FSelVmsObj->CMNCFAIL_SLOT_NMBR = (int)pReq->SlotCommErr; // NUMBER(4) Y 0 통신장애 SLOT 번호
  1085. int nSlotPowerErr = SeSlotPowerErr->Value;// = 0; //FSelVmsObj->PWER_FAIL_SLOT_NMBR = (int)pReq->SlotPowerErr; // NUMBER(4) Y 0 전원 장애 SLOT 번호
  1086. int nLumNight = SeLumNight->Value;// = FSelVmsObj->VMS_NGHT_BRGH_STEP;
  1087. int nLumDay = SeLumDay->Value;// = FSelVmsObj->VMS_WEEK_BRGH_STEP;
  1088. int nModErrRate = SeModRate->Value;// = FSelVmsObj->VMS_MODL_ERR_RATE;
  1089. int nModChkCycle = SeModCycle->Value;// = FSelVmsObj->VMS_MODL_CHK_CYCL;
  1090. int nPhaseCycle = SeMsgTime->Value;// = FSelVmsObj->DEF_PHSE_CHNG_CYCL;
  1091. String sTitle = cxLabel23->Caption;//"VMS 함체환경 설정";
  1092. String sMsg = "";
  1093. int nOkCnt = 0;
  1094. int nSelCnt = GetSelListItems(true);
  1095. if (0 == nSelCnt)
  1096. {
  1097. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1098. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1099. FRAMEVmsStateList1->CxList->SetFocus();
  1100. return;
  1101. }
  1102. int nCmdIdx = 0;
  1103. sMsg = cxLabel24->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 함체환경 설정 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1104. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1105. String sCmdUser = g_pLOGIN->sUserId;
  1106. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1107. String sCmdValue;
  1108. sCmdValue.printf(L"%d.%d,%d,%d,%d,%d,%d",
  1109. nLumNight,
  1110. nLumDay,
  1111. nModErrRate,
  1112. nModChkCycle,
  1113. nPhaseCycle,
  1114. nCommErrTime,
  1115. nSlotCommErr);
  1116. int result;
  1117. for (int ii = 0; ii < nSelCnt; ii++)
  1118. {
  1119. String sVmsNmbr = FVmsIds->Strings[ii];
  1120. INT_VMS_PARA_SET_REQ2 VmsPara;
  1121. BYTE MsgSeq;
  1122. memset(&VmsPara, 0x00, sizeof(VmsPara));
  1123. MsgSeq = (BYTE)0x40;
  1124. memcpy(VmsPara.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1125. memcpy(VmsPara.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  1126. memcpy(VmsPara.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1127. VmsPara.DefCommErr = (BYTE)nCommErrTime; // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
  1128. VmsPara.SlotCommErr = (short)nSlotCommErr; // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
  1129. VmsPara.SlotPowerErr = (short)nSlotPowerErr; // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
  1130. VmsPara.NightLuminance = (BYTE)nLumNight; // 야간 휘도 값, 0x30 ~ 0x3F
  1131. VmsPara.DayLuminance = (BYTE)nLumDay; // 주간 휘도 값, 0x40 ~ 0x4F
  1132. VmsPara.PhaseCycleTime = (BYTE)nPhaseCycle; // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
  1133. VmsPara.ModuleFailRate = (BYTE)nModErrRate; // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
  1134. VmsPara.ModuleCheckTime = (BYTE)nModChkCycle; // 모듈감시 주기, 0 ~ 255 (단위:초)
  1135. VmsPara.BoardOnHour = (BYTE)cxDisplayTimeOn->Time.FormatString("HH").ToIntDef(0); // 전광판 On time(시), 0시 ~ 23시
  1136. VmsPara.BoardOnMin = (BYTE)cxDisplayTimeOn->Time.FormatString("NN").ToIntDef(0); // 전광판 On time(분), 0시 ~ 23시
  1137. VmsPara.BoardOffHour = (BYTE)cxDisplayTimeOff->Time.FormatString("HH").ToIntDef(0); // 전광판 Off time(시), 0시 ~ 23시
  1138. VmsPara.BoardOffMin = (BYTE)cxDisplayTimeOff->Time.FormatString("NN").ToIntDef(0); // 전광판 Off time(분), 0시 ~ 23시
  1139. result = CComm_VmsParaSetReq2(&VmsPara, MsgSeq);
  1140. if (VERR_NONE == result)
  1141. {
  1142. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "1", sCmdUser);
  1143. nOkCnt++;
  1144. //통신전송후 바이트오더링이 바뀐다
  1145. VmsPara.SlotCommErr = (short)nSlotCommErr;
  1146. VmsPara.SlotPowerErr = (short)nSlotPowerErr;
  1147. if (UpdateVmsParam2(sVmsNmbr, (void*)&VmsPara))
  1148. {
  1149. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  1150. if (pObj)
  1151. {
  1152. #if 0
  1153. pObj->VMS_CMNC_ERR_BASS_VAL = (int)VmsPara.DefCommErr;
  1154. pObj->CMNCFAIL_SLOT_NMBR = (int)VmsPara.SlotCommErr; // NUMBER(4) Y 0 통신장애 SLOT 번호
  1155. pObj->PWER_FAIL_SLOT_NMBR = (int)VmsPara.SlotPowerErr; // NUMBER(4) Y 0 전원 장애 SLOT 번호
  1156. pObj->VMS_NGHT_BRGH_STEP = (int)VmsPara.NightLuminance;
  1157. pObj->VMS_WEEK_BRGH_STEP = (int)VmsPara.DayLuminance;
  1158. pObj->DEF_PHSE_CHNG_CYCL = (int)VmsPara.PhaseCycleTime;
  1159. pObj->VMS_MODL_ERR_RATE = (int)VmsPara.ModuleFailRate;
  1160. pObj->VMS_MODL_CHK_CYCL = (int)VmsPara.ModuleCheckTime;
  1161. pObj->PANL_ON_TIME.printf(L"%02d%02d", (int)VmsPara.BoardOnHour, (int)VmsPara.BoardOnMin);
  1162. pObj->PANL_OFF_TIME.printf(L"%02d%02d", (int)VmsPara.BoardOffHour, (int)VmsPara.BoardOffMin);
  1163. pObj->DEF_PHSE_CHNG_CYCL = nPhaseCycle;
  1164. pObj->STATE.ScheduledMessageOperatingTime = pObj->DEF_PHSE_CHNG_CYCL; /* 필수 계획된 메시지의 동작시간(초) */
  1165. //pObj->STATE.ModuleOperatingTemperature = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  1166. pObj->STATE.ModuleBasicFailureRate = pObj->VMS_MODL_ERR_RATE; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  1167. #endif
  1168. }
  1169. }
  1170. }
  1171. else
  1172. {
  1173. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "0", sCmdUser);
  1174. }
  1175. Sleep(100);
  1176. Application->ProcessMessages();
  1177. }
  1178. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS 함체환경 설정 명령을 요청하였습니다.";
  1179. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel25->Caption;
  1180. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1181. #if 0
  1182. //제어기함체환경설정
  1183. int nCommErrTime = SeCommErrTime->Value;// = 60; //통신장애 기본값(Default=60초)
  1184. int nSlotCommErr = SeSlotCommErr->Value;// = 0; //FSelVmsObj->CMNCFAIL_SLOT_NMBR = (int)pReq->SlotCommErr; // NUMBER(4) Y 0 통신장애 SLOT 번호
  1185. int nSlotPowerErr = SeSlotPowerErr->Value;// = 0; //FSelVmsObj->PWER_FAIL_SLOT_NMBR = (int)pReq->SlotPowerErr; // NUMBER(4) Y 0 전원 장애 SLOT 번호
  1186. int nLumNight = SeLumNight->Value;// = FSelVmsObj->VMS_NGHT_BRGH_STEP;
  1187. int nLumDay = SeLumDay->Value;// = FSelVmsObj->VMS_WEEK_BRGH_STEP;
  1188. int nModErrRate = SeModRate->Value;// = FSelVmsObj->VMS_MODL_ERR_RATE;
  1189. int nModChkCycle = SeModCycle->Value;// = FSelVmsObj->VMS_MODL_CHK_CYCL;
  1190. int nPhaseCycle = SeMsgTime->Value;// = FSelVmsObj->DEF_PHSE_CHNG_CYCL;
  1191. String sTitle = cxLabel23->Caption;//"VMS 함체환경 설정";
  1192. String sMsg = "";
  1193. int nOkCnt = 0;
  1194. int nSelCnt = GetSelListItems(true);
  1195. if (0 == nSelCnt)
  1196. {
  1197. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1198. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1199. FRAMEVmsStateList1->CxList->SetFocus();
  1200. return;
  1201. }
  1202. int nCmdIdx = 0;
  1203. sMsg = cxLabel24->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 함체환경 설정 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1204. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1205. String sCmdUser = g_pLOGIN->sUserId;
  1206. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1207. String sCmdValue;
  1208. sCmdValue.printf(L"%d.%d,%d,%d,%d,%d,%d",
  1209. nLumNight,
  1210. nLumDay,
  1211. nModErrRate,
  1212. nModChkCycle,
  1213. nPhaseCycle,
  1214. nCommErrTime,
  1215. nSlotCommErr);
  1216. int result;
  1217. for (int ii = 0; ii < nSelCnt; ii++)
  1218. {
  1219. String sVmsNmbr = FVmsIds->Strings[ii];
  1220. INT_VMS_PARA_SET_REQ2 VmsPara;
  1221. BYTE MsgSeq;
  1222. memset(&VmsPara, 0x00, sizeof(VmsPara));
  1223. MsgSeq = (BYTE)0x40;
  1224. memcpy(VmsPara.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1225. memcpy(VmsPara.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  1226. memcpy(VmsPara.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1227. VmsPara.DefCommErr = (BYTE)nCommErrTime; // 통신장애 기본값, 제어기가 Host로부터 Poll 또는 명령을 받지 않고 경과할 수 있는 최대시간 (default ; 60초)
  1228. VmsPara.SlotCommErr = (short)nSlotCommErr; // 통신장애 slot번호, 통신 fail 시 표시할 메시지 번호(default 0번)
  1229. VmsPara.SlotPowerErr = (short)nSlotPowerErr; // 전원장애 slot번호, 전원장애 시 표시할 메시지 번호(default 0번)
  1230. VmsPara.NightLuminance = (BYTE)nLumNight; // 야간 휘도 값, 0x30 ~ 0x3F
  1231. VmsPara.DayLuminance = (BYTE)nLumDay; // 주간 휘도 값, 0x40 ~ 0x4F
  1232. VmsPara.PhaseCycleTime = (BYTE)nPhaseCycle; // phase시간주기, 장애시 phase주기 (default : 3초, 범위 : 0 ~ 10초)
  1233. VmsPara.ModuleFailRate = (BYTE)nModErrRate; // 모듈장애율, 한개의 module을 장애로 처리하기 위한 장애 pixel백분율 (default 10%)
  1234. VmsPara.ModuleCheckTime = (BYTE)nModChkCycle; // 모듈감시 주기, 0 ~ 255 (단위:초)
  1235. VmsPara.BoardOnHour = (BYTE)cxDisplayTimeOn->Time.FormatString("HH").ToIntDef(0); // 전광판 On time(시), 0시 ~ 23시
  1236. VmsPara.BoardOnMin = (BYTE)cxDisplayTimeOn->Time.FormatString("NN").ToIntDef(0); // 전광판 On time(분), 0시 ~ 23시
  1237. VmsPara.BoardOffHour = (BYTE)cxDisplayTimeOff->Time.FormatString("HH").ToIntDef(0); // 전광판 Off time(시), 0시 ~ 23시
  1238. VmsPara.BoardOffMin = (BYTE)cxDisplayTimeOff->Time.FormatString("NN").ToIntDef(0); // 전광판 Off time(분), 0시 ~ 23시
  1239. result = CComm_VmsParaSetReq2(&VmsPara, MsgSeq);
  1240. if (VERR_NONE == result)
  1241. {
  1242. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "1", sCmdUser);
  1243. nOkCnt++;
  1244. //통신전송후 바이트오더링이 바뀐다
  1245. VmsPara.SlotCommErr = (short)nSlotCommErr;
  1246. VmsPara.SlotPowerErr = (short)nSlotPowerErr;
  1247. if (UpdateVmsParam2(sVmsNmbr, (void*)&VmsPara))
  1248. {
  1249. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  1250. if (pObj)
  1251. {
  1252. #if 0
  1253. pObj->VMS_CMNC_ERR_BASS_VAL = (int)VmsPara.DefCommErr;
  1254. pObj->CMNCFAIL_SLOT_NMBR = (int)VmsPara.SlotCommErr; // NUMBER(4) Y 0 통신장애 SLOT 번호
  1255. pObj->PWER_FAIL_SLOT_NMBR = (int)VmsPara.SlotPowerErr; // NUMBER(4) Y 0 전원 장애 SLOT 번호
  1256. pObj->VMS_NGHT_BRGH_STEP = (int)VmsPara.NightLuminance;
  1257. pObj->VMS_WEEK_BRGH_STEP = (int)VmsPara.DayLuminance;
  1258. pObj->DEF_PHSE_CHNG_CYCL = (int)VmsPara.PhaseCycleTime;
  1259. pObj->VMS_MODL_ERR_RATE = (int)VmsPara.ModuleFailRate;
  1260. pObj->VMS_MODL_CHK_CYCL = (int)VmsPara.ModuleCheckTime;
  1261. pObj->PANL_ON_TIME.printf(L"%02d%02d", (int)VmsPara.BoardOnHour, (int)VmsPara.BoardOnMin);
  1262. pObj->PANL_OFF_TIME.printf(L"%02d%02d", (int)VmsPara.BoardOffHour, (int)VmsPara.BoardOffMin);
  1263. pObj->DEF_PHSE_CHNG_CYCL = nPhaseCycle;
  1264. pObj->STATE.ScheduledMessageOperatingTime = pObj->DEF_PHSE_CHNG_CYCL; /* 필수 계획된 메시지의 동작시간(초) */
  1265. //pObj->STATE.ModuleOperatingTemperature = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
  1266. pObj->STATE.ModuleBasicFailureRate = pObj->VMS_MODL_ERR_RATE; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
  1267. #endif
  1268. }
  1269. }
  1270. }
  1271. else
  1272. {
  1273. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V04", sCmdValue, "0", sCmdUser);
  1274. }
  1275. Sleep(100);
  1276. Application->ProcessMessages();
  1277. }
  1278. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS 함체환경 설정 명령을 요청하였습니다.";
  1279. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel25->Caption;
  1280. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1281. #endif
  1282. #endif
  1283. }
  1284. //---------------------------------------------------------------------------
  1285. bool __fastcall TVmsControlM::UpdateVmsParam2(String AVmsNmbr, void *pData)
  1286. {
  1287. String sQry;
  1288. TADOQuery *pADO = NULL;
  1289. int nCnt = 0;
  1290. INT_VMS_PARA_SET_REQ2 *pReq = (INT_VMS_PARA_SET_REQ2*)pData;
  1291. sQry = "UPDATE TB_VMS_CTLR \r\n"
  1292. " SET VMS_CMNC_ERR_BASS_VAL = :p02, \r\n"
  1293. " CMNCFAIL_SLOT_NMBR = :p03, \r\n"
  1294. " PWER_FAIL_SLOT_NMBR = :p04, \r\n"
  1295. " VMS_NGHT_BRGH_STEP = :p05, \r\n"
  1296. " VMS_WEEK_BRGH_STEP = :p06, \r\n"
  1297. " VMS_MODL_ERR_RATE = :p07, \r\n"
  1298. " VMS_MODL_CHK_CYCL = :p08, \r\n"
  1299. " DEF_PHSE_CHNG_CYCL = :p09, \r\n"
  1300. " PANL_ON_TIME = :p10, \r\n"
  1301. " PANL_OFF_TIME = :p11 \r\n"
  1302. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  1303. try
  1304. {
  1305. try
  1306. {
  1307. pADO = new TADOQuery(NULL);
  1308. pADO->Close();
  1309. pADO->Connection = ITSDb_GetConnection();
  1310. pADO->SQL->Clear();
  1311. pADO->SQL->Text = sQry;
  1312. String sOn, sOff;
  1313. sOn.printf(L"%02d%02d", (int)pReq->BoardOnHour, (int)pReq->BoardOnMin);
  1314. sOff.printf(L"%02d%02d", (int)pReq->BoardOffHour, (int)pReq->BoardOffMin);
  1315. pADO->Parameters->ParamByName("p01")->Value = AVmsNmbr;
  1316. pADO->Parameters->ParamByName("p02")->Value = (int)pReq->DefCommErr;
  1317. pADO->Parameters->ParamByName("p03")->Value = (int)pReq->SlotCommErr;
  1318. pADO->Parameters->ParamByName("p04")->Value = (int)pReq->SlotPowerErr;
  1319. pADO->Parameters->ParamByName("p05")->Value = (int)pReq->NightLuminance;
  1320. pADO->Parameters->ParamByName("p06")->Value = (int)pReq->DayLuminance;
  1321. pADO->Parameters->ParamByName("p07")->Value = (int)pReq->ModuleFailRate;
  1322. pADO->Parameters->ParamByName("p08")->Value = (int)pReq->ModuleCheckTime;
  1323. pADO->Parameters->ParamByName("p09")->Value = (int)pReq->PhaseCycleTime;
  1324. pADO->Parameters->ParamByName("p10")->Value = sOn;
  1325. pADO->Parameters->ParamByName("p11")->Value = sOff;
  1326. nCnt = pADO->ExecSQL();
  1327. }
  1328. catch(EDatabaseError &E)
  1329. {
  1330. DBERRORLOG("VMS Parameter Save", String(E.ClassName()), E.Message, sQry);
  1331. throw Exception(String(E.ClassName()) + E.Message);
  1332. }
  1333. catch(Exception &e)
  1334. {
  1335. DBERRORLOG("VMS Parameter Save", String(e.ClassName()), e.Message, sQry);
  1336. throw Exception(String(e.ClassName()) + e.Message);
  1337. }
  1338. }
  1339. __finally
  1340. {
  1341. if (pADO)
  1342. {
  1343. pADO->Close();
  1344. delete pADO;
  1345. }
  1346. }
  1347. return nCnt > 0 ? true : false;
  1348. }
  1349. //---------------------------------------------------------------------------
  1350. void __fastcall TVmsControlM::BtnDefMsgDownloadClick(TObject *Sender)
  1351. {
  1352. //
  1353. }
  1354. //---------------------------------------------------------------------------
  1355. void __fastcall TVmsControlM::BtnDisplayTimeSetClick(TObject *Sender)
  1356. {
  1357. //폼 표출주기 설정
  1358. String sTitle = cxLabel26->Caption;//"폼 표출주기 설정";
  1359. String sMsg = "";
  1360. int nOkCnt = 0;
  1361. int nSelCnt = GetSelListItems(false);
  1362. if (0 == nSelCnt)
  1363. {
  1364. sMsg = cxLabel14->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.";
  1365. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1366. FRAMEVmsStateList1->CxList->SetFocus();
  1367. return;
  1368. }
  1369. int nCmdIdx = 0;
  1370. sMsg = cxLabel27->Caption;//"선택하신 VMS의 폼 표출 주기를 설정 하시겠습니까?";
  1371. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1372. String sQry;
  1373. TADOQuery *pADO = NULL;
  1374. sQry = "UPDATE TB_VMS_CTLR \r\n"
  1375. " SET VMS_PHSE_CHNG_CYCL = :p02 \r\n"
  1376. " WHERE VMS_CTLR_NMBR = :p01 \r\n";
  1377. String LAST_CRPR_NMBR = g_pLOGIN->sUserId;
  1378. String LAST_CRCT_DT = Now().FormatString("yyyymmddhhnnss");
  1379. int VMS_PHSE_CHNG_CYCL = SeFormCycleTime->Value;
  1380. try
  1381. {
  1382. try
  1383. {
  1384. pADO = new TADOQuery(NULL);
  1385. pADO->Close();
  1386. pADO->Connection = ITSDb_GetConnection();
  1387. pADO->SQL->Clear();
  1388. pADO->SQL->Text = sQry;
  1389. for (int ii = 0; ii < nSelCnt; ii++)
  1390. {
  1391. String sVmsNmbr = FVmsIds->Strings[ii];
  1392. pADO->Parameters->ParamByName("p01")->Value = sVmsNmbr;
  1393. pADO->Parameters->ParamByName("p02")->Value = VMS_PHSE_CHNG_CYCL;
  1394. pADO->ExecSQL();
  1395. nOkCnt++;
  1396. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(sVmsNmbr);
  1397. if (pObj)
  1398. {
  1399. //pObj->VMS_PHSE_CHNG_CYCL = VMS_PHSE_CHNG_CYCL;
  1400. }
  1401. }
  1402. }
  1403. catch(EDatabaseError &E)
  1404. {
  1405. DBERRORLOG("VMS Config Save", String(E.ClassName()), E.Message, sQry);
  1406. throw Exception(String(E.ClassName()) + E.Message);
  1407. }
  1408. catch(Exception &e)
  1409. {
  1410. DBERRORLOG("VMS Config Save", String(e.ClassName()), e.Message, sQry);
  1411. throw Exception(String(e.ClassName()) + e.Message);
  1412. }
  1413. }
  1414. __finally
  1415. {
  1416. if (pADO)
  1417. {
  1418. pADO->Close();
  1419. delete pADO;
  1420. }
  1421. }
  1422. //sMsg = String(nSelCnt) + " 개의 선택 VMS 중에 " + String(nOkCnt) + " 개의 VMS의 폼 표출주기를 설정하였습니다.";
  1423. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel28->Caption;
  1424. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1425. for (int ii = 0; ii < nSelCnt; ii++)
  1426. {
  1427. String sVmsNmbr = FVmsIds->Strings[ii];
  1428. VmsCtlrManager->InsVmsControlHs(LAST_CRCT_DT, sVmsNmbr, "V09", String(VMS_PHSE_CHNG_CYCL), "1", LAST_CRPR_NMBR);
  1429. }
  1430. //FRAMEVmsStateList1->RefreshStatus();
  1431. FrmVmsOprMain->RefreshVmsMessage(WM_VMS_STATE_REFRESH);
  1432. }
  1433. //---------------------------------------------------------------------------
  1434. void __fastcall TVmsControlM::BtnMsgImmediateDownloadClick(TObject *Sender)
  1435. {
  1436. //폼 표출주기 설정
  1437. String sTitle = cxLabel30->Caption;//"폼 즉시 다운로드";
  1438. String sMsg = "";
  1439. sMsg = cxLabel31->Caption;//"폼 메시지를 지금 즉시 제어기로 다운로드 하시겠습니까?";
  1440. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1441. String sCmdUser = g_pLOGIN->sUserId;
  1442. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1443. #if 0
  1444. INT_VMS_STATE_REQ Req;
  1445. memset((char*)&Req, 0x00, sizeof(Req));
  1446. Req.Count = 0;
  1447. Req.Type = vms_req_state_all;
  1448. CComm_VmsStateReq(&Req);
  1449. #endif
  1450. BYTE MsgSeq;
  1451. INT_VMS_COMMON_REQ directCmd;
  1452. memset(&directCmd, 0x00, sizeof(directCmd));
  1453. MsgSeq = (BYTE)0x80;
  1454. memcpy(directCmd.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1455. memcpy(directCmd.VmsId, AnsiString("10001").c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  1456. memcpy(directCmd.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1457. directCmd.Command = 0x01;
  1458. int result = CComm_VmsCommonReq(&directCmd, MsgSeq);
  1459. if (VERR_NONE == result)
  1460. {
  1461. //VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Download", "1", sCmdUser);
  1462. }
  1463. else
  1464. {
  1465. //VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Download", "0", sCmdUser);
  1466. }
  1467. Sleep(100);
  1468. Application->ProcessMessages();
  1469. sMsg = cxLabel32->Caption;//"VMS 폼 메시지 즉시 전송을 요청하였습니다.";
  1470. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1471. FOR_STL(TVmsCtlr*, pObj, VmsCtlrManager->FLists)
  1472. {
  1473. String sVmsNmbr = (pObj->VMS_CTLR_NMBR);
  1474. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Immediately Download", "1", sCmdUser);
  1475. }
  1476. BtnMsgImmediateDownload->Enabled = false;
  1477. TmrCommand->Enabled = true;
  1478. }
  1479. //---------------------------------------------------------------------------
  1480. void __fastcall TVmsControlM::TmrCommandTimer(TObject *Sender)
  1481. {
  1482. TmrCommand->Enabled = false;
  1483. BtnImdFromDnld->Enabled = true;
  1484. }
  1485. //---------------------------------------------------------------------------
  1486. void __fastcall TVmsControlM::PgControlPageChanging(TObject *Sender, TcxTabSheet *NewPage,
  1487. bool &AllowChange)
  1488. {
  1489. if (NewPage == TabPing)
  1490. {
  1491. BtnAllSelect->Visible = false;
  1492. BtnAllClear->Visible = false;
  1493. BtnReverse->Visible = false;
  1494. }
  1495. else
  1496. {
  1497. if (BtnAllSelect->Visible == false) BtnAllSelect->Visible = true;;
  1498. if (BtnAllClear->Visible == false) BtnAllClear->Visible = true;;
  1499. if (BtnReverse->Visible == false) BtnReverse->Visible = true;;
  1500. }
  1501. }
  1502. //---------------------------------------------------------------------------
  1503. void __fastcall TVmsControlM::UpdatePingList()
  1504. {
  1505. CMM_ClearGridTableView(TvPing);
  1506. int ii, jj;
  1507. int nCols = 0;
  1508. TcxDataController *pGDC = TvPing->DataController;
  1509. TvPing->BeginUpdate();
  1510. pGDC->BeginUpdate();
  1511. VmsCtlrManager->FLists.Lock();
  1512. try
  1513. {
  1514. int nRow;
  1515. FOR_STL(TVmsCtlr*, pObj, VmsCtlrManager->FLists)
  1516. {
  1517. if (pObj->DEL_YN == "Y") continue;
  1518. nRow = pGDC->AppendRecord();
  1519. if (pObj->STATE.Comm == vms_comm_normal) pGDC->Values[nRow][ColumnSel->Index] = false;
  1520. else pGDC->Values[nRow][ColumnSel->Index] = true;
  1521. pGDC->Values[nRow][Col01->Index] = (pObj->VMS_CTLR_NMBR);
  1522. pGDC->Values[nRow][Col02->Index] = pObj->VMS_CTLR_ID;
  1523. pGDC->Values[nRow][Col03->Index] = pObj->VMS_NM;
  1524. pGDC->Values[nRow][Col04->Index] = VmsComm(pObj); //통신상태
  1525. pGDC->Values[nRow][Col05->Index] = pObj->VMS_CTLR_IP;
  1526. pGDC->Values[nRow][Col06->Index] = "-";
  1527. pGDC->Values[nRow][Col07->Index] = "-";
  1528. pGDC->Values[nRow][Col08->Index] = "-";
  1529. pGDC->Values[nRow][Col09->Index] = pObj->WEB_CMRA_IP;
  1530. pGDC->Values[nRow][Col10->Index] = "-";
  1531. pGDC->Values[nRow][Col11->Index] = "-";
  1532. pGDC->Values[nRow][Col12->Index] = "-";
  1533. pGDC->Values[nRow][Col99->Index] = (int)pObj;
  1534. }
  1535. }
  1536. __finally
  1537. {
  1538. VmsCtlrManager->FLists.UnLock();
  1539. pGDC->EndUpdate();
  1540. TvPing->EndUpdate();
  1541. }
  1542. }
  1543. //---------------------------------------------------------------------------
  1544. void __fastcall TVmsControlM::RefreshPingList(bool AInit/*=false*/)
  1545. {
  1546. TcxDataController *pGDC = TvPing->DataController;
  1547. try
  1548. {
  1549. TvPing->BeginUpdate();
  1550. pGDC->BeginUpdate();
  1551. int nRows = pGDC->RecordCount;
  1552. for(int nRow = 0; nRow < nRows; nRow++)
  1553. {
  1554. int nMemPtr = TvPing->DataController->Values[nRow][Col99->Index];
  1555. TVmsCtlr *pObj = (TVmsCtlr*)nMemPtr;
  1556. if (!pObj) continue;
  1557. if (AInit == false && PgControl->Properties->ActivePage != TabPing)
  1558. {
  1559. if (pObj->STATE.Comm == vms_comm_normal) pGDC->Values[nRow][ColumnSel->Index] = false;
  1560. else pGDC->Values[nRow][ColumnSel->Index] = true;
  1561. }
  1562. if (AInit)
  1563. {
  1564. pGDC->Values[nRow][Col06->Index] = "-";
  1565. pGDC->Values[nRow][Col07->Index] = "-";
  1566. pGDC->Values[nRow][Col08->Index] = "-";
  1567. pGDC->Values[nRow][Col10->Index] = "-";
  1568. pGDC->Values[nRow][Col11->Index] = "-";
  1569. pGDC->Values[nRow][Col12->Index] = "-";
  1570. }
  1571. pGDC->Values[nRow][Col04->Index] = VmsComm(pObj); //통신상태
  1572. }
  1573. }
  1574. __finally
  1575. {
  1576. pGDC->EndUpdate();
  1577. TvPing->EndUpdate();
  1578. }
  1579. }
  1580. //---------------------------------------------------------------------------
  1581. void __fastcall TVmsControlM::PingNetwork(String AIp, int APort)
  1582. {
  1583. try
  1584. {
  1585. IdIcmpClient1->Host = AIp;
  1586. IdIcmpClient1->Port = EdPingPort->Value/*512*/;
  1587. IdIcmpClient1->ReceiveTimeout = EdPingTimeout->Value;
  1588. IdIcmpClient1->Ping(IdIcmpClient1->Host, IdIcmpClient1->Port);
  1589. }
  1590. catch (Exception &e)
  1591. {
  1592. Application->ShowException(&e);
  1593. }
  1594. catch(...)
  1595. {
  1596. ShowMessage("Ping error[Unknown]");
  1597. }
  1598. }
  1599. //---------------------------------------------------------------------------
  1600. void __fastcall TVmsControlM::BtnNwkPingClick(TObject *Sender)
  1601. {
  1602. TWaitCursor waitCrs;
  1603. TcxDataController *pGDC = TvPing->DataController;
  1604. int nRows = pGDC->RecordCount;
  1605. String sMsg;
  1606. int nSelCnt = CMM_GetCheckCount(TvPing, ColumnSel->Index);
  1607. if (0 == nSelCnt)
  1608. {
  1609. sMsg = cxLabel14->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.";
  1610. Application->MessageBox(sMsg.c_str(), L"VMS Network Ping Test", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1611. CxPing->SetFocus();
  1612. return;
  1613. }
  1614. RefreshPingList(true);
  1615. PnlPing->Enabled = false;
  1616. String sSvrIp;
  1617. int nSvrPort;
  1618. bool bPing;
  1619. for (int ii = 0; ii < nRows; ii++)
  1620. {
  1621. bPing = pGDC->Values[ii][ColumnSel->Index];
  1622. if (!bPing) continue;
  1623. //pGDC->Values[ii][ColPingMon->Index] = Now().FormatString("yyyy-mm-dd hh:mm:ss");
  1624. FPingType = 1;
  1625. sSvrIp = pGDC->Values[ii][Col05->Index];
  1626. if (sSvrIp == NULL || sSvrIp.IsEmpty())
  1627. {
  1628. continue;
  1629. }
  1630. pGDC->Values[ii][Col06->Index] = "?";
  1631. pGDC->Values[ii][Col07->Index] = "?";
  1632. pGDC->Values[ii][Col08->Index] = "?";
  1633. nSvrPort = 0;
  1634. FPingTimeout = false;
  1635. PingNetwork(sSvrIp.Trim(), nSvrPort);
  1636. if (FPingTimeout)
  1637. {
  1638. pGDC->Values[ii][Col08->Index] = "Time out";
  1639. }
  1640. Application->ProcessMessages();
  1641. FPingType = 2;
  1642. sSvrIp = pGDC->Values[ii][Col09->Index];
  1643. if (sSvrIp == NULL || sSvrIp.IsEmpty())
  1644. {
  1645. continue;
  1646. }
  1647. pGDC->Values[ii][Col10->Index] = "?";
  1648. pGDC->Values[ii][Col11->Index] = "?";
  1649. pGDC->Values[ii][Col12->Index] = "?";
  1650. nSvrPort = 0;
  1651. FPingTimeout = false;
  1652. PingNetwork(sSvrIp.Trim(), nSvrPort);
  1653. if (FPingTimeout)
  1654. {
  1655. pGDC->Values[ii][Col12->Index] = "Time out";
  1656. }
  1657. Application->ProcessMessages();
  1658. }
  1659. PnlPing->Enabled = true;
  1660. }
  1661. //---------------------------------------------------------------------------
  1662. void __fastcall TVmsControlM::BtnNwkPingClearClick(TObject *Sender)
  1663. {
  1664. RefreshPingList(true);
  1665. }
  1666. //---------------------------------------------------------------------------
  1667. void __fastcall TVmsControlM::Col04CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
  1668. TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone)
  1669. {
  1670. try
  1671. {
  1672. TColor tColor;
  1673. String sStatus = AViewInfo->GridRecord->DisplayTexts[AViewInfo->Item->Index];
  1674. tColor = ACanvas->Brush->Color;
  1675. #if 0
  1676. if (sStatus.Pos("-")) tColor = clGray;
  1677. else if (sStatus.Pos("장애")) tColor = clRed;
  1678. else if (sStatus.Pos("켜짐")) tColor = clYellow;
  1679. else if (sStatus.Pos("열림")) tColor = clRed;
  1680. else if (sStatus.Pos("동작")) tColor = clYellow;
  1681. else if (sStatus.Pos("가동")) tColor = clYellow;
  1682. else tColor = clLime;
  1683. #else
  1684. if (sStatus.Pos("-")) tColor = clGray;
  1685. else if (sStatus.Pos(FrmLang->lblState1->Caption.Trim())) tColor = clRed;
  1686. else if (sStatus.Pos(FrmLang->lblPOWER0->Caption.Trim())) tColor = clYellow;
  1687. else if (sStatus.Pos(FrmLang->lblCDS1->Caption.Trim())) tColor = clRed;
  1688. else if (sStatus.Pos(FrmLang->lblFAN0->Caption.Trim())) tColor = clYellow;
  1689. //else if (sStatus.Pos(frmLang->lblHEAT0->Caption.Trim())) tColor = clYellow;
  1690. else tColor = clLime;
  1691. #endif
  1692. ACanvas->SetBrushColor(tColor);
  1693. ACanvas->Font->Color = clBlack;
  1694. /*if (AViewInfo->GridRecord->Selected)
  1695. {
  1696. ACanvas->Font->Color = clBlack;
  1697. }*/
  1698. }
  1699. catch(Exception &e)
  1700. {
  1701. }
  1702. }
  1703. //---------------------------------------------------------------------------
  1704. void __fastcall TVmsControlM::IdIcmpClient1Reply(TComponent *ASender, const TReplyStatus *AReplyStatus)
  1705. {
  1706. try
  1707. {
  1708. String sRcvIp = AReplyStatus->FromIpAddress;
  1709. int nRcvPort= IdIcmpClient1->Port;
  1710. if (rsTimeOut == AReplyStatus->ReplyStatusType || sRcvIp == "0.0.0.0")
  1711. {
  1712. FPingTimeout = true;
  1713. return;
  1714. }
  1715. TcxDataController *pGDC = TvPing->DataController;
  1716. int nRows = pGDC->RecordCount;
  1717. String sSvrIp;
  1718. for (int ii = 0; ii < nRows; ii++)
  1719. {
  1720. if (FPingType == 1)
  1721. sSvrIp = pGDC->Values[ii][Col05->Index];
  1722. else
  1723. sSvrIp = pGDC->Values[ii][Col09->Index];
  1724. int nSvrPort = 0;
  1725. if (sSvrIp.Trim() == sRcvIp && nRcvPort == nSvrPort)
  1726. {
  1727. if (FPingType == 1)
  1728. {
  1729. if (AReplyStatus->MsRoundTripTime > 100)
  1730. {
  1731. pGDC->Values[ii][Col08->Index] = "Delayed";
  1732. }
  1733. else
  1734. {
  1735. pGDC->Values[ii][Col08->Index] = "Normal";
  1736. }
  1737. pGDC->Values[ii][Col06->Index] = String(AReplyStatus->MsRoundTripTime) + " ";
  1738. pGDC->Values[ii][Col07->Index] = String(AReplyStatus->TimeToLive) + " ";
  1739. }
  1740. else
  1741. {
  1742. if (AReplyStatus->MsRoundTripTime > 100)
  1743. {
  1744. pGDC->Values[ii][Col12->Index] = "Delayed";
  1745. }
  1746. else
  1747. {
  1748. pGDC->Values[ii][Col12->Index] = "Normal";
  1749. }
  1750. pGDC->Values[ii][Col10->Index] = String(AReplyStatus->MsRoundTripTime) + " ";
  1751. pGDC->Values[ii][Col11->Index] = String(AReplyStatus->TimeToLive) + " ";
  1752. }
  1753. break;
  1754. }
  1755. }
  1756. }
  1757. catch(Exception &e)
  1758. {
  1759. }
  1760. }
  1761. //---------------------------------------------------------------------------
  1762. void __fastcall TVmsControlM::Col08CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
  1763. TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone)
  1764. {
  1765. try
  1766. {
  1767. int iIndex = AViewInfo->Item->Index;
  1768. ACanvas->Canvas->Brush->Style = bsSolid;
  1769. String val = AViewInfo->GridRecord->DisplayTexts[iIndex];
  1770. ACanvas->Canvas->Font->Color = clBlack;
  1771. if (val == "Normal") ACanvas->Canvas->Brush->Color = clLime;
  1772. else if (val == "Delayed") ACanvas->Canvas->Brush->Color = clRed;
  1773. else if (val == "Time out") ACanvas->Canvas->Brush->Color = clRed;
  1774. else ACanvas->Canvas->Brush->Color = clSilver;
  1775. } catch(...) {}
  1776. }
  1777. //---------------------------------------------------------------------------
  1778. void __fastcall TVmsControlM::TvPingCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  1779. TMouseButton AButton, TShiftState AShift,
  1780. bool &AHandled)
  1781. {
  1782. if (!ACellViewInfo) return;
  1783. TcxGridDataController *pGDC = TvPing->DataController;
  1784. int nRow = pGDC->FocusedRecordIndex;
  1785. if( nRow <= -1 )
  1786. return;
  1787. if (ACellViewInfo->Item->Index == Col05->Index ||
  1788. ACellViewInfo->Item->Index == Col09->Index)
  1789. {
  1790. String sSvrIp = pGDC->Values[nRow][ACellViewInfo->Item->Index];
  1791. ITSUtil_NetworkPing(sSvrIp);
  1792. }
  1793. }
  1794. //---------------------------------------------------------------------------
  1795. void __fastcall TVmsControlM::ErrorMsg(String AErrMsg)
  1796. {
  1797. LblErrMsg->Caption = AErrMsg;
  1798. LblErrMsg->BringToFront();
  1799. LblErrMsg->Transparent = true;
  1800. LblErrMsg->Style->Font->Color = clWhite;
  1801. LblErrMsg->Style->TextColor = clWhite;
  1802. LblErrMsg->Visible = true;
  1803. LblErrMsg->Refresh();
  1804. LblErrMsg->BringToFront();
  1805. }
  1806. //---------------------------------------------------------------------------
  1807. void __fastcall TVmsControlM::WebCamPlay(String AVmsNo)
  1808. {
  1809. if (LblErrMsg->Visible) LblErrMsg->Visible = false;
  1810. reMsg->Lines->Clear();
  1811. reMsg->Lines->Add("Connect...");
  1812. WebCamStop();
  1813. TVmsCtlr *pObj = VmsCtlrManager->FLists.Find(AVmsNo);
  1814. if (!pObj) return;
  1815. PnlSamsung->Caption = "Connecting...";
  1816. PnlSamsung->Refresh();
  1817. try
  1818. {
  1819. FStrmAddr = pObj->STRM_SESN_NM.Trim();
  1820. if (FStrmAddr != "")
  1821. {
  1822. FFPlayer1->AspectRatio = ChkFullScreen->Checked ? -1 : 0;
  1823. FFPlayer1->TryOpen(FStrmAddr, PnlSamsung->Handle);
  1824. FStrmUser = pObj->WEB_CMRA_ID;
  1825. FStrmPswd = pObj->WEB_CMRA_PWD;
  1826. FStrmHttp = "http://" + pObj->WEB_CMRA_IP;
  1827. if (pObj->WEB_CMRA_PORT.ToIntDef(0) != 0)
  1828. {
  1829. FStrmHttp = FStrmHttp + ":" + pObj->WEB_CMRA_PORT;
  1830. }
  1831. FStrmPlay = true;
  1832. }
  1833. }
  1834. catch(Exception &e)
  1835. {
  1836. }
  1837. }
  1838. //---------------------------------------------------------------------------
  1839. void __fastcall TVmsControlM::WebCamStop()
  1840. {
  1841. if (!FStrmPlay) return;
  1842. try
  1843. {
  1844. if (FFPlayer1->ScreenHandle != NULL)
  1845. {
  1846. FFPlayer1->Stop(true);
  1847. PostMessage(FFPlayer1->ScreenHandle, CM_INVALIDATE, 0, 0);
  1848. UpdateWindow(FFPlayer1->ScreenHandle);
  1849. //FFPlayer1->ScreenHandle = NULL;
  1850. }
  1851. }
  1852. catch(Exception &e)
  1853. {
  1854. }
  1855. PnlSamsung->Caption = "Disconnected";
  1856. PnlSamsung->Refresh();
  1857. FStrmPlay = false;
  1858. }
  1859. //---------------------------------------------------------------------------
  1860. void __fastcall TVmsControlM::BtnImdFromDnldClick(TObject *Sender)
  1861. {
  1862. //폼 즉시 다운로드
  1863. String sTitle = cxLabel30->Caption;//"폼 즉시 다운로드";
  1864. String sMsg = "";
  1865. int nOkCnt = 0;
  1866. int nSelCnt = GetSelListItems(true);
  1867. if (0 == nSelCnt)
  1868. {
  1869. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1870. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1871. FRAMEVmsStateList1->CxList->SetFocus();
  1872. return;
  1873. }
  1874. sMsg = cxLabel31->Caption;//"폼 메시지를 지금 즉시 제어기로 다운로드 하시겠습니까?";
  1875. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1876. String sCmdUser = g_pLOGIN->sUserId;
  1877. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1878. BYTE MsgSeq;
  1879. INT_VMS_IMMEDIATE_SCENARIO_DNLD_REQ directCmd;
  1880. memset(&directCmd, 0x00, sizeof(directCmd));
  1881. MsgSeq = (BYTE)0x80;
  1882. memcpy(directCmd.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1883. memcpy(directCmd.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1884. for (int ii = 0; ii < nSelCnt; ii++)
  1885. {
  1886. String sVmsNmbr = FVmsIds->Strings[ii];
  1887. directCmd.VMS_CTLR_NMBR[ii] = sVmsNmbr.ToIntDef(0);
  1888. }
  1889. directCmd.Count = (BYTE)nSelCnt;
  1890. int result = CComm_VmsImmediateScenarioDnldReq(&directCmd, MsgSeq);
  1891. if (VERR_NONE == result)
  1892. {
  1893. //VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Download", "1", sCmdUser);
  1894. }
  1895. else
  1896. {
  1897. //VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Download", "0", sCmdUser);
  1898. }
  1899. Sleep(100);
  1900. Application->ProcessMessages();
  1901. sMsg = cxLabel32->Caption;//"VMS 폼 메시지 즉시 전송을 요청하였습니다.";
  1902. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1903. for (int ii = 0; ii < nSelCnt; ii++)
  1904. {
  1905. String sVmsNmbr = FVmsIds->Strings[ii];
  1906. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V10", "Immediately Download", "1", sCmdUser);
  1907. }
  1908. BtnImdFromDnld->Enabled = false;
  1909. TmrCommand->Enabled = true;
  1910. }
  1911. //---------------------------------------------------------------------------
  1912. void __fastcall TVmsControlM::BtnModuleControlClick(TObject *Sender)
  1913. {
  1914. TcxButton *pBtnControl = (TcxButton*)Sender;
  1915. String sTitle = cxLabel1->Caption;//"전광판/제어기 제어";
  1916. String sMsg = "";
  1917. int nOkCnt = 0;
  1918. int nSelCnt = GetSelListItems(true);
  1919. if (0 == nSelCnt)
  1920. {
  1921. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1922. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1923. FRAMEVmsStateList1->CxList->SetFocus();
  1924. return;
  1925. }
  1926. int nCmdIdx;
  1927. if (pBtnControl->Tag == 1)
  1928. {
  1929. nCmdIdx = vms_req_board_power_on;
  1930. sMsg = cxLabel3->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 전광판 전원 ON 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1931. }
  1932. else
  1933. {
  1934. nCmdIdx = vms_req_board_power_off;
  1935. sMsg = cxLabel4->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 전광판 전원 OFF 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1936. }
  1937. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1938. String sCmdUser = g_pLOGIN->sUserId;
  1939. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1940. int result;
  1941. for (int ii = 0; ii < nSelCnt; ii++)
  1942. {
  1943. String sVmsNmbr = FVmsIds->Strings[ii];
  1944. if (nCmdIdx == vms_req_board_power_on || nCmdIdx == vms_req_board_power_off)
  1945. {
  1946. // 전광판 On(=0)/Off(=1)
  1947. INT_VMS_POWER_CTL_REQ VmsPowerCtl;
  1948. BYTE MsgSeq;
  1949. memset(&VmsPowerCtl, 0x00, sizeof(VmsPowerCtl));
  1950. MsgSeq = (BYTE)0x10; // 제어명령 일련번호-결과값을 받아서 처리할때 필요함
  1951. memcpy(VmsPowerCtl.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  1952. memcpy(VmsPowerCtl.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  1953. VmsPowerCtl.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  1954. VmsPowerCtl.Command = (BYTE)nCmdIdx; /* 제어 구분, 1:켜짐 2:꺼짐 */
  1955. String sOprCode = (nCmdIdx == vms_req_board_power_on) ? "V01" : "V02";
  1956. String sCmdValue = (nCmdIdx == vms_req_board_power_on) ? "On" : "Off";
  1957. result = CComm_VmsPowerControlReq(&VmsPowerCtl, MsgSeq);
  1958. if (VERR_NONE == result)
  1959. {
  1960. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sOprCode, sCmdValue, "1", sCmdUser);
  1961. nOkCnt++;
  1962. }
  1963. else
  1964. {
  1965. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, sOprCode, sCmdValue, "0", sCmdUser);
  1966. }
  1967. }
  1968. Sleep(100);
  1969. Application->ProcessMessages();
  1970. }
  1971. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel8->Caption;
  1972. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  1973. }
  1974. //---------------------------------------------------------------------------
  1975. void __fastcall TVmsControlM::BtnResetClick(TObject *Sender)
  1976. {
  1977. TcxButton *pBtnControl = (TcxButton*)Sender;
  1978. String sTitle = cxLabel1->Caption;//"전광판/제어기 제어";
  1979. String sMsg = "";
  1980. int nOkCnt = 0;
  1981. int nSelCnt = GetSelListItems(true);
  1982. if (0 == nSelCnt)
  1983. {
  1984. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  1985. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1986. FRAMEVmsStateList1->CxList->SetFocus();
  1987. return;
  1988. }
  1989. int nCmdIdx;
  1990. {
  1991. nCmdIdx = 2;
  1992. sMsg = cxLabel5->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 제어기 리셋 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  1993. }
  1994. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  1995. String sCmdUser = g_pLOGIN->sUserId;
  1996. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  1997. int result;
  1998. for (int ii = 0; ii < nSelCnt; ii++)
  1999. {
  2000. String sVmsNmbr = FVmsIds->Strings[ii];
  2001. if (nCmdIdx == 2)
  2002. {
  2003. // 제어기 리셋
  2004. INT_VMS_RESET_REQ VmsReset;
  2005. BYTE MsgSeq;
  2006. memset(&VmsReset, 0x00, sizeof(VmsReset));
  2007. MsgSeq = (BYTE)0x20;
  2008. memcpy(VmsReset.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  2009. memcpy(VmsReset.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  2010. VmsReset.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  2011. VmsReset.Mode = (BYTE)pBtnControl->Tag;
  2012. result = CComm_VmsResetReq(&VmsReset, MsgSeq);
  2013. if (VERR_NONE == result)
  2014. {
  2015. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V03", "Reset", "1", sCmdUser);
  2016. nOkCnt++;
  2017. }
  2018. else
  2019. {
  2020. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V03", "Reset", "0", sCmdUser);
  2021. }
  2022. }
  2023. Sleep(100);
  2024. Application->ProcessMessages();
  2025. }
  2026. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel8->Caption;
  2027. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  2028. }
  2029. //---------------------------------------------------------------------------
  2030. void __fastcall TVmsControlM::BtnBrghControlClick(TObject *Sender)
  2031. {
  2032. TcxButton *pBtnControl = (TcxButton*)Sender;
  2033. String sTitle = cxLabel1->Caption;//"전광판/제어기 제어";
  2034. String sMsg = "";
  2035. int nOkCnt = 0;
  2036. int nSelCnt = GetSelListItems(true);
  2037. if (0 == nSelCnt)
  2038. {
  2039. sMsg = cxLabel2->Caption + "\r\n" + cxLabel9->Caption;//"VMS가 선택되지 않았습니다.\r\nVMS 목록에서 VMS를 선택하십시요.\r\n현재 통신이 비정상인 VMS는 선택하실 수 없습니다.";
  2040. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  2041. FRAMEVmsStateList1->CxList->SetFocus();
  2042. return;
  2043. }
  2044. int nCmdIdx;
  2045. {
  2046. nCmdIdx = 3;
  2047. sMsg = cxLabel6->Caption + "\r\n" + cxLabel9->Caption;//"선택하신 VMS에 VMS 휘도값 제어 명령을 전송하시겠습니까?\r\n(통신상태에 따라 명령이 실행되지 않을 수 있습니다.)";
  2048. }
  2049. if (Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_YESNO|MB_ICONWARNING|MB_APPLMODAL) != IDYES) return;
  2050. String sCmdUser = g_pLOGIN->sUserId;
  2051. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  2052. int result;
  2053. for (int ii = 0; ii < nSelCnt; ii++)
  2054. {
  2055. String sVmsNmbr = FVmsIds->Strings[ii];
  2056. if (nCmdIdx == 3)
  2057. {
  2058. // 휘도제어
  2059. INT_VMS_LUMINANCE_REQ VmsLuminance;
  2060. BYTE MsgSeq;
  2061. String sCmdValue = SeLuminance->Value;
  2062. memset(&VmsLuminance, 0x00, sizeof(VmsLuminance));
  2063. MsgSeq = (BYTE)0x30;
  2064. memcpy(VmsLuminance.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  2065. memcpy(VmsLuminance.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  2066. VmsLuminance.VMS_CTLR_NMBR = sVmsNmbr.ToIntDef(0);
  2067. VmsLuminance.BrghMode = (BYTE)pBtnControl->Tag;
  2068. VmsLuminance.BrghCurrStep = (BYTE)SeCurrBrgh->Value;
  2069. VmsLuminance.BrghWeekStep = (BYTE)SeWeekBrgh->Value;
  2070. VmsLuminance.BrghNghtStep = (BYTE)SeNghtBrgh->Value;
  2071. result = CComm_VmsLuminanceReq(&VmsLuminance, MsgSeq);
  2072. if (VERR_NONE == result)
  2073. {
  2074. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V07", sCmdValue, "1", sCmdUser);
  2075. nOkCnt++;
  2076. }
  2077. else
  2078. {
  2079. VmsCtlrManager->InsVmsControlHs(sCmdTime, sVmsNmbr, "V07", sCmdValue, "0", sCmdUser);
  2080. }
  2081. }
  2082. Sleep(100);
  2083. Application->ProcessMessages();
  2084. }
  2085. sMsg = String(nSelCnt) + " " + cxLabel7->Caption + " " + String(nOkCnt) + " " + cxLabel8->Caption;
  2086. Application->MessageBox(sMsg.c_str(), sTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  2087. }
  2088. //---------------------------------------------------------------------------
  2089. void __fastcall TVmsControlM::FFPlayer1State(TObject *Sender, TPlayState APlayState)
  2090. {
  2091. switch(APlayState)
  2092. {
  2093. case Ffbasecomponent::psPlay: reMsg->Lines->Add("Play..."); break;
  2094. case Ffbasecomponent::psResume: reMsg->Lines->Add("Resume."); break;
  2095. case Ffbasecomponent::psPause: reMsg->Lines->Add("Pause.."); break;
  2096. case Ffbasecomponent::psStep: reMsg->Lines->Add("Step..."); break;
  2097. case Ffbasecomponent::psStop:
  2098. if (FFPlayer1->ScreenHandle != NULL)
  2099. {
  2100. PostMessage(FFPlayer1->ScreenHandle, CM_INVALIDATE, 0, 0);
  2101. UpdateWindow(FFPlayer1->ScreenHandle);
  2102. //FFPlayer1->ScreenHandle = NULL;
  2103. }
  2104. reMsg->Lines->Add("Stop...");
  2105. break;
  2106. case Ffbasecomponent::psEnd:
  2107. {
  2108. FFPlayer1->Stop(true);
  2109. PostMessage(FFPlayer1->ScreenHandle, CM_INVALIDATE, 0, 0);
  2110. UpdateWindow(FFPlayer1->ScreenHandle);
  2111. //FFPlayer1->ScreenHandle = NULL;
  2112. }
  2113. reMsg->Lines->Add("End...");
  2114. break;
  2115. }
  2116. }
  2117. //---------------------------------------------------------------------------
  2118. void __fastcall TVmsControlM::FFPlayer1OpenFailed(TObject *Sender)
  2119. {
  2120. //ErrorMsg("웹카메라에 연결할 수 없습니다.");
  2121. //WebCamStop();
  2122. }
  2123. //---------------------------------------------------------------------------
  2124. void __fastcall TVmsControlM::ChkFullScreenClick(TObject *Sender)
  2125. {
  2126. FFPlayer1->AspectRatio = ChkFullScreen->Checked ? -1 : 0;
  2127. }
  2128. //---------------------------------------------------------------------------
  2129. void __fastcall TVmsControlM::IdHTTP1Authorization(TObject *Sender, TIdAuthentication *Authentication, bool &Handled)
  2130. {
  2131. #if 1
  2132. IdHTTP1->Request->Username = FStrmUser;
  2133. IdHTTP1->Request->Password = FStrmPswd;
  2134. #endif
  2135. Authentication->Username = FStrmUser;
  2136. Authentication->Password = FStrmPswd;
  2137. TIdDigestAuthentication *pAuth1 = (TIdDigestAuthentication*)IdHTTP1->Request->Authentication;
  2138. TIdDigestAuthentication *pAuth2 = (TIdDigestAuthentication*)Authentication;
  2139. pAuth1->Uri = IdHTTP1->Request->URL;
  2140. pAuth2->Method = "GET";
  2141. Handled = true;
  2142. }
  2143. //---------------------------------------------------------------------------
  2144. void __fastcall TVmsControlM::BtnWebCamControlMouseDown(TObject *Sender, TMouseButton Button,
  2145. TShiftState Shift, int X, int Y)
  2146. {
  2147. // PANControl
  2148. if (!FStrmPlay) return;
  2149. try
  2150. {
  2151. String sCmdHtml;
  2152. TImageBtn *pBtn = (TImageBtn*)Sender;
  2153. switch(pBtn->Tag)
  2154. {
  2155. case 1: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Tilt=5&Duration=1", FStrmHttp.c_str()); break; // Tilt Up
  2156. case 2: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Tilt=-5&Duration=1", FStrmHttp.c_str()); break; // Tilt Down
  2157. case 3: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Pan=5", FStrmHttp.c_str()); break; // Pan left
  2158. case 4: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Pan=-5", FStrmHttp.c_str()); break; // Pan right
  2159. case 9: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Zoom=3", FStrmHttp.c_str()); break; // Zoom In
  2160. case 10: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Zoom=-3", FStrmHttp.c_str()); break; // Zoom Out
  2161. case 12: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Focus=Near", FStrmHttp.c_str()); break; // Focus In
  2162. case 13: sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Focus=Far", FStrmHttp.c_str()); break; // Focus Out
  2163. default: return;
  2164. }
  2165. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions >> hoInProcessAuth;
  2166. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions << hoInProcessAuth;
  2167. String sResult = IdHTTP1->Get(sCmdHtml);
  2168. reMsg->Lines->Add(sResult);
  2169. IdHTTP1->Disconnect();
  2170. }
  2171. catch(...) {}
  2172. }
  2173. //---------------------------------------------------------------------------
  2174. void __fastcall TVmsControlM::BtnWebCamControlMouseUp(TObject *Sender, TMouseButton Button,
  2175. TShiftState Shift, int X, int Y)
  2176. {
  2177. // PANControl Stop
  2178. if (!FStrmPlay) return;
  2179. try
  2180. {
  2181. String sCmdHtml;
  2182. TImageBtn *pBtn = (TImageBtn*)Sender;
  2183. switch(pBtn->Tag)
  2184. {
  2185. case 1: // Tilt Up
  2186. case 2: // Tilt Down
  2187. sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Tilt=0&Duration=1", FStrmHttp.c_str());
  2188. break;
  2189. case 3: // Pan left
  2190. case 4: // Pan right
  2191. sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Pan=0", FStrmHttp.c_str());
  2192. break;
  2193. case 9: // Zoom In
  2194. case 10: // Zoom Out
  2195. sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Zoom=0", FStrmHttp.c_str());
  2196. break;
  2197. case 12: // Focus In
  2198. case 13: // Focus Out
  2199. sCmdHtml.printf(L"%s/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&action=control&Focus=Stop", FStrmHttp.c_str());
  2200. break;
  2201. default: return;
  2202. }
  2203. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions >> hoInProcessAuth;
  2204. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions << hoInProcessAuth;
  2205. String sResult = IdHTTP1->Get(sCmdHtml);
  2206. reMsg->Lines->Add(sResult);
  2207. IdHTTP1->Disconnect();
  2208. }
  2209. catch(...) {}
  2210. }
  2211. //---------------------------------------------------------------------------