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.

115 lines
2.4KB

  1. #ifndef TRIGGERSEQUENCER
  2. #define TRIGGERSEQUENCER
  3. class TriggerSequencer
  4. {
  5. public:
  6. enum EVT
  7. {
  8. TRIGGER,
  9. END
  10. };
  11. class Event
  12. {
  13. public:
  14. short int evt;
  15. short int delay;
  16. };
  17. // data is a buffer that will be bound to the sequencer, although it is "owned"
  18. // by the caller
  19. TriggerSequencer(const Event * data) : curEvent(data), trigger(false), delay(0)
  20. {
  21. reset(data);
  22. }
  23. // send one clock to the seq
  24. void clock();
  25. // reset by concatenating new data to seq
  26. // note that reset may generate a trigger
  27. void reset(const Event * data)
  28. {
  29. //printf("reset: initial delay = %d\n", delay);
  30. curEvent = data;
  31. delay += data->delay; // should this be += delay??
  32. //printf("after reset: delay = %d\n", delay);
  33. processClocks();
  34. }
  35. bool getTrigger() const
  36. {
  37. return trigger;
  38. } // get trigger state after last clock
  39. bool getEnd() const
  40. {
  41. return curEvent == 0;
  42. } // did sequencer end after last clock?
  43. // checks that a sequence is valid
  44. static bool isValid(const Event * data);
  45. private:
  46. const Event * curEvent;
  47. bool trigger;
  48. short delay;
  49. void processClocks();
  50. };
  51. inline void TriggerSequencer::clock()
  52. {
  53. --delay;
  54. processClocks();
  55. }
  56. inline void TriggerSequencer::processClocks()
  57. {
  58. trigger = false;
  59. //printf("enter proc clock, curevt =%p, delay = %d\n", curEvent, delay);
  60. if (!curEvent) {
  61. //printf("leave clock early - ended\n");
  62. return; // seq is stopped
  63. }
  64. while (delay < 0) {
  65. //printf("delay went to %d, evt=%d\n", delay, curEvent->evt);
  66. switch (curEvent->evt) {
  67. case END:
  68. //printf("setting end at 58\n");
  69. curEvent = 0; // stop seq by clering ptr
  70. return;
  71. case TRIGGER:
  72. trigger = true;
  73. ++curEvent; // and go to next one
  74. //printf("trigger set true\n");
  75. break;
  76. default:
  77. assert(false);
  78. }
  79. delay += curEvent->delay;
  80. }
  81. //printf("leave clock %d\n", delay);
  82. };
  83. inline bool TriggerSequencer::isValid(const Event * data)
  84. {
  85. while (data->evt != END) {
  86. assert(data->evt == TRIGGER);
  87. assert(data->delay >= 0);
  88. assert(data->delay < 2000); // just for now - we expect them to be small
  89. ++data;
  90. }
  91. return true;
  92. }
  93. #endif