fmain.pas 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. unit fmain;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  6. IdHL7, IdTCPConnection,idGlobal,idSync;
  7. type
  8. { TForm1 }
  9. { TLog }
  10. TLog = class(TIdNotify)
  11. protected
  12. FMsg: string;
  13. procedure DoNotify; override;
  14. public
  15. class procedure LogMsg(const AMsg :string);
  16. end;
  17. TForm1 = class(TForm)
  18. btnStart: TButton;
  19. btnListen: TButton;
  20. edtServerPort: TEdit;
  21. edtServer: TEdit;
  22. edtPort: TEdit;
  23. idHl7Client: TIdHL7;
  24. idHl7Server: TIdHL7;
  25. Label1: TLabel;
  26. Label2: TLabel;
  27. Label3: TLabel;
  28. Label4: TLabel;
  29. Label5: TLabel;
  30. memClient: TMemo;
  31. memClientReplyText: TMemo;
  32. memGeneral: TMemo;
  33. memServerReply: TMemo;
  34. memServer: TMemo;
  35. Panel1: TPanel;
  36. Panel2: TPanel;
  37. Panel3: TPanel;
  38. Panel4: TPanel;
  39. Panel5: TPanel;
  40. Panel6: TPanel;
  41. Panel7: TPanel;
  42. Panel8: TPanel;
  43. procedure btnListenClick(Sender: TObject);
  44. procedure btnStartClick(Sender: TObject);
  45. procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
  46. procedure FormCreate(Sender: TObject);
  47. procedure idHl7ClientConnCountChange(ASender: TIdHL7; AConnCount: integer);
  48. procedure idHl7ClientConnect(Sender: TObject);
  49. procedure idHl7ClientDisconnect(Sender: TObject);
  50. procedure idHl7ClientReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
  51. procedure idHl7ServerConnCountChange(ASender: TIdHL7; AConnCount: integer);
  52. procedure idHl7ServerConnect(Sender: TObject);
  53. procedure idHl7ServerDisconnect(Sender: TObject);
  54. procedure idHl7ServerReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
  55. procedure Panel3Click(Sender: TObject);
  56. protected
  57. procedure hl7ServerReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
  58. procedure hl7ServerMsgArrive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string);
  59. procedure hl7clientReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
  60. procedure logGeneral(sText : String);
  61. private
  62. procedure clientSend();
  63. public
  64. end;
  65. var
  66. Form1: TForm1;
  67. implementation
  68. {$R *.lfm}
  69. { TLog }
  70. procedure TLog.DoNotify;
  71. begin
  72. Form1.memGeneral.Lines.Add(Fmsg);
  73. end;
  74. class procedure TLog.LogMsg(const AMsg :string);
  75. begin
  76. with TLog.Create do
  77. try
  78. FMsg := AMsg;
  79. Notify;
  80. except
  81. Free;
  82. raise;
  83. end;
  84. end;
  85. { TForm1 }
  86. procedure TForm1.btnStartClick(Sender: TObject);
  87. begin
  88. if idHl7Client.Connected then begin
  89. idHl7Client.Stop;
  90. end;
  91. idHl7Client.Port := StrToInt(edtPort.Text);
  92. idHl7Client.Address := edtServer.Text;
  93. clientSend;
  94. end;
  95. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
  96. begin
  97. if idHl7Client.Status = isConnected then begin
  98. idHl7Client.Stop;
  99. end;
  100. end;
  101. procedure TForm1.FormCreate(Sender: TObject);
  102. begin
  103. idHl7Server.OnReceiveMessage := @hl7ServerReceive;
  104. idHl7Server.OnMessageArrive := @hl7ServerMsgArrive;
  105. idHl7Client.OnReceiveMessage:= @hl7clientReceive;
  106. end;
  107. procedure TForm1.idHl7ClientConnCountChange(ASender: TIdHL7; AConnCount: integer);
  108. begin
  109. logGeneral('clientcon_count change : ');
  110. end;
  111. procedure TForm1.idHl7ClientConnect(Sender: TObject);
  112. begin
  113. logGeneral('clientconnect : ');
  114. end;
  115. procedure TForm1.idHl7ClientDisconnect(Sender: TObject);
  116. begin
  117. logGeneral('clientdisconnect : ');
  118. end;
  119. procedure TForm1.idHl7ClientReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
  120. begin
  121. logGeneral('clientrcverr : ' + AException.Message);
  122. VDropConnection := True;
  123. end;
  124. procedure TForm1.idHl7ServerConnCountChange(ASender: TIdHL7; AConnCount: integer);
  125. begin
  126. //Currently if evcents log to memo even in critical section it breaks the whole thread schedule system
  127. logGeneral('servercon_count change : ');
  128. end;
  129. procedure TForm1.idHl7ServerConnect(Sender: TObject);
  130. begin
  131. logGeneral('serverconnect : ');
  132. end;
  133. procedure TForm1.idHl7ServerDisconnect(Sender: TObject);
  134. begin
  135. //Currently if evcents log to memo even in critical section it breaks the whole thread schedule system
  136. logGeneral('serverdisconnect : ');
  137. end;
  138. procedure TForm1.idHl7ServerReceiveError(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; AException: Exception; var VReply: string; var VDropConnection: boolean);
  139. begin
  140. logGeneral('servrcverr : ' + AException.Message);
  141. VDropConnection := True;
  142. end;
  143. procedure TForm1.Panel3Click(Sender: TObject);
  144. begin
  145. end;
  146. procedure TForm1.hl7ServerReceive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean; var VReply: string);
  147. begin
  148. vReply := memServerReply.Lines.Text;
  149. memServer.lines.text := Amsg;
  150. vhandled := True;
  151. logGeneral('servreceived '+AMsg+
  152. '- reply provided '+vReply);
  153. end;
  154. procedure TForm1.hl7ServerMsgArrive(ASender: TObject; AConnection: TIdTCPConnection; AMsg: string);
  155. begin
  156. logGeneral('servmsgarrive : ' + AMsg);
  157. memServer.lines.add(amsg);
  158. idHl7Server.AsynchronousSend(memServerReply.Lines.text,AConnection);
  159. end;
  160. procedure TForm1.hl7clientReceive(ASender: TObject;
  161. AConnection: TIdTCPConnection; AMsg: string; var VHandled: boolean;
  162. var VReply: string);
  163. begin
  164. memClientReplyText.lines.text := Amsg;
  165. vhandled := True;
  166. logGeneral('clreceived '+AMsg);
  167. end;
  168. procedure TForm1.logGeneral(sText: String);
  169. begin
  170. TLog.LogMsg(sText);
  171. end;
  172. procedure TForm1.clientSend;
  173. var
  174. iX: integer;
  175. sAnt: string;
  176. // vR : TSendResponse;
  177. vMsg : IInterface;
  178. begin
  179. if idHl7Client.Status <> isConnected then begin
  180. idHl7Client.Start;
  181. idHl7Client.WaitForConnection(10000);
  182. end;
  183. idHl7Client.SendMessage(memClient.Lines.Text);
  184. iX := 0;
  185. while (iX < 10) do begin
  186. Inc(iX);
  187. sleep(10);
  188. Application.ProcessMessages;
  189. (*vR*)vMsg := idHl7Client.GetMessage(sAnt);
  190. if vMsg <> nil (*vR = srOK*) then begin
  191. memClientReplyText.Lines.text := 'success : '+sAnt;
  192. break
  193. (* end else if vR = srError then begin
  194. memClientReplyText.Lines.text := 'error : '+sAnt;
  195. break;
  196. end else if vR = srTimeout then begin
  197. memClientReplyText.Lines.text := 'timeout waiting for reply ';
  198. break;*)
  199. end;
  200. end;
  201. // memClientReplyText.Lines.Text := sAnt;
  202. end;
  203. procedure TForm1.btnListenClick(Sender: TObject);
  204. begin
  205. if btnListen.Tag = 0 then begin
  206. idHl7Server.Port := StrToInt(edtServerPort.Text);
  207. idHl7Server.Start;
  208. btnListen.Tag := 1;
  209. btnListen.Caption := 'Stop';
  210. end else begin
  211. idHl7Server.Stop;
  212. btnListen.Caption := 'Start';
  213. btnListen.Tag := 0;
  214. end;
  215. end;
  216. end.