FrmMainCommF.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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()) != 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 (FServerRun == false)
  67. {
  68. PgState.Unit[0].Action = state_error;
  69. g_SysInfo->State.Action = state_error;
  70. }
  71. result = VComm_CmmProcessStateNotify(&PgState);
  72. if (m_bAction != state_error) //프로세스 종료처리중이 아닌경우
  73. {
  74. result = SendDbThreadMessage(WM_PROCESS_STATE, NULL, NULL);
  75. if (result != SYS_ERR_NONE)
  76. {
  77. LERROR("SendDbThreadMessage Error %d", result);
  78. }
  79. LINFO(">>>>>>>>>>>>>>> SendProcessState: %d,%d,%d", PgState.Unit[0].Action, PgState.Unit[0].Comm, PgState.Unit[0].DB);
  80. }
  81. return result;
  82. }
  83. //---------------------------------------------------------------------------
  84. void __fastcall TFrmMain::CheckCommState()
  85. {
  86. int i;
  87. int uCount, rCount;
  88. bool eFlag;
  89. FSendMsg = SEND_MSG_NONE;
  90. if (VmsManager->Total == VmsManager->Normal) m_bComm = state_normal;
  91. else m_bComm = state_error;
  92. /* 통신 데이터 처리 스레드 체크 */
  93. int Flag;
  94. DWORD ExitCode;
  95. if ((m_CommThreadID != NULL) && (m_CommHandle != NULL))
  96. {
  97. if (GetExitCodeThread((HANDLE)m_CommHandle, &ExitCode))
  98. {
  99. if (STILL_ACTIVE == ExitCode) Flag = 0;
  100. else Flag = -1;
  101. }
  102. else Flag = -2;
  103. }
  104. else Flag = -3;
  105. if (Flag)
  106. {
  107. m_bAction = state_error;
  108. String sError = SYS_GetSysError();
  109. LERROR("DB Server abnormal terminated, try restart: %d (%s)", Flag, AnsiString(sError).c_str());
  110. //AutoClose();
  111. StartJobThread();
  112. }
  113. else
  114. {
  115. //if (tbConnect->Enabled == false)
  116. {
  117. m_bAction = state_normal;
  118. }
  119. }
  120. if (g_SysInfo->State.Action != m_bAction ||
  121. g_SysInfo->State.Comm != m_bComm ||
  122. g_SysInfo->State.DB != m_bDB )
  123. {
  124. //SendProcessState();
  125. FSendMsg += SEND_MSG_PROCESS;
  126. }
  127. }
  128. //---------------------------------------------------------------------------
  129. int __fastcall TFrmMain::SendVmsThreadMessage(BYTE *AVmsId, IPCUDPMESSAGESTRUCT *ARcvData, BYTE AOpCode, char *AData)
  130. {
  131. AnsiString sVmsId;
  132. IPCUDPPACKET *pPI = NULL;
  133. sVmsId.sprintf("%.*s", INT_VMS_MAX_ID, (char*)AVmsId);
  134. TVmsCtlr *pObj = VmsManager->FLists.Find(sVmsId);
  135. if (!pObj)
  136. {
  137. return VERR_NOTFOUND_VMS;
  138. }
  139. if (pObj->Server.Status != process_run)
  140. {
  141. return VERR_OFFLINE;
  142. }
  143. if (!pObj->pPackQueue)
  144. {
  145. return VERR_INTERNAL;
  146. }
  147. pPI = new IPCUDPPACKET;
  148. if (pPI == NULL) return VERR_MEMORY_ALLOC;
  149. pPI->Sender.IP = ARcvData->Sender.IP;
  150. pPI->Sender.Port = ARcvData->Sender.Port;
  151. pPI->RecvId = ARcvData->Pkt.head.SendId;
  152. pPI->OPCode = AOpCode;
  153. pPI->Size = (int)ARcvData->Pkt.head.Length;
  154. if (pPI->Size > 0)
  155. {
  156. pPI->Data = new char[pPI->Size];
  157. if (!pPI->Data)
  158. {
  159. delete pPI;
  160. return VERR_INTERNAL;
  161. }
  162. CopyMemory(pPI->Data, AData, pPI->Size);
  163. }
  164. pObj->pPackQueue->Add((void*)pPI);
  165. return VERR_NONE;
  166. }
  167. //---------------------------------------------------------------------------