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.

77 lines
1.3KB

  1. #pragma once
  2. #include "SchmidtTrigger.h"
  3. #include <assert.h>
  4. /**
  5. * Gate trigger if for processing gate and trigger inputs.
  6. * Features:
  7. * SchmidtTrigger on the input, to condition it.
  8. * Level sensor, for gate inputs.
  9. * Edge detector, for trigger inputs.
  10. */
  11. class GateTrigger
  12. {
  13. public:
  14. GateTrigger(bool wantResetLogic) :
  15. _gate(false),
  16. _trigger(false),
  17. _reset(wantResetLogic)
  18. {
  19. }
  20. /**
  21. * Clock in one input sample. Afterwards may query
  22. * gate() and trigger()
  23. */
  24. void go(float v)
  25. {
  26. const bool newGate = _sc.go(v);
  27. if (_reset) {
  28. if (newGate) // in reset state need to wait for low
  29. return;
  30. else
  31. _reset = false;
  32. }
  33. _trigger = newGate && !_gate;
  34. _gate = newGate;
  35. }
  36. void reset()
  37. {
  38. _gate = false;
  39. _trigger = false;
  40. _reset = true;
  41. }
  42. bool gate() const
  43. {
  44. return _gate;
  45. }
  46. bool trigger() const
  47. {
  48. return _trigger;
  49. }
  50. float thhi() const
  51. {
  52. return _sc.thhi();
  53. }
  54. float thlo() const
  55. {
  56. return _sc.thlo();
  57. }
  58. private:
  59. SchmidtTrigger _sc;
  60. bool _gate;
  61. bool _trigger;
  62. bool _reset; // just reset - gate must go low before high to trigger
  63. };