No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CommandManager.cs 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System.Threading;
  2. namespace monitor
  3. {
  4. public class CommandManager
  5. {
  6. public delegate void CommandReceivedEvent(string msg);
  7. public CommandReceivedEvent commandReceivedEvent = null;
  8. private System.Timers.Timer waitTimer = new System.Timers.Timer();
  9. private ManualResetEvent waitEvent = new ManualResetEvent(false);
  10. private bool waitForAcknowledge = false;
  11. private string messageReceived = null;
  12. private bool isBusy = false;
  13. public enum CommandManagerStatus
  14. {
  15. AnswerReceived,
  16. Timeout,
  17. Busy
  18. };
  19. public CommandManager(CommandReceivedEvent callback)
  20. {
  21. Client.readEvent += this.OnMessageReception;
  22. this.commandReceivedEvent += callback;
  23. waitTimer.Elapsed += OnMessageTimeout;
  24. }
  25. ~CommandManager()
  26. {
  27. Client.Close();
  28. }
  29. public bool Open(string hostname)
  30. {
  31. return this.Open(hostname, Client.defaultPort);
  32. }
  33. public bool Open(string hostname, int port)
  34. {
  35. return Client.Open(hostname, port);
  36. }
  37. public void Close()
  38. {
  39. Client.Close();
  40. }
  41. private void OnMessageReception(string message)
  42. {
  43. waitTimer.Stop();
  44. this.messageReceived = message;
  45. isBusy = false;
  46. if (waitForAcknowledge) {
  47. waitForAcknowledge = false;
  48. waitEvent.Set(); // Envoi de l'evenement
  49. }
  50. else {
  51. waitForAcknowledge = false;
  52. this.commandReceivedEvent?.Invoke(message);
  53. }
  54. }
  55. private void OnMessageTimeout(object sender, System.Timers.ElapsedEventArgs e)
  56. {
  57. messageReceived = null;
  58. OnMessageReception(messageReceived);
  59. }
  60. public CommandManagerStatus SendCommand(string cmd, out string answer, double timeout)
  61. {
  62. CommandManagerStatus status = CommandManagerStatus.AnswerReceived;
  63. answer = null;
  64. if (isBusy) status = CommandManagerStatus.Busy;
  65. else
  66. {
  67. isBusy = true;
  68. Client.Write(cmd);
  69. if (timeout > 0) // la commande attend un acquitement
  70. {
  71. waitForAcknowledge = true;
  72. waitTimer.Interval = timeout;
  73. waitTimer.Start();
  74. waitEvent.WaitOne();
  75. waitEvent.Reset(); // remise à zero pour une prochaine commande
  76. if (this.messageReceived == null) // timeout: connection au serveur defectueuse
  77. {
  78. status = CommandManagerStatus.Timeout;
  79. }
  80. }
  81. else isBusy = false;
  82. answer = this.messageReceived;
  83. this.messageReceived = null;
  84. }
  85. return status;
  86. }
  87. }
  88. }