FrmMainCommF.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "FrmMainCommF.h"
  4. #include "AppGlobalF.h"
  5. #include "FrmMainF.h"
  6. #include "DMCOMMF.h"
  7. #include "CommThread.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. void __fastcall TFrmMain::SendInitial(void)
  11. {
  12. int result;
  13. LINFO("SendInitial");
  14. if ((result = SendProcessState()) != VERR_NONE)
  15. {
  16. LERROR("SendProcessState failed %d", result);
  17. }
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TFrmMain::SendTerminal(void)
  21. {
  22. int result;
  23. LINFO("SendTerminal");
  24. // 동작, 통신, DB 모두 이상 처리
  25. m_bAction = state_error;
  26. m_bComm = state_error;
  27. m_bDB = state_error;
  28. // 모든 시설물 통신 오프라인 처리
  29. VmsIterator it;
  30. for(it=VmsManager->FLists.FMapObject.begin(); it != VmsManager->FLists.FMapObject.end(); ++it)
  31. {
  32. TVmsCtlr *pObj = (TVmsCtlr*)it->second;
  33. if (pObj->Server.UseFlag != bit_enable) continue;
  34. pObj->Server.Status = process_fail;
  35. pObj->ChangeDate = Now().FormatString("yyyymmddhhnnss");
  36. }
  37. SendProcessState();
  38. // DB에 상태정보를 업데이트 하구...
  39. if (DMCOMM->DbConnect(g_AppCfg.db.sConnectStr))
  40. {
  41. if ((result = DMCOMM->SaveProcessStateProc()) != VERR_NONE)
  42. {
  43. LERROR("SaveProcessStateProc Error %d", result);
  44. }
  45. if ((result = DMCOMM->SaveEquipStateAllProc(true)) != VERR_NONE)
  46. {
  47. LERROR("SaveEquipStateAllProc Error %d", result);
  48. }
  49. DMCOMM->DbClose();
  50. }
  51. }
  52. //---------------------------------------------------------------------------
  53. int __fastcall TFrmMain::SendProcessState()
  54. {
  55. int result;
  56. INT_PG_STATE_RES PgState;
  57. memset(&PgState, 0x00, sizeof(PgState));
  58. g_SysInfo->State.Action = m_bAction;
  59. g_SysInfo->State.Comm = m_bComm;
  60. g_SysInfo->State.DB = m_bDB;
  61. PgState.Count = 1;
  62. PgState.Unit[0].Type = INT_ID_VMS_SERVER;
  63. PgState.Unit[0].DB = m_bDB;
  64. PgState.Unit[0].Comm = m_bComm;
  65. PgState.Unit[0].Action = m_bAction;
  66. if (g_AppCfg.bSendCenterComm) {
  67. result = VComm_CmmProcessStateNotify(&PgState);
  68. }
  69. if (m_bAction != state_error) //프로세스 종료처리중이 아닌경우
  70. {
  71. result = SendDbThreadMessage(WM_PROCESS_STATE, NULL, NULL);
  72. if (result != SYS_ERR_NONE)
  73. {
  74. LERROR("SendDbThreadMessage Error %d", result);
  75. }
  76. }
  77. return result;
  78. }
  79. //---------------------------------------------------------------------------
  80. void __fastcall TFrmMain::CheckCommState()
  81. {
  82. int i;
  83. int uCount, rCount;
  84. bool eFlag;
  85. FSendMsg = SEND_MSG_NONE;
  86. if (VmsManager->Total == VmsManager->Normal) m_bComm = state_normal;
  87. else m_bComm = state_error;
  88. /* 통신 데이터 처리 스레드 체크 */
  89. int Flag;
  90. DWORD ExitCode;
  91. if ((m_CommThreadID != NULL) && (m_CommHandle != NULL))
  92. {
  93. if (GetExitCodeThread((HANDLE)m_CommHandle, &ExitCode))
  94. {
  95. if (STILL_ACTIVE == ExitCode) Flag = 0;
  96. else Flag = -1;
  97. }
  98. else Flag = -2;
  99. }
  100. else Flag = -3;
  101. if (Flag)
  102. {
  103. m_bAction = state_error;
  104. String sError = SYS_GetSysError();
  105. LERROR("DB Server abnormal terminated, try restart: %d (%s)", Flag, AnsiString(sError).c_str());
  106. //AutoClose();
  107. StartJobThread();
  108. }
  109. else
  110. {
  111. m_bAction = state_normal;
  112. }
  113. if (g_SysInfo->State.Action != m_bAction ||
  114. g_SysInfo->State.Comm != m_bComm ||
  115. g_SysInfo->State.DB != m_bDB )
  116. {
  117. SendProcessState();
  118. FSendMsg += SEND_MSG_PROCESS;
  119. }
  120. }
  121. //---------------------------------------------------------------------------
  122. int __fastcall TFrmMain::SendVmsThreadMessage(BYTE *AVmsId, IPCUDPMESSAGESTRUCT *ARcvData, BYTE AOpCode, char *AData)
  123. {
  124. AnsiString sVmsId;
  125. IPCUDPPACKET *pPI = NULL;
  126. sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
  127. TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsId);
  128. if (!pObj)
  129. {
  130. return VERR_NOTFOUND_VMS;
  131. }
  132. if (pObj->Server.Status != process_run)
  133. {
  134. return VERR_OFFLINE;
  135. }
  136. if (!pObj->pPackQueue)
  137. {
  138. return VERR_INTERNAL;
  139. }
  140. pPI = new IPCUDPPACKET;
  141. if (pPI == NULL) return VERR_MEMORY_ALLOC;
  142. pPI->Sender.IP = ARcvData->Sender.IP;
  143. pPI->Sender.Port = ARcvData->Sender.Port;
  144. pPI->RecvId = ARcvData->Pkt.head.SendId;
  145. pPI->OPCode = AOpCode;
  146. pPI->Size = (int)ARcvData->Pkt.head.Length;
  147. if (pPI->Size > 0)
  148. {
  149. pPI->Data = new char[pPI->Size];
  150. if (!pPI->Data)
  151. {
  152. delete pPI;
  153. return VERR_INTERNAL;
  154. }
  155. CopyMemory(pPI->Data, AData, pPI->Size);
  156. }
  157. pObj->pPackQueue->Add((void*)pPI);
  158. return VERR_NONE;
  159. }
  160. //---------------------------------------------------------------------------