FrmVmsInfoF.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "FrmVmsInfoF.h"
  5. #include "FrmVmsLogF.h"
  6. #include "FrmMainF.h"
  7. #include "AppGlobalF.h"
  8. #include "VMSCThread.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma link "cxCalc"
  12. #pragma link "cxClasses"
  13. #pragma link "cxControls"
  14. #pragma link "cxCustomData"
  15. #pragma link "cxData"
  16. #pragma link "cxDataStorage"
  17. #pragma link "cxEdit"
  18. #pragma link "cxFilter"
  19. #pragma link "cxGraphics"
  20. #pragma link "cxGrid"
  21. #pragma link "cxGridCustomTableView"
  22. #pragma link "cxGridCustomView"
  23. #pragma link "cxGridLevel"
  24. #pragma link "cxGridTableView"
  25. #pragma link "cxLabel"
  26. #pragma link "cxLookAndFeelPainters"
  27. #pragma link "cxLookAndFeels"
  28. #pragma link "cxStyles"
  29. #pragma resource "*.dfm"
  30. TFrmVmsInfo *FrmVmsInfo = NULL;
  31. String VmsModuleType(TVmsCtlr *AObj)
  32. {
  33. #ifdef LANG_ENG
  34. if (AObj->VmsType == "VUTN") return "Text";
  35. return "Figure";
  36. #else
  37. if (AObj->VmsType == "VUTN") return "문자식";
  38. return "도형식";
  39. #endif
  40. }
  41. //---------------------------------------------------------------------------
  42. String VmsOperMode(TVmsCtlr *AObj)
  43. {
  44. #ifdef LANG_ENG
  45. if (AObj->OPER_MODE == "A") return "Auto";
  46. return "Fixed";
  47. #else
  48. if (AObj->OPER_MODE == "A") return "자동";
  49. return "고정";
  50. #endif
  51. }
  52. //---------------------------------------------------------------------------
  53. String VmsComm(TVmsCtlr *AObj)
  54. {
  55. #ifdef LANG_ENG
  56. if (AObj->Client.Comm == state_open) return "Normal";
  57. return "Error";
  58. #else
  59. if (AObj->Client.Comm == state_open) return "정상";
  60. return "장애";
  61. #endif
  62. }
  63. //---------------------------------------------------------------------------
  64. String VmsModuleState(TVmsCtlr *AObj)
  65. {
  66. #ifdef LANG_ENG
  67. if (AObj->Client.Comm != state_open) return "-";
  68. if (AObj->RSTATE.ModuleState == vms_normal) return "Normal";
  69. return "Error";
  70. #else
  71. if (AObj->Client.Comm != state_open) return "-";
  72. if (AObj->RSTATE.ModuleState == vms_normal) return "정상";
  73. return "장애";
  74. #endif
  75. }
  76. //---------------------------------------------------------------------------
  77. String VmsModulePower(TVmsCtlr *AObj)
  78. {
  79. #ifdef LANG_ENG
  80. if (AObj->Client.Comm != state_open) return "-";
  81. if (AObj->RSTATE.ModulePowerStatus == vms_on) return "On";
  82. return "Off";
  83. #else
  84. if (AObj->Client.Comm != state_open) return "-";
  85. if (AObj->RSTATE.ModulePowerStatus == vms_on) return "켜짐";
  86. return "꺼짐";
  87. #endif
  88. }
  89. //---------------------------------------------------------------------------
  90. String VmsModuleLuminance(TVmsCtlr *AObj)
  91. {
  92. if (AObj->Client.Comm != state_open) return "-";
  93. int nLuminance = AObj->RSTATE.LuminanceStatus;
  94. return String(nLuminance);
  95. }
  96. //---------------------------------------------------------------------------
  97. String VmsModuleDoor(TVmsCtlr *AObj)
  98. {
  99. #ifdef LANG_ENG
  100. if (AObj->Client.Comm != state_open) return "-";
  101. if (AObj->RSTATE.DoorStatus == vms_open) return "Open";
  102. return "Close";
  103. #else
  104. if (AObj->Client.Comm != state_open) return "-";
  105. if (AObj->RSTATE.DoorStatus == vms_open) return "열림";
  106. return "닫힘";
  107. #endif
  108. }
  109. //---------------------------------------------------------------------------
  110. String VmsModuleFan(TVmsCtlr *AObj)
  111. {
  112. #ifdef LANG_ENG
  113. if (AObj->Client.Comm != state_open) return "-";
  114. if (AObj->RSTATE.FanStatus == vms_on) return "On";
  115. return "Off";
  116. #else
  117. if (AObj->Client.Comm != state_open) return "-";
  118. if (AObj->RSTATE.FanStatus == vms_on) return "동작";
  119. return "정지";
  120. #endif
  121. }
  122. //---------------------------------------------------------------------------
  123. String VmsModuleHeater(TVmsCtlr *AObj)
  124. {
  125. #ifdef LANG_ENG
  126. if (AObj->Client.Comm != state_open) return "-";
  127. if (AObj->RSTATE.HeaterStatus == vms_on) return "On";
  128. return "Off";
  129. #else
  130. if (AObj->Client.Comm != state_open) return "-";
  131. if (AObj->RSTATE.HeaterStatus == vms_on) return "가동";
  132. return "중지";
  133. #endif
  134. }
  135. //---------------------------------------------------------------------------
  136. String VmsModuleTemp(TVmsCtlr *AObj)
  137. {
  138. if (AObj->Client.Comm != state_open) return "-";
  139. int nTemp = AObj->RSTATE.BodyTemp;
  140. return String(nTemp);//+"℃";
  141. }
  142. //---------------------------------------------------------------------------
  143. //---------------------------------------------------------------------------
  144. __fastcall TFrmVmsInfo::TFrmVmsInfo(TComponent* Owner)
  145. : TForm(Owner)
  146. {
  147. FViewMode = 0;
  148. FVmsCnt = 0;
  149. }
  150. //---------------------------------------------------------------------------
  151. void __fastcall TFrmVmsInfo::InitVmsList()
  152. {
  153. int nRow;
  154. TcxDataController *pGDC = TvList->DataController;
  155. try
  156. {
  157. TvList->BeginUpdate();
  158. pGDC->BeginUpdate();
  159. pGDC->RecordCount = 0;
  160. VmsIterator it;
  161. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  162. {
  163. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  164. nRow = pGDC->AppendRecord();
  165. pGDC->Values[nRow][Col00->Index] = process_stop;
  166. pGDC->Values[nRow][Col01->Index] = "";
  167. pGDC->Values[nRow][Col02->Index] = pObj->VmsNo;
  168. pGDC->Values[nRow][Col03->Index] = pObj->VmsId;
  169. pGDC->Values[nRow][Col04->Index] = pObj->Name;
  170. pGDC->Values[nRow][Col05->Index] = pObj->IpAddress + "." + String(pObj->LocalNo);
  171. pGDC->Values[nRow][Col06->Index] = "-";
  172. pGDC->Values[nRow][Col07->Index] = "-";
  173. pGDC->Values[nRow][Col08->Index] = "-";
  174. pGDC->Values[nRow][Col09->Index] = "-";
  175. pGDC->Values[nRow][Col10->Index] = "-";
  176. pGDC->Values[nRow][Col11->Index] = "-";
  177. pGDC->Values[nRow][Col12->Index] = "-";
  178. pGDC->Values[nRow][Col13->Index] = "-";
  179. pGDC->Values[nRow][Col14->Index] = "-";
  180. pGDC->Values[nRow][Col15->Index] = "-";
  181. pGDC->Values[nRow][Col99->Index] = (int)pObj;
  182. pObj->RowNo = nRow;
  183. }
  184. }
  185. __finally
  186. {
  187. pGDC->EndUpdate();
  188. TvList->EndUpdate();
  189. FVmsCnt = pGDC->RecordCount;
  190. }
  191. VmsManager->Total = VmsManager->Count;
  192. VmsManager->Error = VmsManager->Count;
  193. VmsManager->Normal = 0;
  194. VmsManager->Module = 0;
  195. plTot->Caption = String(VmsManager->Count);
  196. plErr->Caption = String(VmsManager->Count);
  197. plNor->Caption = "0";
  198. }
  199. //---------------------------------------------------------------------------
  200. void __fastcall TFrmVmsInfo::UpdateServerState(int AObj)
  201. {
  202. TcxDataController *pGDC = TvList->DataController;
  203. try
  204. {
  205. int nErrCnt = 0;
  206. int nMemPtr;
  207. TVmsCtlr *pObj;
  208. for (int nRow = 0; nRow < FVmsCnt; nRow++)
  209. {
  210. nMemPtr = pGDC->Values[nRow][Col99->Index];
  211. pObj = (TVmsCtlr*)nMemPtr;
  212. if (!pObj) continue;
  213. //TODO
  214. pGDC->Values[nRow][Col00->Index] = pObj->Client.Comm;
  215. pObj->Server.Status = pObj->Client.Comm == state_open ? process_run : process_fail;
  216. if (pObj->Server.Status != process_run)
  217. {
  218. pGDC->Values[nRow][Col00->Index] = process_stop;
  219. nErrCnt++;
  220. }
  221. pGDC->Values[nRow][Col14->Index] = pObj->ConnectTm; //Connect
  222. pGDC->Values[nRow][Col15->Index] = pObj->DisconnectTm; //Disconnect
  223. }
  224. VmsManager->Error = nErrCnt;
  225. VmsManager->Normal = FVmsCnt-nErrCnt;
  226. plTot->Caption = String(FVmsCnt);
  227. plErr->Caption = String(nErrCnt);
  228. plNor->Caption = String(FVmsCnt-nErrCnt);
  229. }
  230. catch(Exception &e)
  231. {
  232. }
  233. }
  234. //---------------------------------------------------------------------------
  235. void __fastcall TFrmVmsInfo::UpdateClientState(int AObj)
  236. {
  237. #ifdef LANG_ENG
  238. String sNormal = "Normal";
  239. String sError = "Error";
  240. #else
  241. String sNormal = "정상";
  242. String sError = "오류";
  243. #endif
  244. TcxDataController *pGDC = TvList->DataController;
  245. try
  246. {
  247. int nMemPtr;
  248. TVmsCtlr *pObj;
  249. for(int nRow = 0; nRow < FVmsCnt; nRow++)
  250. {
  251. nMemPtr = pGDC->Values[nRow][Col99->Index];
  252. pObj = (TVmsCtlr*)nMemPtr;
  253. if (!pObj) continue;
  254. if (pObj->Client.Status == process_run)
  255. {
  256. if (pObj->Client.Comm == state_open)
  257. pGDC->Values[nRow][Col06->Index] = sNormal;
  258. else
  259. pGDC->Values[nRow][Col06->Index] = "-";
  260. }
  261. else
  262. {
  263. pGDC->Values[nRow][Col06->Index] = sError;
  264. }
  265. pGDC->Values[nRow][Col07->Index] = VmsModuleState(pObj); //모듈
  266. pGDC->Values[nRow][Col08->Index] = VmsModuleLuminance(pObj); //휘도
  267. pGDC->Values[nRow][Col09->Index] = VmsModulePower(pObj); //전원
  268. pGDC->Values[nRow][Col10->Index] = VmsModuleDoor(pObj); //도어
  269. pGDC->Values[nRow][Col11->Index] = VmsModuleFan(pObj); //팬
  270. pGDC->Values[nRow][Col12->Index] = VmsModuleHeater(pObj); //히터
  271. pGDC->Values[nRow][Col13->Index] = VmsModuleTemp(pObj); //온도
  272. }
  273. }
  274. catch(Exception &e)
  275. {
  276. }
  277. }
  278. //---------------------------------------------------------------------------
  279. void __fastcall TFrmVmsInfo::Col01CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
  280. TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone)
  281. {
  282. if (AViewInfo->GridRecord->RecordIndex < 0) return;
  283. Graphics::TBitmap *pBmp = NULL;
  284. pBmp = ImgState1->Picture->Bitmap;
  285. if (!VarIsNull(AViewInfo->GridRecord->DisplayTexts[Col00->Index]))
  286. {
  287. String sCode = AViewInfo->GridRecord->DisplayTexts[Col00->Index];
  288. int nCode = sCode.ToIntDef(2);
  289. if (nCode == process_run ) pBmp = ImgState0->Picture->Bitmap;
  290. else if (nCode == process_stop) pBmp = ImgState1->Picture->Bitmap;
  291. else pBmp = ImgState3->Picture->Bitmap;
  292. }
  293. if (!pBmp) return;
  294. pBmp->Transparent = true;
  295. int nW, nH;
  296. nW = nH = 21;
  297. try
  298. {
  299. TColor bBrush = ACanvas->Brush->Color;
  300. if (AViewInfo->GridRecord->Selected)
  301. {
  302. if (AViewInfo->GridRecord->Index % 2 == 0)
  303. {
  304. bBrush = Sender->LookAndFeelPainter->DefaultContentEvenColor();
  305. }
  306. else
  307. {
  308. bBrush = Sender->LookAndFeelPainter->DefaultContentOddColor();
  309. }
  310. }
  311. ACanvas->Brush->Color = bBrush;
  312. TRect rc;
  313. TRect rcOrg = AViewInfo->Bounds;
  314. ACanvas->FillRect(rcOrg);
  315. nW = rcOrg.Bottom - rcOrg.Top - 4;
  316. rc.Top = rcOrg.Top+2;
  317. rc.Bottom = rcOrg.Bottom - 2;
  318. rc.Left = rcOrg.Left + (rcOrg.Width() - nW) / 2;
  319. rc.Right = rc.Left + nW;
  320. ACanvas->Canvas->StretchDraw(rc, pBmp);
  321. //ACanvas->Draw(AViewInfo->ContentBounds.Left, AViewInfo->ContentBounds.Top, pBmp);
  322. ADone = true;
  323. }
  324. catch(...) {}
  325. }
  326. //---------------------------------------------------------------------------
  327. void __fastcall TFrmVmsInfo::TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  328. TMouseButton AButton, TShiftState AShift,
  329. bool &AHandled)
  330. {
  331. if (!ACellViewInfo) return;
  332. try {
  333. TcxDataController *pGDC = TvList->DataController;
  334. int nRow = pGDC->FocusedRecordIndex;
  335. if (nRow < 0) return;
  336. int nMemPtr = pGDC->Values[nRow][Col99->Index];
  337. if (!nMemPtr) return;
  338. if (!FrmVmsLog->Showing)
  339. {
  340. FrmVmsLog->Top = FrmMain->Top;
  341. //FrmVmsLog->Left= FrmMain->Left+FrmMain->Width;
  342. FrmVmsLog->Show();
  343. }
  344. FrmVmsLog->DisplayVmsLog(nMemPtr);
  345. } catch(...) {}
  346. }
  347. //---------------------------------------------------------------------------
  348. void __fastcall TFrmVmsInfo::TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  349. TMouseButton AButton, TShiftState AShift,
  350. bool &AHandled)
  351. {
  352. if (AButton != mbRight) return;
  353. if (!ACellViewInfo) return;
  354. try {
  355. TcxDataController *pGDC = TvList->DataController;
  356. int nRow = pGDC->FocusedRecordIndex;
  357. if (nRow < 0) return;
  358. FSelVmsNo = VarToStr(pGDC->Values[nRow][Col02->Index]);
  359. FSelVmsNm = VarToStr(pGDC->Values[nRow][Col04->Index]);
  360. POINT p;
  361. GetCursorPos(&p);
  362. pmuVms->Popup(p.x, p.y);
  363. } catch(...) {}
  364. }
  365. //---------------------------------------------------------------------------
  366. void __fastcall TFrmVmsInfo::pmuVmsPopup(TObject *Sender)
  367. {
  368. MnuVmsId->Caption = FSelVmsNm;
  369. }
  370. //---------------------------------------------------------------------------
  371. void __fastcall TFrmVmsInfo::mnuVmsPowerOnClick(TObject *Sender)
  372. {
  373. TMenuItem *pMnu = (TMenuItem*)Sender;
  374. TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
  375. if (!pObj) return;
  376. if (pObj->Server.Status != process_run) return;
  377. if (!pObj->pPackQueue) return;
  378. String sVmsNmbr = FSelVmsNo;
  379. int nCmdIdx;
  380. if (pMnu->Tag == 0)
  381. nCmdIdx = vms_board_power_on;
  382. else
  383. if (pMnu->Tag == 1)
  384. nCmdIdx = vms_board_power_off;
  385. else
  386. if (pMnu->Tag == 2)
  387. {
  388. nCmdIdx = 2;
  389. }
  390. else
  391. return;
  392. String sCmdUser = "server";
  393. String sCmdTime = Now().FormatString("yyyymmddhhnnss");
  394. BYTE OpCode;
  395. if (nCmdIdx == vms_board_power_on || nCmdIdx == vms_board_power_off)
  396. {
  397. OpCode = INT_OP_VMS_POWER_CTL;
  398. // 전광판 On(=0)/Off(=1)
  399. INT_VMS_POWER_CTL_REQ VmsPowerCtl;
  400. BYTE MsgSeq;
  401. memset(&VmsPowerCtl, 0x00, sizeof(VmsPowerCtl));
  402. MsgSeq = (BYTE)0x10; // 제어명령 일련번호-결과값을 받아서 처리할때 필요함
  403. memcpy(VmsPowerCtl.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  404. memcpy(VmsPowerCtl.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  405. memcpy(VmsPowerCtl.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  406. VmsPowerCtl.Command = (BYTE)nCmdIdx; /* 제어 구분, 0:켜짐 1:꺼짐 */
  407. IPCUDPPACKET *pPI = new IPCUDPPACKET;
  408. if (pPI == NULL) return;
  409. pPI->Sender.IP = 0;
  410. pPI->Sender.Port = 0;
  411. pPI->RecvId = 0;
  412. pPI->OPCode = OpCode;
  413. pPI->Size = (int)sizeof(VmsPowerCtl);
  414. if (pPI->Size > 0)
  415. {
  416. pPI->Data = new char[pPI->Size];
  417. if (!pPI->Data)
  418. {
  419. delete pPI;
  420. return ;
  421. }
  422. CopyMemory(pPI->Data, (char*)&VmsPowerCtl, pPI->Size);
  423. }
  424. pObj->pPackQueue->Add((void*)pPI);
  425. }
  426. else
  427. if (nCmdIdx == 2)
  428. {
  429. OpCode = INT_OP_VMS_RESET;
  430. // 제어기 리셋
  431. INT_VMS_RESET_REQ VmsReset;
  432. BYTE MsgSeq;
  433. memset(&VmsReset, 0x00, sizeof(VmsReset));
  434. MsgSeq = (BYTE)0x20;
  435. memcpy(VmsReset.CmdTime, AnsiString(sCmdTime).c_str(), INT_VMS_MAX_DATETIME); /* 명령수행시각 */
  436. memcpy(VmsReset.VmsId, AnsiString(sVmsNmbr).c_str(), INT_VMS_MAX_ID); /* VMS 제어기 번호 */
  437. memcpy(VmsReset.OperId, AnsiString(sCmdUser).c_str(), INT_VMS_MAX_OPER_ID); /* 운영자 ID */
  438. IPCUDPPACKET *pPI = new IPCUDPPACKET;
  439. if (pPI == NULL) return;
  440. pPI->Sender.IP = 0;
  441. pPI->Sender.Port = 0;
  442. pPI->RecvId = 0;
  443. pPI->OPCode = OpCode;
  444. pPI->Size = (int)sizeof(VmsReset);
  445. if (pPI->Size > 0)
  446. {
  447. pPI->Data = new char[pPI->Size];
  448. if (!pPI->Data)
  449. {
  450. delete pPI;
  451. return ;
  452. }
  453. CopyMemory(pPI->Data, (char*)&VmsReset, pPI->Size);
  454. }
  455. pObj->pPackQueue->Add((void*)pPI);
  456. }
  457. }
  458. //---------------------------------------------------------------------------
  459. void __fastcall TFrmVmsInfo::mnuVmsStatusReqClick(TObject *Sender)
  460. {
  461. TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
  462. if (!pObj) return;
  463. if ((pObj->Client.pThread != NULL) &&
  464. (pObj->Client.ActiveIndicator == true))
  465. {
  466. try
  467. {
  468. TVMSCThread *pVMSCThread = (TVMSCThread *)pObj->Client.pThread;
  469. pVMSCThread->ReqStatus();
  470. }
  471. catch(Exception &e)
  472. {
  473. }
  474. }
  475. }
  476. //---------------------------------------------------------------------------
  477. void __fastcall TFrmVmsInfo::mnuVmsFormDnClick(TObject *Sender)
  478. {
  479. TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
  480. if (!pObj) return;
  481. if ((pObj->Client.pThread != NULL) &&
  482. (pObj->Client.ActiveIndicator == true))
  483. {
  484. TVmsFormManager *m_pVmsFormList = pObj->pForms;
  485. m_pVmsFormList->Lock();
  486. try
  487. {
  488. int nFormCnt = m_pVmsFormList->Count();
  489. for (int ii = 0; ii < nFormCnt; ii++)
  490. {
  491. TVmsForm *pVmsForm = m_pVmsFormList->GetItem(ii);
  492. if (pVmsForm)
  493. {
  494. pVmsForm->SvcRes = false;
  495. }
  496. }
  497. }
  498. __finally
  499. {
  500. pObj->CTLMODE->Enable = object_enable;
  501. m_pVmsFormList->UnLock();
  502. }
  503. }
  504. }
  505. //---------------------------------------------------------------------------
  506. void __fastcall TFrmVmsInfo::Disconnect1Click(TObject *Sender)
  507. {
  508. TVmsCtlr *pObj = VmsManager->FLists.Find(FSelVmsNo);
  509. if (!pObj) return;
  510. if ((pObj->Client.pThread != NULL) &&
  511. (pObj->Client.ActiveIndicator == true))
  512. {
  513. try
  514. {
  515. TVMSCThread *pVMSCThread = (TVMSCThread *)pObj->Client.pThread;
  516. pVMSCThread->FUserTerm = true;
  517. }
  518. catch(Exception &e)
  519. {
  520. }
  521. }
  522. }
  523. //---------------------------------------------------------------------------