EnetTiming.Mod 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. MODULE EnetTiming;
  2. (**
  3. AUTHOR: Alexey Morozov, HighDim GmbH, 2015
  4. PURPOSE: Ethernet networking stack, timing utilities
  5. *)
  6. IMPORT
  7. EnetEnvironment;
  8. TYPE
  9. Time* = HUGEINT;
  10. (**
  11. Timer descriptor
  12. *)
  13. Timer* = RECORD
  14. startTime-: Time; (** starting time in timer counts *)
  15. interval-: Time; (** timer interval in timer counts *)
  16. expireTime-: Time; (** the time when timer will be expired *)
  17. isExpired-: BOOLEAN; (** TRUE if the timer is expired *)
  18. END;
  19. VAR
  20. getTimeCounter*: PROCEDURE(): Time; (** pluggable time counter (forward counting direction) *)
  21. fromMicro*: PROCEDURE(us: Time): Time; (** plugable converter from microseconds to time counts *)
  22. fromMilli*: PROCEDURE(ms: Time): Time; (** plugable converter from milliseconds to time counts *)
  23. (**
  24. Set timer counting interval in microseconds
  25. *)
  26. PROCEDURE SetTimerMicro*(VAR timer: Timer; us: Time);
  27. BEGIN
  28. timer.interval := fromMicro(us);
  29. timer.isExpired := TRUE;
  30. END SetTimerMicro;
  31. (**
  32. Set timer counting interval in milliseconds
  33. *)
  34. PROCEDURE SetTimerMilli*(VAR timer: Timer; ms: Time);
  35. BEGIN
  36. timer.interval := fromMilli(ms);
  37. timer.isExpired := TRUE;
  38. END SetTimerMilli;
  39. (**
  40. Start a timer
  41. *)
  42. PROCEDURE StartTimer*(VAR timer: Timer);
  43. BEGIN
  44. timer.startTime := getTimeCounter();
  45. timer.expireTime := timer.startTime + timer.interval;
  46. timer.isExpired := FALSE;
  47. END StartTimer;
  48. (**
  49. Stop a timer
  50. *)
  51. PROCEDURE StopTimer*(VAR timer: Timer);
  52. BEGIN
  53. timer.isExpired := TRUE;
  54. END StopTimer;
  55. (** Returns TRUE if a given timer is expired *)
  56. PROCEDURE IsTimerExpired*(VAR timer: Timer): BOOLEAN;
  57. BEGIN
  58. IF ~timer.isExpired THEN
  59. timer.isExpired := getTimeCounter() - timer.expireTime >= 0;
  60. RETURN timer.isExpired;
  61. ELSE RETURN TRUE;
  62. END;
  63. END IsTimerExpired;
  64. (** Wait a specified number of microseconds *)
  65. PROCEDURE WaitMicro*(us: Time);
  66. VAR t: Time;
  67. BEGIN
  68. t := getTimeCounter() + fromMicro(us);
  69. WHILE getTimeCounter() - t < 0 DO END;
  70. END WaitMicro;
  71. (** Wait a specified number of milliseconds *)
  72. PROCEDURE WaitMilli*(ms: Time);
  73. VAR t: Time;
  74. BEGIN
  75. t := getTimeCounter() + fromMilli(ms);
  76. WHILE getTimeCounter() - t < 0 DO END;
  77. END WaitMilli;
  78. BEGIN
  79. getTimeCounter := EnetEnvironment.GetTimeCounter;
  80. fromMicro := EnetEnvironment.FromMicro;
  81. fromMilli := EnetEnvironment.FromMilli;
  82. END EnetTiming.