VMS0500MF.cpp 81 KB

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