FrmCommLogF.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "FrmCommLogF.h"
  5. #include "VMSCommLibF.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma resource "*.dfm"
  9. TFrmCommLog *FrmCommLog = NULL;
  10. //---------------------------------------------------------------------------
  11. __fastcall TFrmCommLog::TFrmCommLog(TComponent* Owner)
  12. : TForm(Owner)
  13. {
  14. FObjCtlrIdx = -1;
  15. FObjCtlrId = " ";
  16. FObjCtlr = NULL;
  17. reMsg->Lines->Clear();
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TFrmCommLog::btnClearClick(TObject *Sender)
  21. {
  22. try
  23. {
  24. reMsg->Lines->Clear();
  25. Application->ProcessMessages();
  26. }
  27. catch(Exception &e)
  28. {
  29. }
  30. }
  31. //---------------------------------------------------------------------------
  32. void __fastcall TFrmCommLog::btnCopyClick(TObject *Sender)
  33. {
  34. try
  35. {
  36. reMsg->SelectAll();
  37. reMsg->CopyToClipboard();
  38. Application->ProcessMessages();
  39. }
  40. catch(Exception &e)
  41. {
  42. }
  43. }
  44. //---------------------------------------------------------------------------
  45. void __fastcall TFrmCommLog::OnWMLogDisplayMessage(TMessage &Msg)
  46. {
  47. if (!Showing) return;
  48. if (chkLogPause->Checked) return;
  49. IPC_LOG_MESSAGE *pLog = (IPC_LOG_MESSAGE *)Msg.WParam;
  50. if (pLog)
  51. {
  52. #if 0
  53. IPC_LOG_MESSAGE Log;
  54. Log.Kind = pLog->Kind;
  55. Log.Flag = pLog->Flag;
  56. Log.Len = pLog->Len;
  57. Log.Tm = pLog->Tm;
  58. Log.Type = pLog->Type;
  59. memcpy(Log.Msg, pLog->Msg, sizeof(Log.Msg));
  60. //ReplyMessage(0);
  61. LogWrite(&Log);
  62. #else
  63. LogWrite(pLog);
  64. #endif
  65. }
  66. }
  67. //---------------------------------------------------------------------------
  68. void TFrmCommLog::LogWrite(IPC_LOG_MESSAGE *ALog)
  69. {
  70. if (chkLogPause->Checked) return;
  71. if (!ALog) return;
  72. if (ALog->Type == 'S')
  73. {
  74. if (!chkServer->Checked) return;
  75. }
  76. else
  77. {
  78. if (!chkClient->Checked) return;
  79. }
  80. if (ALog->Kind == eLOG_DATA)
  81. {
  82. LogData(ALog);
  83. return;
  84. }
  85. try
  86. {
  87. //reMsg->Lines->BeginUpdate();
  88. AnsiString sLogKind = " [XXX] ";
  89. switch(ALog->Kind)
  90. {
  91. case eLOG_INFO : sLogKind = " [INF] "; break;
  92. case eLOG_DATA : sLogKind = " [DAT] "; break;
  93. case eLOG_ERROR : sLogKind = " [ERR] "; break;
  94. case eLOG_WARNING: sLogKind = " [WAN] "; break;
  95. case eLOG_DEBUG : sLogKind = " [DBG] "; break;
  96. case eLOG_DETAIL : sLogKind = " [DET] "; break;
  97. }
  98. try
  99. {
  100. #if 0
  101. while (reMsg->Lines->Count >= g_AppCfg.nMaxLogLines)
  102. reMsg->Lines->Delete(0);
  103. #else
  104. if (reMsg->Lines->Count >= g_AppCfg.nMaxLogLines)
  105. reMsg->Lines->Clear();
  106. #endif
  107. reMsg->Lines->Add(ALog->Tm.FormatString("hh:nn:ss") + "." + Now().FormatString("ss") + sLogKind + String(ALog->Msg));
  108. //reMsg->Lines->Add(ALog->Tm.FormatString("hh:nn:ss") + "." + Now().FormatString("ss") + String(ALog->Msg));
  109. //reMsg->Lines->Add(ALog->Tm.FormatString("hh:nn:ss") + String(ALog->Msg));
  110. }
  111. catch(Exception &e)
  112. {
  113. }
  114. }
  115. __finally
  116. {
  117. //reMsg->Lines->EndUpdate();
  118. //SendMessage(reMsg->Handle, EM_SCROLLCARET, 0, 0);
  119. //reMsg->Perform(EM_SCROLLCARET, 0, 0);
  120. //Application->ProcessMessages();
  121. }
  122. }
  123. //---------------------------------------------------------------------------
  124. void TFrmCommLog::LogData(IPC_LOG_MESSAGE *ALog)
  125. {
  126. AnsiString sTemp;
  127. AnsiString sTime;
  128. int ii, jj, pos;
  129. bool bFileClose = false;
  130. unsigned char *AData= ALog->Msg;
  131. if (!AData) return;
  132. AnsiString sLogData = "";
  133. AnsiString sDispLog = "";
  134. if (chkLogPause->Checked) return;
  135. try
  136. {
  137. //reMsg->Lines->BeginUpdate();
  138. try
  139. {
  140. AnsiString sSndRcv = ALog->Flag == 1 ? "SEND" : "RECV";
  141. sTime = AnsiString(ALog->Tm.FormatString("hh:nn:ss") + "." + Now().FormatString("ss"));
  142. if (ALog->Type == 'C')
  143. sTemp.printf("%s [DATA] %s, [%s] %d Bytes ", sTime.c_str(), FObjCtlrId.c_str(), sSndRcv.c_str(), ALog->Len);
  144. else
  145. sTemp.printf("%s [DATA] %s, [%s] %d Bytes ", sTime.c_str(), FObjCtlrId.c_str(), sSndRcv.c_str(), ALog->Len);
  146. reMsg->Lines->Add("");
  147. reMsg->Lines->Add(sTemp);
  148. AnsiString sLog;
  149. AnsiString sChar;
  150. AnsiString sMsg;
  151. for (ii = 0; ii < ALog->Len; ii += 16)
  152. {
  153. sLogData = "";
  154. sLog = "";
  155. sMsg.printf("%08Xh ", ii);
  156. sLog += sMsg;
  157. for (jj = 0; jj < 16; jj++)
  158. {
  159. pos = ii + jj;
  160. if (pos < ALog->Len)
  161. sMsg.printf(" %02X", AData[pos]);
  162. else
  163. sMsg.printf(" ");
  164. sLog += sMsg;
  165. if (jj == 7)
  166. {
  167. //sMsg.printf(" "); sLog += sMsg;
  168. }
  169. }
  170. sMsg.printf(" ;"); sLog += sMsg;
  171. for (jj = 0; jj < 16; jj++)
  172. {
  173. pos = ii + jj;
  174. if (pos >= ALog->Len)
  175. break;
  176. uint8_t v = AData[pos];
  177. sMsg.printf("%c", isprint(v) ? v : '.');
  178. sLog += sMsg;
  179. if (jj == 7)
  180. {
  181. //sMsg.printf(" "); sLog += sMsg;
  182. }
  183. }
  184. sLogData += sLog;
  185. sDispLog += sLogData;
  186. sDispLog += "\r\n";
  187. ////sLogData = sLogData.SubString(0, sLogData.Length()-2);
  188. //reMsg->Lines->Add(sLogData);
  189. }
  190. reMsg->Lines->Add(sDispLog);
  191. //reMsg->Lines->Add("");
  192. }
  193. catch(Exception &e)
  194. {
  195. }
  196. }
  197. __finally
  198. {
  199. //reMsg->Lines->EndUpdate();
  200. //SendMessage(reMsg->Handle, EM_SCROLLCARET, 0, 0);
  201. //reMsg->Perform(EM_SCROLLCARET, 0, 0);
  202. //Application->ProcessMessages();
  203. }
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall TFrmCommLog::FormClose(TObject *Sender, TCloseAction &Action)
  207. {
  208. ResetDisplayLog();
  209. Hide();
  210. }
  211. //---------------------------------------------------------------------------
  212. void __fastcall TFrmCommLog::ResetDisplayLog(int AControllerIdx/*=-1*/)
  213. {
  214. if (FObjCtlr)
  215. {
  216. FObjCtlr->FDispLog = false;
  217. FObjCtlr->FCLog->FLogCfg = g_LogCfg;
  218. FObjCtlr->FSLog->FLogCfg = g_LogCfg;
  219. }
  220. if (AControllerIdx < 0)
  221. {
  222. FObjCtlr = NULL;
  223. return;
  224. }
  225. TCDSCtlr *pOldCtlr = FObjCtlr;
  226. FObjCtlr = (TCDSCtlr*)AControllerIdx;
  227. FObjCtlr->FCLog->FLogCfg = g_LogCfg;
  228. FObjCtlr->FSLog->FLogCfg = g_LogCfg;
  229. FLogCfg = FObjCtlr->FSLog->FLogCfg;
  230. chkInfo->Checked = FLogCfg.Info;
  231. chkData->Checked = FLogCfg.Data;
  232. chkError->Checked = FLogCfg.Error;
  233. chkWarning->Checked = FLogCfg.Warning;
  234. chkDebug->Checked = FLogCfg.Debug;
  235. chkDetail->Checked = FLogCfg.Detail;
  236. FObjCtlr->FDispLog = true;
  237. FObjCtlrId = FObjCtlr->CTLR_ID;
  238. Caption = FObjCtlr->CTLR_ID + ", " + FObjCtlr->NM;
  239. if (pOldCtlr != FObjCtlr)
  240. {
  241. btnClearClick(NULL);
  242. }
  243. }
  244. //---------------------------------------------------------------------------
  245. void __fastcall TFrmCommLog::btnSetLogClick(TObject *Sender)
  246. {
  247. FLogCfg.Info = chkInfo->Checked;
  248. FLogCfg.Data = chkData->Checked;
  249. FLogCfg.Error = chkError->Checked;
  250. FLogCfg.Warning = chkWarning->Checked;
  251. FLogCfg.Debug = chkDebug->Checked;
  252. FLogCfg.Detail = chkDetail->Checked;
  253. if (FObjCtlr)
  254. {
  255. FObjCtlr->FCLog->FLogCfg = FLogCfg;
  256. FObjCtlr->FSLog->FLogCfg = FLogCfg;
  257. }
  258. }
  259. //---------------------------------------------------------------------------
  260. void __fastcall TFrmCommLog::FormShow(TObject *Sender)
  261. {
  262. Application->ProcessMessages();
  263. }
  264. //---------------------------------------------------------------------------
  265. void TFrmCommLog::DisplayMsg(String& AMsg)
  266. {
  267. if (chkLogPause->Checked) return;
  268. if (!Showing) return;
  269. if (reMsg->Lines->Count >= g_AppCfg.nMaxLogLines)
  270. reMsg->Lines->Clear();
  271. if (AMsg != "")
  272. {
  273. AMsg[AMsg.Length()-1] = 0; // 마지막줄의 CRLF 삭제. 그래야 메모장에서는 줄간 간격이 떨어지지 않게 찍힌다.
  274. reMsg->Lines->Add(AMsg);
  275. }
  276. }
  277. //---------------------------------------------------------------------------